LoginSignup
0
1

More than 1 year has passed since last update.

STM32CubeIDEを使ってみよう STM32H7でAzureRTOS編

Posted at

STM32CubeIDEを使ってみようの続編として STM32H7 シリーズで AzureRTOS を使ってみましょう。

本内容は MOOC - Azure RTOS workshop - 5 ThreadX lab - step1 - First thread creation を基に構成しています。

ドキュメントなど

Blinkプログラム

最初に NonOSBlink プログラムを作ります。
こちらは、いつも通りとなります。
ボード設定
image.png
プロジェクト名 入力
image.png
Yes で進んでいきます。
image.png
DeviceConfiguration Tool Code Generation に進みます。
image.png
プログラム の追加
image.png
以上で、LEDが点滅すると思います。

AzureRTOSの追加

次に、AzureRTOS の追加のソフトウェアを追加します。
最初に、プロジェクトをコピーします。
今回は、ThreadX1にしました。
image.png
そのままでは DeviceConfiguration が開きません。
名前を ThreadX1.ioc に変更します。
image.png
image.png
IOCファイル を開くことが出来ました。
image.png
次に、Spftware Packs から Select Components を選択します。
image.png
X-CUBE-AZRTOS-H7 を選択しましょう。
Install していない場合は、インストールします。
image.png
今回は ThreadXCore のみ使用します。
Core にチェックを入れてOKをクリックします。
image.png
Software Packs が追加され、X-CUBE-AZRTOS-H7 が追加されています。
ModeRTOS ThreadX のチェックを入れます。
image.png
image.png
このまま、DeviceConfiguration Tool Code Generation をしましょう。
image.png
警告 が出ます。
これは、Systick ではなく正規のタイマーが必要という事になります。
image.png
動画でもありますが、TIM はどれでもいいようです。(注意:△!のものは避けてください)
今回は、動画通り Pinout&Configuration から SystemCore において TIM6 を選んでいます。
DeviceConfiguration Tool Code Generation します。
image.png
今回は問題なく、Code Generation されます。
image.png

ビルド&デバッグ

このまま、ビルド&デバッグ してみましょう。
image.png
image.png
スクリーンショット
NonOSで作ったBlinkのプログラムによりLEDがチカチカすることでしょう。
しませんね
これは、AzureRTOSに遷移しており、mainのプログラムに遷移しない為です。

Threadの製作

それでは、Threadのプログラムを作り、Lチカをしましょう。
app_thread.c にプログラムを追加します。
最初に my_thread_entry という関数を作ります。

void my_thread_entry(ULONG initial_input);

image.png
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); 自動起動かの指定

となるようです。
image.png
image.png
image.png
my_thread_entry の関数を構成します。
image.png
今回の app_thread.cmain.h がインクルードされていないので追加します。
image.png
image.png
これでLED3が使用できるようになりました。
image.png
LED3の点滅プログラムを追加します。

void my_thread_entry(ULONG initial_input)
{
	while(1){
		HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
				tx_thread_sleep(20);
	}
}

image.png
このままではいくつかの定義が出来ていないので追加します。

# define THREAD_STACK_SIZE 1024
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
uint8_t thread_stack[THREAD_STACK_SIZE];
TX_THREAD thread_ptr;

image.png
定義をして、ビルド&デバックしましょう。
image.png
これでLEDが点滅していると思います。

ThreadList

Window⇒Show View⇒ThreadX⇒ThreadX ThreadList を選択します。
image.png
で停止します。(□□の一時停止でも良いようです)
image.png
TreadList が表示されました。
image.png
再度スタートさせると TreadList が変化します。。
スクリーンショット
これで、ThreadXをとりあえず動かす事が出来ました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1