完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位大佬,新手刚学习FreeRTOS,现在想在中断中挂起某个任务,我在教程里看到说有中断中的恢复函数xTaskResumeFromISR,但是没有在中断中的挂起函数,我搜了一下,有人说直接用vTaskSuspend就行,我在中断中就直接用了,结果确实不行,停在了下图中的位置,请问一下,vTaskSuspend确实不能在中断中用么?那如果我想在中断中挂起某个任务,应该怎么操作呢?多谢。
|
|
相关推荐
1个回答
|
|
在FreeRTOS中,不能直接在中断服务程序(ISR)中使用vTaskSuspend来挂起任务。这是因为vTaskSuspend函数可能会引起任务管理器的不稳定,例如中断可能导致任务被挂起但无法恢复,或者出现死锁等问题。
FreeRTOS提供了xTaskResumeFromISR函数用于在中断中恢复任务,但没有提供在中断中挂起任务的函数。所以在中断中挂起任务的正确方法是使用xTaskNotifyFromISR函数来通知任务挂起。 以下是一个示例代码,展示了如何在中断中挂起任务: // 创建一个二值信号量 SemaphoreHandle_t xSemaphore; // 任务代码 void vTaskFunction(void *pvParameters) { while(1) { // 等待信号量 xSemaphoreTake(xSemaphore, portMAX_DELAY); // 执行任务代码 // ... } } // 中断服务程序代码 void vInterruptHandler() { BaseType_t xHigherPriorityTaskWoken = pdFALSE; // 通过信号量挂起任务 xSemaphoreGiveFromISR(xSemaphore, &xHigherPriorityTaskWoken); // 清除中断标志位 // ... // 如果有更高优先级的任务等待执行,则请求上下文切换 portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } // 主函数 int main() { // 创建二值信号量 xSemaphore = xSemaphoreCreateBinary(); // 创建任务 xTaskCreate(vTaskFunction, "Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL); // 注册中断服务程序 // ... // 启动任务调度器 vTaskStartScheduler(); while(1); return 0; } 上面的代码中,通过xSemaphoreGiveFromISR函数在中断服务程序中给任务发送信号量,任务通过xSemaphoreTake函数来挂起等待信号量。注意在中断服务程序最后调用portYIELD_FROM_ISR函数,用于请求上下文切换,以确保如果有更高优先级的任务需要立即执行。 希望这可以帮助到你! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1618 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1545 浏览 1 评论
979 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1597 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 13:05 , Processed in 0.853563 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号