shipeng 发表于 2024-3-23 15:49

osPriorityRealtime任务不能被终止

本帖最后由 shipeng 于 2024-3-23 16:02 编辑

<p>最近用STM32CubeIDE配置FreeRTOS的时候发现:osPriorityRealtime级别的任务创建之后在内核启动(调用函数osKernelStart())前不能被终止,否则会导致HardFault异常中断。至于在内核启动后能不能终止任务我没有试。我的操作是在函数void MX_FREERTOS_Init(void)中创建任务REMOTE_CMDHandle,在MX_FREERTOS_Init函数返回前调用了osThreadTerminate(REMOTE_CMDHandle);并且将任务句柄清空REMOTE_CMDHandle = NULL;我这么做的初衷是REMOTE_CMDHandle任务上电不让它运行,等待用户操作后再创建运行。由于使用STM32CubeIDE图形化创建任务后默认都会上电运行,所以在创建后加了一句任务终止以达到我不可告人的目的。</p>

<p> &nbsp;&nbsp;&nbsp;</p>

<p>debug跟踪发现具体原因是在堆栈初始化函数pxPortInitialiseStack返回时进入prvIdleTask函数-&gt;prvCheckTasksWaitingTermination()-&gt;( void ) uxListRemove( &amp;( pxTCB-&gt;xStateListItem ) )运行到&ldquo;if( pxList-&gt;pxIndex == pxItemToRemove )&rdquo;时出现非法地址0xfffffffd触发HardFault_Handler()异常中断,最后的解决办法是将优先级设置为osPriorityHigh成功解决,要深究具体原因还需要各位大神们指点迷津。</p>

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

wangerxian 发表于 2024-3-25 15:17

<p>意思是想开机时,先停止GUI任务创建的线程?</p>

shipeng 发表于 2024-3-25 20:08

wangerxian 发表于 2024-3-25 15:17
意思是想开机时,先停止GUI任务创建的线程?

<p>是的,主要是上电不让这个任务运行,或者我的本意是上电时并不想创建某个任务,但是STM32CubeIDE好像没有这个选项,只要你在.ioc文件中新增了某个任务那么这个任务默认就在FRERTOS_Init()函数中被创建了你没得选。当然你也可以选择全手动创建这个任务就没有这个问题了,但我却没有这么干因此遇到了问题,发出来希望能帮助到有缘人</p>

freebsder 发表于 2024-3-26 15:42

shipeng 发表于 2024-3-25 20:08
是的,主要是上电不让这个任务运行,或者我的本意是上电时并不想创建某个任务,但是STM32CubeIDE好像没有 ...

<p>手动处理啊。把这部分代码摘出来。</p>
页: [1]
查看完整版本: osPriorityRealtime任务不能被终止