組み込み技術を向上したい!!

でも組み込み以外にも手を出し始めました・・・

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って便利ですね。

ハマっちゃいそうです。