2012年7月29日日曜日

mbed-rtosを使ってみる

スタックの扱いが気になるのでちょっと調べてみた。

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 件のコメント: