listCURRENT_LIST_LENGTH のところから、抜けない
#if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) { if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ) { taskYIELD(); } else { mtCOVERAGE_TEST_MARKER(); } } #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */
タスクのスタックサイズをわざと、小さくしたとき
Stackをわざと、必要な容量より小さい、128に設定して動作させてみた。 myTask01のスタック領域が壊れている。 HardFaultになった。
Sta
タイマタスクのスタックサイズが200のとき、myTask01のTCBが壊れている。
myTask01,myTask02のスタックサイズは64にしてある。 myTask02が、myTask01のスタックを壊しているみたいだ。
STM32CubeIde HardFault その18 Stackの最後の位置+1に書き込めるようにしてみる。
STM32F429ZITX_FLASH.ld
STACKの最後に+1した領域に、値を書きにいっているため、HardFaultになっているのでは?と思った。
リンカのファイルを以下のように変更して、最後の位置+1に書き込んでも問題ないようにしてみた。 すると、HardFaultがでなくなった。
/* Highest address of the user mode stack */ /*_estack = 0x20030000;*/ /* end of "RAM" Ram type memory */ _estack = 0x20020000; /* end of "RAM" Ram type memory */ _Min_Heap_Size = 0x100 ; /* required amount of heap */ _Min_Stack_Size = 0x100 ; /* required amount of stack */ /* Memories definition */ MEMORY { FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K CCMRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 64K /* RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 192K */ RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K }
こうすると、1KByte無駄にするだけですむ。
/* Highest address of the user mode stack */ /*_estack = 0x20030000;*/ /* end of "RAM" Ram type memory */ /*_estack = 0x20020000;*/ /* end of "RAM" Ram type memory */ _estack = 0x2002FC00; /* end of "RAM" Ram type memory */ _Min_Heap_Size = 0x100 ; /* required amount of heap */ _Min_Stack_Size = 0x100 ; /* required amount of stack */ /* Memories definition */ MEMORY { FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K CCMRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 64K /* RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 192K */ /* RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K*/ RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 191K }