STM32CubeIDEを使ってみようの続編として STM32H7 シリーズで AzureRTOS を使ってみましょう。
本内容は MOOC - Azure RTOS workshop - 5 ThreadX lab - step1 - First thread creation を基に構成しています。
ドキュメントなど
Blinkプログラム
最初に NonOS の Blink プログラムを作ります。
こちらは、いつも通りとなります。
ボード設定
プロジェクト名 入力
Yes で進んでいきます。
DeviceConfiguration Tool Code Generation に進みます。
プログラム の追加
以上で、LEDが点滅すると思います。
AzureRTOSの追加
次に、AzureRTOS の追加のソフトウェアを追加します。
最初に、プロジェクトをコピーします。
今回は、ThreadX1にしました。
そのままでは DeviceConfiguration が開きません。
名前を ThreadX1.ioc に変更します。
IOCファイル を開くことが出来ました。
次に、Spftware Packs から Select Components を選択します。
X-CUBE-AZRTOS-H7 を選択しましょう。
Install していない場合は、インストールします。
今回は ThreadX の Core のみ使用します。
Core にチェックを入れてOKをクリックします。
Software Packs が追加され、X-CUBE-AZRTOS-H7 が追加されています。
Mode の RTOS ThreadX のチェックを入れます。
このまま、DeviceConfiguration Tool Code Generation をしましょう。
警告 が出ます。
これは、Systick ではなく正規のタイマーが必要という事になります。
動画でもありますが、TIM はどれでもいいようです。(注意:△!のものは避けてください)
今回は、動画通り Pinout&Configuration から SystemCore において TIM6 を選んでいます。
DeviceConfiguration Tool Code Generation します。
今回は問題なく、Code Generation されます。
ビルド&デバッグ
このまま、ビルド&デバッグ してみましょう。
NonOSで作ったBlinkのプログラムによりLEDがチカチカすることでしょう。
しませんね
これは、AzureRTOSに遷移しており、mainのプログラムに遷移しない為です。
Threadの製作
それでは、Threadのプログラムを作り、Lチカをしましょう。
app_thread.c にプログラムを追加します。
最初に my_thread_entry という関数を作ります。
void my_thread_entry(ULONG initial_input);
tx_thread_create にてスレッドを生成します。
今回は以下のようなコードになります。
tx_thread_create(&thread_ptr,"my_thread",my_thread_entry,0x1234,thread_stack,THREAD_STACK_SIZE,15,15,1,TX_AUTO_START);
これはどういうコードなのでしょうか?
第 4 章 - Azure RTOS ThreadX サービスの説明
をご覧ください。
大雑把に言うと(若干誤りあり)
UINT tx_thread_create(
TX_THREAD *thread_ptr, スレッド制御ブロックのポインター
CHAR *name_ptr, スレッドの名前を指すポインター
VOID (*entry_function)(ULONG), 実行関数
ULONG entry_input, エントリ関数に渡される32ビット値
VOID *stack_start, メモリ領域の開始アドレス
ULONG stack_size, メモリ領域のバイト数
UINT priority, スレッドの優先度(優先度15が一番低い)
UINT preempt_threshold, プリエンプションの最高優先度(優先度と同一だとプリエンプションの閾値が無効)
ULONG time_slice, タイムスライス(1~0xFFFFFFFF、0は無効)
UINT auto_start); 自動起動かの指定
となるようです。
my_thread_entry の関数を構成します。
今回の app_thread.c に main.h がインクルードされていないので追加します。
これでLED3が使用できるようになりました。
LED3の点滅プログラムを追加します。
void my_thread_entry(ULONG initial_input)
{
while(1){
HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
tx_thread_sleep(20);
}
}
# define THREAD_STACK_SIZE 1024
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
uint8_t thread_stack[THREAD_STACK_SIZE];
TX_THREAD thread_ptr;
定義をして、ビルド&デバックしましょう。
これでLEDが点滅していると思います。
ThreadList
Window⇒Show View⇒ThreadX⇒ThreadX ThreadList を選択します。
■ で停止します。(□□の一時停止でも良いようです)
TreadList が表示されました。
再度スタートさせると TreadList が変化します。。
これで、ThreadXをとりあえず動かす事が出来ました。