freertos vTaskDelay卡死

解决使用vTaskDelay导致任务卡死的问题
在使用动态方法创建任务后,调用vTaskDelay会导致任务卡死,但定时器工作正常。问题在于SDK移植可能影响了任务的执行。将任务创建改在main方法中能解决这个问题,表明问题可能与nuvoton库的SDK实现有关。

在开始任务中使用动态方法创建任务后,在任务中调用vTaskDelay卡死,然后排查问题,定时器工作正常,如果不使用vTaskDelay也可以一直运行。

        解决办法,改成在main方法中创建任务,调用vTaskDelay工作正常,我用的是nuvoton的库,所以可能与sdk移植有关系,反正问题就是这么解决的,希望能帮到同路者。

### 任务调度机制 FreeRTOS 是一个轻量级的实时操作系统,广泛应用于嵌入式系统中,其任务调度机制是系统的核心部分。任务调度的实现主要依赖于定时器中断、任务状态管理、优先级调度以及任务切换等机制。 ### 任务创建与调度器初始化 在 FreeRTOS 中,任务的创建过程是通过 `xTaskCreate` 函数完成的。在任务创建时,系统会为每个任务分配一个任务控制块(TCB),并根据任务的优先级将其插入到相应的就绪链表中。在调度器启动之前,系统会确保 `pxCurrentTCB` 指向当前所有已创建任务中优先级最高的任务,但此时任务尚未开始运行[^2]。 当初始化完成后,调用 `vTaskStartScheduler` 函数启动任务调度器。该函数负责初始化调度器相关的数据结构,并启动系统时钟中断,从而开始任务调度[^2]。 ### 任务状态与优先级调度 FreeRTOS 支持硬实时调度,每个任务都有一个优先级,系统根据优先级决定哪个任务应该运行。FreeRTOS 采用基于优先级的抢占式调度算法,即高优先级任务可以抢占低优先级任务的 CPU 资源。 任务的状态包括运行态、就绪态、阻塞态和挂起态。在调度过程中,系统会根据任务的状态决定是否进行任务切换。例如,当一个任务进入阻塞状态(如等待某个事件或资源),调度器会选择下一个优先级最高的就绪任务运行[^1]。 ### 任务切换机制 任务切换是通过中断服务程序(如系统滴答定时器中断)触发的。系统滴答定时器中断服务函数 `xPortSysTickHandler` 负责更新系统时间,并调用 `xTaskIncrementTick` 函数判断是否需要进行任务切换。如果发现有更高优先级的任务就绪,或者当前任务的时间片已用完,则会触发 PendSV 中断,进而执行任务切换[^4]。 任务切换过程中,系统会保存当前任务的上下文(如寄存器状态),然后加载下一个任务的上下文,使新任务得以继续执行。这一过程通过 `portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT` 触发 PendSV 中断实现。 ### 任务调度器的核心函数 FreeRTOS 提供了一些核心函数来管理任务调度。例如,`listGET_OWNER_OF_NEXT_ENTRY` 宏用于获取当前最高优先级任务的任务控制块。该宏通过遍历任务链表,找到下一个要运行的任务,并将其赋值给 `pxTCB` 变量[^5]。 此外,FreeRTOS 还提供了多种调度策略,如优先级继承、时间片轮转等,以满足不同的应用场景。例如,在优先级继承机制中,如果一个低优先级任务持有某个资源,而一个高优先级任务正在等待该资源,则低优先级任务的优先级会被临时提升,以减少优先级反转带来的问题。 ### 任务调度的实现示例 以下是一个简单的任务调度实现示例: ```c void vTaskFunction(void *pvParameters) { for (;;) { // 任务执行代码 vTaskDelay(pdMS_TO_TICKS(1000)); // 延迟1秒 } } int main(void) { // 创建任务 xTaskCreate(vTaskFunction, "Task1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); // 启动调度器 vTaskStartScheduler(); // 如果调度器启动失败,程序不会执行到这里 for (;;); } ``` 在这个示例中,`vTaskFunction` 是一个简单的任务函数,它会无限循环执行,并在每次循环中延迟 1 秒。`xTaskCreate` 函数用于创建任务,并指定任务的优先级为 `tskIDLE_PRIORITY + 1`。最后,调用 `vTaskStartScheduler` 启动任务调度器,开始任务调度。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值