ラベル rtos の投稿を表示しています。 すべての投稿を表示
ラベル rtos の投稿を表示しています。 すべての投稿を表示

2013年1月26日土曜日

mbed-rtosのmailを使う

BaseUsbHostを更新したので、BaseUsbHost_examleのライブラリ更新のついでにプログラムを修正しました。
キャプチャーした画像をUSBに保存するだけのサンプルプログラムです。

キャプチャーしているスレッドの中でファイル保存しているので、
保存している時間が長くなってアイソクロナス転送の受信が止まって転送エラーが発生していました。
main.cpp
現在の設定ではITD内のフレームカウンタを4、ITDの最大キュー数を3にしているので12ms(4*3)以内にキャプチャースレッドの受信処理が間に合わないといけない。フレームカウンタは最大8個、キュー数をもっと増やせばいいかもしれないがメモリーを消費したくない。

今回の修正ではキャプチャーしているスレッドから画像データをrtosのmailで、
main()メインスレッド送るようにして、メインスレッドでファイルに保存するようにしてみました。
main.cpp
コンディションコードやパケットステータスコードを見てもエラーは発生していないようです。
ファイル処理をしてないのでスタックの使用量は大きく減りました。
FATFileSystemが呼ばれると1800バイト以上消費します。
もちろん、代わりにメインスレッドのスタックの消費量は増えますが、メインスレッドはスタックのサイズ制限はありません。

rtosのサンプルプログラムrtos_mail - main.cppとほぼ同じように使っています。
allocでメモリーブロックからの切り出しではデータの有無を確認しています。

(2013/1/26)
---

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)
---