2016-12-02 359 views
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發生。爲什麼?我認爲沒有什麼不同。

回答

1

在您啓動操作系統之前,您正在調用OSTimeDly()

如果要延遲/暫停/開始之前的OS(通過OSStart())等等,你將不得不使用「虛擬環路」有揮發性,或使用硬件定時器(更好)等

+0

謝謝丹,我發現問題是這樣的 OSTCBCur-> OSTCBDly = ticks;/*在func OSTimeDly()中載入TCB 中的tick。 OSStart()之前的 ,OSTCBCur爲NULL,因此賦值OSTCBCur將會出錯。所以如果我在OSTimeDly()中刪除了這個語句,將不會發生硬錯誤。 反正謝謝你。 – Edward

+0

@愛德華 - 哦,不!您從操作系統代碼中刪除了正確的,有效的代碼行。你消除了嚴重的錯誤,但你沒有真正解決這個問題。我認爲你很快就會意識到,現在對OSTimeDly()的調用不再有效,我指出的修復方案是解決您的問題的正確方法。 – Dan

+0

我知道這行代碼不應該被刪除。在這裏,我只是談論爲什麼在OSStart()之前的OSTimeDly()中發生了hardfault,我只是好奇而已。^_ ^ – Edward

相關問題