スタックの扱いが気になるのでちょっと調べてみた。
rtos-stack.cpp
スレッド作成時にスタックのサイズとスタック領域は設定できる。
Thread.h
Thread(void (*task)(void const *argument), void *argument=NULL,
osPriority priority=osPriorityNormal,
uint32_t stack_size=DEFAULT_STACK_SIZE,
unsigned char *stack_pointer=NULL);
DEFAULT_STACK_SIZEは2,048バイト。
最小サイズは64バイト、32ビットレジスタ16本分。
使っていなければUSBやイーサーネットのメモリ領域も使える。
uint8_t stack_area[2048] __attribute((section("AHBSRAM0"),aligned));
スタックオーバーフローはチェックしている。
rx_System.c
__weak void rt_stk_check (void)
スタックポインタがスタックエリアから外れていないか、
スタックエリアの先頭にMAGIC_WORDを書き込んで壊れているかをチェックしている。
しかしながら、スタックオーバーフローの時は、
void os_error (uint32_t err_code)が呼ばれてmbedが停止するだけなので、
どのスレッドでスタックオーバーフローが発生したのかを知りたければ OS_TSK os_tsk をたどればよさそう。
【追加8/7】
int main() から実行するメインスレッドではスタックオーバーフローはチェックしていない。
メインスレッドは_init_main()で設定している。プライオリティはosPriorityNormalです。
メインスレッドかの判断は P-TCB->task_id が0x01でみている。
(2012/7/29)
---
0 件のコメント:
コメントを投稿