最近用STM32CubeIDE配置FreeRTOS的时候发现:osPriorityRealtime级别的任务创建之后在内核启动(调用函数osKernelStart())前不能被终止,否则会导致HardFault异常中断。至于在内核启动后能不能终止任务我没有试。我的操作是在函数void MX_FREERTOS_Init(void)中创建任务REMOTE_CMDHandle,在MX_FREERTOS_Init函数返回前调用了osThreadTerminate(REMOTE_CMDHandle);并且将任务句柄清空REMOTE_CMDHandle = NULL;我这么做的初衷是REMOTE_CMDHandle任务上电不让它运行,等待用户操作后再创建运行。由于使用STM32CubeIDE图形化创建任务后默认都会上电运行,所以在创建后加了一句任务终止以达到我不可告人的目的。
debug跟踪发现具体原因是在堆栈初始化函数pxPortInitialiseStack返回时进入prvIdleTask函数->prvCheckTasksWaitingTermination()->( void ) uxListRemove( &( pxTCB->xStateListItem ) )运行到“if( pxList->pxIndex == pxItemToRemove )”时出现非法地址0xfffffffd触发HardFault_Handler()异常中断,最后的解决办法是将优先级设置为osPriorityHigh成功解决,要深究具体原因还需要各位大神们指点迷津。
本帖最后由 shipeng 于 2024-3-23 16:02 编辑
意思是想开机时,先停止GUI任务创建的线程?
引用: wangerxian 发表于 2024-3-25 15:17 意思是想开机时,先停止GUI任务创建的线程?
是的,主要是上电不让这个任务运行,或者我的本意是上电时并不想创建某个任务,但是STM32CubeIDE好像没有这个选项,只要你在.ioc文件中新增了某个任务那么这个任务默认就在FRERTOS_Init()函数中被创建了你没得选。当然你也可以选择全手动创建这个任务就没有这个问题了,但我却没有这么干因此遇到了问题,发出来希望能帮助到有缘人
引用: shipeng 发表于 2024-3-25 20:08 是的,主要是上电不让这个任务运行,或者我的本意是上电时并不想创建某个任务,但是STM32CubeIDE好像没有 ...
手动处理啊。把这部分代码摘出来。