FreeRTOS任务创建后没有任务调度也没有任务切换却立即执行该任务

原创
10/18 23:08
阅读数 0

    使用xTaskCreate()创建任务时,会给该任务分配任务栈空间以及TCB控制块并初始化,随后挂载到就绪链表中。在此函数中还会开启PendSV异常中断,在该中断服务函数中,会寻找当前就绪链表中优先级最高的任务,并将PSP指针指向该任务的栈空间。当退出中断后即会立即跳转到该任务栈空间处执行。
    (注:在cortex-M系列内核中,有R0~R15共16个寄存器,其中R0~R12为通用寄存器,用户可使用,R13是堆栈指针SP(有两个指针:MSP主栈指针,PSP影子栈指针。程序正常运行使用PSP指针,触发系统异常或中断使用MSP指针),R14程序链接寄存器LR,R15程序计数器PC)
    在PendSV异常中使用的是MSP指针,此时若将PSP指向其他任务的栈地址,在退出异常中断后则会立即跳转到该任务执行。
    
    PS:解决办法:在任务创建前开启临界区,在任务创建后关闭临界区即可。(注:临界区的主要作用为屏蔽所有中断,防止临界区中间代码被中断影响。)

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部