のねのBlog

パソコンの問題や、ソフトウェアの開発で起きた問題など書いていきます。よろしくお願いします^^。

タスクのスタックサイズをわざと、小さくしたとき

Stackをわざと、必要な容量より小さい、128に設定して動作させてみた。 myTask01のスタック領域が壊れている。 HardFaultになった。

Sta

f:id:none53:20190717062945p:plain
Stack破壊のときの例

f:id:none53:20190717063349p:plain
必要な容量

タイマタスクのスタックサイズが200のとき、myTask01のTCBが壊れている。

f:id:none53:20190717064506p:plain
mytask01のスタックが壊れている

myTask01,myTask02のスタックサイズは64にしてある。 myTask02が、myTask01のスタックを壊しているみたいだ。

f:id:none53:20190717064839p:plain
初期化時

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
}

f:id:none53:20190718034825p:plain
Build Analyzerの表示