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로 실행되고있을 때, 더 하드 폴트가 발생하지 않습니다. 왜? 나는 다른 것이 있다고 생각하지 않는다.
Dan 씨, 문제가 있음을 발견했습니다. OSTCBCur-> OSTCBDly = ticks;/* TCB 에서 틱을로드합니다. func OSTimeDly(); 전에 OSStart(), OSTCBCur NULL, 그래서 OSTCDur() 내 에서이 진술을 삭제하면 오류가 발생합니다. 어쨌든 고마워, . – Edward
@ 에드워드 - 오, 안돼! 운영 체제 코드에서 올바른 코드 행을 삭제했습니다. 당신은 단단한 결함을 제거했지만 실제로 문제를 해결하지는 않았습니다. OSTimeDly()에 대한 호출이 더 이상 작동하지 않는다는 것을 곧 깨닫게 될 것이라고 생각합니다. 문제가 해결 된 것은 해결책입니다. – Dan
그 코드 줄을 삭제해서는 안된다는 것을 알고 있습니다. 여기에서는 OSStart() 전에 OSTimeDly()에서 하드 폴트가 발생한 이유에 대해 이야기합니다. 단지 궁금합니다.^_ ^ – Edward