STM32F429I-DISCOとFreeRTOS
STM32F429I-DISCOにFreeRTOSを載せてLチカしてみます。
FreeRTOSのベースは以下のサイトから頂いてきました。
ありがとぅ!!ホントにありがとう!!
https://github.com/hmph/FreeRTOS-template-for-STM32F4
FreeRTOSとemWinを共存させようとする場合、SysTick_Handler,PendSV_Handler,SVC_Handler
とかが衝突すると思うので、いろいろいじってみてください。たぶん他にもいろいろといじらないといけないと思うけど・・・。
僕はまだ試してないので何とも言えませんが・・・。
以下がソースです。
/* 必要なヘッダをインクルードして下さい */ #include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_tim.h" /* FreeRTOS関係のincludeをわすれずに・・・ */ #include "FreeRTOS/include/FreeRTOS.h" #include "FreeRTOS/include/task.h" #include "FreeRTOS/include/semphr.h" void vLedG_Task(void *pvParam); void vLedR_Task(void *pvParam); int main(void) { SystemInit(); xTaskCreate( vLedG_Task, ( signed char * ) "LED G ", 100, NULL, 3, NULL ); xTaskCreate( vLedR_Task, ( signed char * ) "LED R ", 100, NULL, 2, NULL ); vTaskStartScheduler(); /* これでスケジュールスタートするはずなので、 これがリターンすることはないはず */ while(1) { } } /* 緑LED(PG13)を点滅させるタスク */ void vLedG_Task(void *pvParam) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOG, &GPIO_InitStructure); for(;;) { GPIOG->ODR ^= (1 << 13); vTaskDelay(300 / portTICK_RATE_MS); } } /* 赤LED(PG14)を点滅させるタスク */ void vLedR_Task(void *pvParam) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOG, &GPIO_InitStructure); for(;;) { GPIOG->ODR ^= (1 << 14); vTaskDelay(100 / portTICK_RATE_MS); } } /*+++++ FreeRTOSで必要な関数 +++++*/ /* メモリ確保できなかったときのHook */ void vApplicationMallocFailedHook( void ) { configASSERT( 0 ); } /* スタックがオーバーフローしたときのHook */ void vApplicationStackOverflowHook( xTaskHandle xTask, signed char *pcTaskName ) { ( void ) xTask; ( void ) pcTaskName; for(;;); } /* systic毎にコールバックされる関数 (default = 1000Hz)*/ void vApplicationTickHook( void ) { static uint32_t tick_time = 0; ++tick_time; if ( tick_time >= ((portTickType)5000/portTICK_RATE_MS) ) { tick_time = 0; } } /* 動作すべきタスクがないときにコールされる関数 */ void vApplicationIdleHook( void ) { static uint32_t idle_tick_cnt = 0; ++idle_tick_cnt; if ( idle_tick_cnt >= ((portTickType)5000/portTICK_RATE_MS) ) { } }
緑のLEDが300msec,赤のLEDが100msecくらいで点滅するはずです。
いやぁRTOSって便利ですね。
ハマっちゃいそうです。