5.4.2 FreeRTOS操作系统应用实例
FreeRTOSConfig.h配置文件里面几个重要选项说明:
u #define configUSE_PREEMPTION 1
使能抢占式调度器
u #define configCPU_CLOCK_HZ ( ( unsigned long ) 168000000 )
系统主频168MHz。
u #define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
系统时钟节拍1KHz,即1ms。
u #define configMAX_PRIORITIES ( 5 )
定义可供用户使用的最大优先级数,如果这个定义的是5,那么用户可以使用的优先级号是0,1,2,3,4,不包含5,对于这一点,初学者要特别的注意。
u #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) )
定义堆大小,FreeRTOS内核,用户动态内存申请,任务栈等都需要用这个空间。
---------------------------------------------------------------------------------------------------
经过上面的移植和配置之后,在main.c文件中添加如下代码,代码中简单的创建了四个用户任务:
vTaskTaskUserIF任务:接口消息处理,这里用作LED闪烁。
AppTaskLED任务 :LED闪烁。
vTaskMsgPro任务:消息处理,这里用作LED闪烁。
AppTaskStart任务:启动任务,也是最高优先级任务,这里实现LED闪烁。
#include "includes.h"
/*
**********************************************************************************************************
函数声明
**********************************************************************************************************
*/
static void vTaskTaskUserIF(void *pvParameters);
static void vTaskLED(void *pvParameters);
static void vTaskMsgPro(void *pvParameters);
static void vTaskStart(void *pvParameters);
static void AppTaskCreate (void);
/*
**********************************************************************************************************
变量声明
**********************************************************************************************************
*/
static TaskHandle_t xHandleTaskUserIF = NULL;
static TaskHandle_t xHandleTaskLED = NULL;
static TaskHandle_t xHandleTaskMsgPro = NULL;
static TaskHandle_t xHandleTaskStart = NULL;
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: 标准c程序入口。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
int main(void)
{
/*
在启动调度前,为了防止初始化STM32外设时有中断服务程序执行,这里禁止全局中断(除了NMI和HardFault)。
这样做的好处是:
1. 防止执行的中断服务程序中有FreeRTOS的API函数。
2. 保证系统正常启动,不受别的中断影响。
3. 关于是否关闭全局中断,大家根据自己的实际情况设置即可。
在移植文件port.c中的函数prvStartFirstTask中会重新开启全局中断。通过指令cpsie i开启,__set_PRIMASK(1)
和cpsie i是等效的。
*/
__set_PRIMASK(1);
/* 硬件初始化 */
bsp_Init();
/* 创建任务 */
AppTaskCreate();
/* 启动调度,开始执行任务 */
vTaskStartScheduler();
/*
如果系统正常启动是不会运行到这里的,运行到这里极有可能是用于定时器任务或者空闲任务的
heap空间不足造成创建失败,此要加大FreeRTOSConfig.h文件中定义的heap大小:
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) )
*/
while(1);
}
/*
*********************************************************************************************************
* 函 数 名: vTaskTaskUserIF
* 功能说明: 接口消息处理,这里用作LED闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 1 (数值越小优先级越低,这个跟uCOS相反)
*********************************************************************************************************
*/
static void vTaskTaskUserIF(void *pvParameters)
{
while(1)
{
bsp_LedToggle(1);
vTaskDelay(100);
}
}
/*
*********************************************************************************************************
* 函 数 名: vTaskLED
* 功能说明: LED闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 2
*********************************************************************************************************
*/
static void vTaskLED(void *pvParameters)
{
while(1)
{
bsp_LedToggle(2);
vTaskDelay(200);
}
}
/*
*********************************************************************************************************
* 函 数 名: vTaskMsgPro
* 功能说明: 信息处理,这里是用作LED闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 3
*********************************************************************************************************
*/
static void vTaskMsgPro(void *pvParameters)
{
while(1)
{
bsp_LedToggle(3);
vTaskDelay(300);
}
}
/*
*********************************************************************************************************
* 函 数 名: vTaskStart
* 功能说明: 启动任务,也就是最高优先级任务,这里用作LED闪烁
* 形 参: pvParameters 是在创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 4
*********************************************************************************************************
*/
static void vTaskStart(void *pvParameters)
{
while(1)
{
/* LED闪烁 */
bsp_LedToggle(4);
vTaskDelay(400);
}
}
/*
*********************************************************************************************************
* 函 数 名: AppTaskCreate
* 功能说明: 创建应用任务
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void AppTaskCreate (void)
{
xTaskCreate( vTaskTaskUserIF, /* 任务函数 */
"vTaskUserIF", /* 任务名 */
512, /* 任务栈大小,单位word,也就是4字节 */
NULL, /* 任务参数 */
1, /* 任务优先级*/
&xHandleTaskUserIF ); /* 任务句柄 */
xTaskCreate( vTaskLED, /* 任务函数 */
"vTaskLED", /* 任务名 */
512, /* 任务栈大小,单位word,也就是4字节 */
NULL, /* 任务参数 */
2, /* 任务优先级*/
&xHandleTaskLED ); /* 任务句柄 */
xTaskCreate( vTaskMsgPro, /* 任务函数 */
"vTaskMsgPro", /* 任务名 */
512, /* 任务栈大小,单位word,也就是4字节 */
NULL, /* 任务参数 */
3, /* 任务优先级*/
&xHandleTaskMsgPro ); /* 任务句柄 */
xTaskCreate( vTaskStart, /* 任务函数 */
"vTaskStart", /* 任务名 */
512, /* 任务栈大小,单位word,也就是4字节 */
NULL, /* 任务参数 */
4, /* 任务优先级*/
&xHandleTaskStart ); /* 任务句柄 */
}