0
這很奇怪。當調用OS_EXIT_CRITICAL()時,STM32會碰到HardFault
OSInit();
OSTimeDly(10);
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[TASK_STK_SIZE-1],START_TASK_PRIO);
OSStart();
在OSTimeDly(10),有OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),並且當代碼運行到OS_EXIT_CRITICAL(),HardFault會發生。
void OSTimeDly (INT32U ticks)
{
INT8U y;
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
return;
}
if (OSLockNesting > 0u) { /* See if called with scheduler locked */
return;
}
if (ticks > 0u) { /* 0 means no delay! */
OS_ENTER_CRITICAL();
y = OSTCBCur->OSTCBY; /* Delay current task */
OSRdyTbl[y] &= (OS_PRIO)~OSTCBCur->OSTCBBitX;
if (OSRdyTbl[y] == 0u) {
OSRdyGrp &= (OS_PRIO)~OSTCBCur->OSTCBBitY;
}
OSTCBCur->OSTCBDly = ticks; /* Load ticks in TCB */
OS_EXIT_CRITICAL();
OS_Sched(); /* Find next task to run! */
}
}
但是,如果我更改代碼這樣:
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
INT8U y;
...
OSInit();
OS_ENTER_CRITICAL();
y = OSTCBCur->OSTCBY; /* Delay current task */
OSRdyTbl[y] &= (OS_PRIO)~OSTCBCur->OSTCBBitX;
if (OSRdyTbl[y] == 0u) {
OSRdyGrp &= (OS_PRIO)~OSTCBCur->OSTCBBitY;
}
OS_EXIT_CRITICAL();
//OSTimeDly(10);
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[TASK_STK_SIZE-1],START_TASK_PRIO);
OSStart();
另外還有OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),但是,當代碼運行到OS_EXIT_CRITICAL(),沒有HardFault發生。爲什麼?我認爲沒有什麼不同。
謝謝丹,我發現問題是這樣的 OSTCBCur-> OSTCBDly = ticks;/*在func OSTimeDly()中載入TCB 中的tick。 OSStart()之前的 ,OSTCBCur爲NULL,因此賦值OSTCBCur將會出錯。所以如果我在OSTimeDly()中刪除了這個語句,將不會發生硬錯誤。 反正謝謝你。 – Edward
@愛德華 - 哦,不!您從操作系統代碼中刪除了正確的,有效的代碼行。你消除了嚴重的錯誤,但你沒有真正解決這個問題。我認爲你很快就會意識到,現在對OSTimeDly()的調用不再有效,我指出的修復方案是解決您的問題的正確方法。 – Dan
我知道這行代碼不應該被刪除。在這裏,我只是談論爲什麼在OSStart()之前的OSTimeDly()中發生了hardfault,我只是好奇而已。^_ ^ – Edward