You are viewing an older revision! See the latest version
knowhow database
[OS]スレッドの総スタックサイズ調整方法¶
Cortex-A9 CMSIS-RTOS RTXの、スレッドの総スタックサイズ調整方法を説明します。
現在の設定では、スレッドの総スタックサイズを32Kbyte確保しています。
過去実績からすると調整なしでお使い頂けると思います。
ただし、調整が必要なケースがありますので、以下をご参照ください。
調整が必要なケース
以下の現象が発生した場合、スレッドの総スタックサイズを調整する必要があります。
- スレッドの生成に失敗する
osThreadCreate()戻り値がNULLの場合、スレッドの生成に失敗しています。
スレッドの総スタックサイズ不足が原因の可能性があります。
この場合、スレッドの総スタックサイズを増加させる必要があります。
- RAMが不足し、スタックサイズを削りたい
現在のmbed-rtosの設定では、スレッドの総スタックサイズ = 32KBとしています。
システムとしてRAMが不足し、スタックサイズを減らしたい場合はスレッドの総スタックサイズを調整します。
- スレッドのスタックオーバーフロー
スレッド実行中にOS内でエラーが発生した場合、os_error()⇒mbed_die()がコールされます。
以下のマクロを1にすることで、LED1~LED4が点滅し、エラー発生を確認できます。
<<code title = (mbed-src Top)\libraries\mbed\targets\hal\TARGET_RENESAS\TARGET_RZ_A1H\device.h 64行目>>
- define DEVICE_ERROR_PATTERN 0
⇒ #define DEVICE_ERROR_PATTERN 1
<</code>>
上記現象が発生した場合、スレッドがスタックオーバーフローを起こした可能性があります。
この場合、osThreadDef()にて指定したスタックサイズを増加させ、現象が改善するか確認ください。
増加させたスタックサイズに合わせて、総スタックサイズも調整する必要があります。
- 調整方法
- 調整対象マクロ
調整対象となるスレッドの総スタックサイズは、
OSのコンフィギュレータファイルにマクロで定義されています。
スレッドの総スタックサイズを調整する場合は、下記マクロの設定値を修正します。
- 調整方法
- define DEVICE_ERROR_PATTERN 0
⇒ #define DEVICE_ERROR_PATTERN 1
<</code>>
(mbed-rtos Top)\rtos\rtx\TARGET_CORTEX_A\RTX_Conf_CA.c 78行目
#define OS_PRIVSTKSIZE 8192
Cortex-A9 CMSIS-RTOS RTXでは、ワード単位でスタックサイズを確保する仕様のため、
スレッドの総スタックサイズは OS_PRIVSTKSIZE を4倍したサイズが確保されます。
上記の場合、総スタックサイズは、
総スタックサイズ = OS_PRIVSTKSIZE * 4 = 8192 * 4 = 32Kbyte
となります。
総スレッド数と総スタックサイズの関係
総スレッド数を調整する場合は、OS_PRIVCNTマクロの設定値を修正します。
総スレッド数、および総スタックサイズを以下で定義した場合、
設定例
#define OS_PRIVCNT 10 #define OS_PRIVSTKSIZE 10240
(※2015/1/12時点のmbed-rtosでは、それぞれ
#define OS_PRIVCNT 8
#define OS_PRIVSTKSIZE 8192
となっていますが、ここでは値を変更して説明します。)
総スタックサイズは、
総スタックサイズ = OS_PRIVSTKSIZE * 4 = 10240 * 4 = 40Kbyte
となります。
上記総スタックサイズ 40Kbyte を、OS_PRIVCNTにて定義したスレッド数で分け合います。
目安として、1スレッドあたりの平均スタックサイズは、以下のように見積もれます。
総スタックサイズ / OS_PRIVCNT = 40Kbyte / 10 = 4Kbyte
各スレッドのスタックサイズの内訳はユーザが自由に設定できます。
具体的にはソースコード上で、osThreadDef()を定義した際、第三引数でスレッドのスタックサイズを指定します。
スレッドのスタックサイズの指定
osThreadDef(sample_thread, osPriorityNormal, 1024); ^^^^
例えば、以下のように10スレッドのスタックを設定することもできます。
Thread 1: 1 Kbyte
Thread 2: 1 Kbyte
Thread 3: 2 Kbyte
Thread 4: 5 Kbyte
Thread 5: 10 Kbyte
Thread 6: 10 Kbyte
Thread 7: 1 Kbyte
Thread 8: 3 Kbyte
Thread 9: 2 Kbyte
Thread 10: 5 Kbyte
――――――――――
合計 40 Kbyte
今後の対応
Cortex-A9とCortex-MとでCMSIS-RTOS RTXの仕様に以下の差分があります。
Cortex-M用 CMSIS-RTOS RTXでは、ユーザがスレッドの総スタックサイズを意識しないでよい仕様となっておりますが、
Cortex-A9用 CMSIS-RTOS RTXではユーザにスレッドの総スタックサイズの調整を任せる仕様となっています。
Cortex-A9の仕様をCortex-Mの仕様に合わせる方針(対応調整中)ですが、それまでの間、
ユーザ側でのスレッドの総スタックサイズ調整(不足時)が必要になります。
以下、OS差分に関する情報です。
- Cortex-M :スタック領域をスレッド別に動的に確保。
⇒スレッド生成時、スレッドの総スタックサイズを意識しないでよい。
RAMが許す限り、スレッドを生成できる。
- Cortex-A9:スレッドの総スタックサイズをOSのコンフィギュレータ設定にて静的に確保。
⇒総スタックサイズを最初に検討/調整する必要がある。
コンフィギュレータにて設定したスタックサイズ内でスレッドを生成する必要がある。
[other] 内蔵RAMに格納されたプログラムを実行する方法¶
プログラムを、GR-PEACH標準のシリアルフラッシュメモリよりもアクセス性能の良い内蔵RAMに配置することで、GR-PEACHのプログラム実行性能を向上させることができます。
- mbedライブラリを削除し、mbed-srcライブラリをimportしてください
- mbed-src内の、以下の各ファイルを上書きまたは追加してください
- targets\cmsis\TARGET_RENESAS\TARGET_RZ_A1H\TOOLCHAIN_ARM_STD\startup_MBRZA1H.s (上書き)
- targets\cmsis\TARGET_RENESAS\TARGET_RZ_A1H\TOOLCHAIN_ARM_STD\MBRZA1H.sct (上書き)
- targets\cmsis\TARGET_RENESAS\TARGET_RZ_A1H\mmu_Renesas_RZ_A1.c (上書き)
- targets\hal\TARGET_RENESAS\TARGET_RZ_A1H\mbed_overrides.c (追加)
注意:
RAM実行時、以下のRAM領域はコード領域となります。
変数などのデータは配置しないでください。
0x20020000 - 0x200FFFFF
sctファイルの変更方法¶
sctファイルはmbedコンパイラ上で編集することができません。以下の手法でインポートしてください。
- mbed compiler 上で 「import」をクリックします
- 「Upload」タグをクリックします
- 「参照」をクリックします。
- アップロードするファイルを選択します