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