2016-12-02 11 views
0

매우 이상합니다.OS_EXIT_CRITICAL()을 호출하면 STM32가 HardFault로 실행됩니다.

OSTimeDly에서
OSInit(); 
OSTimeDly(10); 
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[TASK_STK_SIZE-1],START_TASK_PRIO); 
OSStart(); 

(10), OS_ENTER_CRITICAL()와 OS_EXIT_CRITICAL()가, 그리고 코드) (OS_EXIT_CRITICAL로 실행되고있을 때, 하드 폴트가 발생합니다. 나는이에 코드를 변경하는 경우

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로 실행되고있을 때, 더 하드 폴트가 발생하지 않습니다. 왜? 나는 다른 것이 있다고 생각하지 않는다.

답변

1

운영 체제를 시작하기 전에 OSTimeDly()으로 전화하십시오. 등, 당신이// 일시 정지를 지연 (OSStart()를 통해) OS를 시작하기 전에 대기 할 경우

, 당신은 휘발성으로 "더미 루프"를 사용해야합니다, 또는 (더 나은) 하드웨어 타이머를 사용

+0

Dan 씨, 문제가 있음을 발견했습니다. OSTCBCur-> OSTCBDly = ticks;/* TCB 에서 틱을로드합니다. func OSTimeDly(); 전에 OSStart(), OSTCBCur NULL, 그래서 OSTCDur() 내 에서이 진술을 삭제하면 오류가 발생합니다. 어쨌든 고마워, . – Edward

+0

@ 에드워드 - 오, 안돼! 운영 체제 코드에서 올바른 코드 행을 삭제했습니다. 당신은 단단한 결함을 제거했지만 실제로 문제를 해결하지는 않았습니다. OSTimeDly()에 대한 호출이 더 이상 작동하지 않는다는 것을 곧 깨닫게 될 것이라고 생각합니다. 문제가 해결 된 것은 해결책입니다. – Dan

+0

그 코드 줄을 삭제해서는 안된다는 것을 알고 있습니다. 여기에서는 OSStart() 전에 OSTimeDly()에서 하드 폴트가 발생한 이유에 대해 이야기합니다. 단지 궁금합니다.^_ ^ – Edward