ST意法半导体
直播中

王婷

7年用户 1019经验值
私信 关注
[问答]

FreeRTOS在创建新任务时禁用中断会有何影响

像这样创建一个新的 Freertos 任务时:
  • osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
  • prvAddNewTaskToReadyList(...)
将被调用并使用
  • taskENTER_CRItiCAL()
禁用中断。这分解为调用 void vPortEnterCritical(void)
  • void vPortEnterCritical( void )
这会将 uxCriticalNesting 增加一。
离开前
  • void vPortExitCritical()
叫做。如果 uxCriticalNesting == 0,此函数应减少 uxCriticalNesting 并重新激活中断。
然而,uxCriticalNesting 之前是用 0xaaaaaaaa 初始化的。所以 uxCriticalNesting == 0 没有达到。
后来的电话  
  • osKernelStart();
最后将 uxCriticalNesting 设置为 0 并重新激活所有中断。
这会导致在第一个任务创建和内核启动之间停用中断,这会产生不良副作用,例如停止 systick 计时器,从而导致 HAL_Delay() 函数损坏。


回帖(1)

朱佳婧

2022-12-22 14:27:53
这是 FreeRTOS维护者有意为之。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分