FreeRTOS常见错误排查

FreeRTOS常见错误排查
FreeRTOS常见错误排查
1,栈溢出问题
柔毛水杨梅每个TASK(任务)都有着⾃⼰独⽴维护的栈空间,⽽栈空间在任务被创建时就已经设定,任务当前使⽤栈空间⼤⼩对于开发者来说⾄关重要。在RTOS中提供了多种跟踪辅助调试栈相关问题的⼯具。
1,栈空间⾼⽔线函数
⾼⽔线通常被⽤在检测河流⽔位⾼度场景,⾼⽔线具有预警指⽰旱涝⾃然灾害发⽣可能性。同理,本节介绍的⾼⽔位函数同样能提供开发者参考的栈使⽤“⽔位”预警信息。
unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask );
**传⼊参数xTask:**被查询任务的句柄----API 函数xTaskCreate()的参数pxCreatedTask
**函数返回值:**xTask从执⾏开始的运⾏历史中,栈空间最⼩余量,也就是该任务能使⽤栈空间的最长深度,这个值接近0时候,表明改任务离溢出不远了。
土豆炮点火装置
2,栈溢出检测参数调⽤钩⼦函数
HOOK(钩⼦)函数可以说是操作系统必有的⼀类函数,像Windows、Linux以及我前⾯讲述过的UCOS嵌⼊式实时操作系统都有这类钩⼦函数。是操作系统消息处理机制的程序段,通过系统调⽤,把它挂⼊系统。本节关注的是栈溢出钩⼦函数,具体介绍参考以下内容。
杨木皮子
configCHECK_FOR_STACK_OVERFLOW
赋值1情况下:内核会在任务交换的时刻,任务的上下⽂在栈内全部保存完成后,检测栈指针指向是否超出了任务栈有效范围,溢出则钩⼦函数会被调⽤;
赋值2情况下:此⽅法在1上进⾏些许改进。当任务被创建后,任务栈空间被预置⼀个标记,通过这个标记是否被覆盖掉来判断是否发⽣了数据溢出事件。通常是使⽤栈内最后20字节来储存标记数据,不断检测这20字节内容来判断栈空间使⽤是否超出预期。
##2,其他常见错误##
###1,在TaskA中创建⼀个TaskB
任务在创建的时候就需要在内存堆中分配空间,许多Task在定义堆空间的时候可能就只够当前任务所有信息保存。
若开发者在不明⽩当前任务堆空间使⽤状态下,强⾏创建新任务,或者⼀些队列和信号量,这样⽆疑会导致溢出或者TaskA任务⽆法被创建。
此外,vTaskStartScheduler()被调⽤是他还会⾃动⽣成⼀个空闲任务,这个任务具有最⼩优先级。如在调⽤调度器时发⽣上述堆内存分配过⼩,此时空闲任务⽆法被创建,TaskA任务创建失败。所以,在调⽤vTaskStartScheduler()后加上⼀条空循环[for(;?]可以使这种错误更加容易调试。
###2,在中断中调⽤OS的危险API函数###
除了具有后缀为“FromISR”函数名的API函数,千万不要在中断服务程序中调⽤其他API。
###3,中断函数出现崩溃###丝锥磨床
纱窗角码① 检查中断程序是否发⽣溢出。
② 中断服务程序语法书写是否正确,具体可能由宏使⽤,接⼝传值。
③ 中断若存在优先级,最好从最⾼优先级中断开始盘查。
###4,启动第⼀个任务后,调度器就崩溃了###
在第⼀个任务就崩溃,可能与两个地⽅有关:1 第⼀个任务内存分配过⼩,解决⽅案见上。2 调度器⾃⾝设置存在问题,如在ARM7使⽤调度器前,需要将调度器设定为管理模式(Supervisor mode),排查某些不能启动调度器的设置参数。
###5,调度器在挂载下调⽤OS的API###
RTOS分别提供了vTaskSuspendAll()和xTaskResumeAll()两个接⼝来使得调度器挂起和唤醒。所以在Pend期间千万不⽤尝试调⽤其他API。
###6,在调度器启动前程序就崩溃了###
同调度器挂起⼀样,在调度器未调⽤启动前就调⽤其他API,这样可能对导致程序崩溃。同时如果在中断中需要上下⽂切换操作的(读写队列或者信号量),那么这个中断在调度器启动前不能使能!
<27.tv调度器在启动前依然可以使⽤创建任务,队列和信号量的API。

本文发布于:2024-09-21 22:18:30,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/154790.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:任务   空间   调度   是否
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议