STM32 シリーズですが、freeRTOSのユーザコードをできる限り自動生成されるコードから分離したい、というか移植性とか考えたらそれが自然
<実行環境>
・STM32F401re
・M4 MacBook Pro Tahoe
・CubeIDE 1.19.0
Core/IncとCore/Srcの下にprocというユーザコード用のディレクトリ作成、Inc/Srcの中ならばbuildはソースコードを見つけて実行してくれる
<やっていること>
defaultTaskはLEDの定期点滅、lcd_taskはst7789 LCDの表示処理を呼び出しているだけ、freeRTOSはpreemptiveなのでdafultTaskの実行が必要になればlcd_taskの実行を中断してLCD表示のtoggle処理をおこなく、処理時間は人間の時間感覚からは全くの瞬時だからLCD表示的には全く認識できないレベル
<task定義とそれを扱う仕組み>
① CubeMXで定義
lcd表示タスクは優先度を下げておく、ADC DMA結果を分析するタスクの方が優先順位高いよね普通は
Task Nameは②のTask_attributeで使われ、Entry Functionはfreertos.c中の関数名になります
② freertos.cでタスクの属性とタスクそのものの定義
③ freertos.cのタスク初期化(osThreadNew())で②の定義が使われ、Task(StartDefualtTask)等に紐付けされる
<ユーザコードの分離>
freertos.c中のコード、defaultTaskではボード上のLEDを点滅させてるだけ、StartTask03は実態はなくて、ユーザコードの呼び出しだけ
void StartDefaultTask(void *argument) {
/* 生存確認(Lチカ)だけして大半は眠る */
for(;;) {
HAL_GPIO_TogglePin(GPIOA, LED_PIN);
osDelay(500);
}
}
/* USER CODE BEGIN Header_StartTask03 */
/**
* @brief Function implementing the lcd_Task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask03 */
void StartTask03(void *argument)
{
/* USER CODE BEGIN StartTask03 */
/* Infinite loop */
for(;;)
{
lcd_process(); // LCD display process
osDelay(1);
}
/* USER CODE END StartTask03 */
}ユーザ処理(lcd_task.hとlcd_task.c)
cmsis_os.h、これは今は使わないけどいずれかならず使う
/*
* lcd_task.h
*
* Created on: Jan 13, 2026
* Author: usamiryuuichi
*/
#ifndef INC_PROC_LCD_TASK_H_
#define INC_PROC_LCD_TASK_H_
#ifdef __cplusplus
extern "C" {
#endif
void lcd_process(void);
#endif /* INC_PROC_LCD_TASK_H_ */
/*
* lcd_task.c
*
* Created on: Jan 13, 2026
* Author: usamiryuuichi
*/
#include "proc/lcd_task.h"
#include "st7789.h"
#include "cmsis_os.h"
void lcd_process(){
ST7789_TestColors();
}実際の動作は以下の動画、
全体の骨組みできてきたから、実際の処理に取り掛かれるかな
admin




