FreeRTOS移值
首先需要获取源码包啊:
http://www.freertos.org/到官网下载。
选出一般常用的几个文件:
把文件拷贝整理到一个文件夹FreeRTOS.然后把这个文件夹复制到STM32工程里面。
keil添加代码文件:
添加好之后,keil project添加.C文件
到此编译一次。
编译过程中会出现报错:未发现FreeRTOSConfig.h这个文件,到官网找一下这个.h,然后复制到自己的工程,我的建议是复制在FreeRTOS这个文件夹里面,方便以后移值。再次编译,还是有报错:void PendSV_Handler(void) void SVC_Handler(void)这两个中断函数重复了。FreeRTOS里面也配置有这两个函数,所以找到STM32工程的STM32F4xx_it.c把这两个函数屏蔽了。
再次编译还会有出错:
void vApplicationIdleHook( void )这个函数没有
u32 getSysTickCnt(void)这个函数没有
void vApplicationMallocFailedHook( void )这个函数没有。一次性添加这三个函数:
void vApplicationIdleHook( void )
{
static u32 tickWatchdogReset = 0;
portTickType tickCount = getSysTickCnt();
if (tickCount - tickWatchdogReset > WATCHDOG_RESET_MS)
{
tickWatchdogReset = tickCount;
watchdogReset();
}
__WFI(); /*进入低功耗模式*/
}
u32 getSysTickCnt(void)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED) /*系统已经运行*/
return xTaskGetTickCount();
else
return sysTickCnt;
}
void vApplicationMallocFailedHook( void )
{
portDISABLE_INTERRUPTS();
while(1);
}
这三个函数添加的位置用户自己决定,我的是添加在STM32F4xx_it.c,方便使用。到此编译没有出现错误,下面就是编写最小的运行代码。
需要建立任务函数:
TaskHandle_t startTaskHandle;
static void startTask(void *arg);
//任务句柄
TaskHandle_t LED0Task_Handler;
//任务函数
void led0_task(void *pvParameters);
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);
/*创建任务*/
void startTask(void *arg)
{
taskENTER_CRITICAL(); /*进入临界区*/
xTaskCreate(led0_task, "LED0_TASK", 150, NULL, 3, (TaskHandle_t* )&LED0Task_Handler); /*创建无线连接任务*/
xTaskCreate(led1_task, "LED1_TASK", 150, NULL, 4, (TaskHandle_t* )&LED1Task_Handler); /*创建usb接收任务*/
vTaskDelete(startTaskHandle); /*删除开始任务*/
taskEXIT_CRITICAL(); /*退出临界区*/
}
uint32 LED0_Count, LED1_Count;
uint32 Sys_Time, Sys_TimeP;
//LED0任务函数
void led0_task(void *param)
{
while(1)
{
Sys_Time = getSysTickCnt();
LED0_Count ++;
vTaskDelay(1000);
Sys_TimeP = getSysTickCnt() - Sys_Time;
}
}
//LED1任务函数
void led1_task(void *param)
{
while(1)
{
LED1_Count ++;
vTaskDelay(1000);
}
}
还有一个注意的点就是滴答定时器中断里面的处理,少了这个系统运行不正常的哦
void SysTick_Handler(void)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED) /*系统已经运行*/
{
xPortSysTickHandler();
}else
{
sysTickCnt++; /*调度开启之前计数*/
}
}
直接跑仿真,根据LED0_Count、LED1_Count这两个变量去判断代码运行情况,祝你成功。