前言
本节是在前章任务学习之后进行的移植实验,其目标是将原有的串口代码改写成带有rtos系统的,所使用的mcu为stm32f103。
一、移植Freertos
首先将Freertos的文件夹移植到程序的文件夹下,具体的文件可以选择公开资料提供的即可(笔者这里使用的是正点原子提供的,大家可以去其官方自行下载)。
创建在工程中创建FreeRTOS_CORE 和 FreeRTOS_PORTABLE两个新分组,并分别按下图在新分组中添加文件,位置均在刚刚放入的FreeRTOS文件夹中,值得注意的是图2的五个heap文件任性一个即可。
最后的分组是这样的,大家可以自己检查一下有没有缺少文件。
之后添加路径。
修改sys.h头文件,将#define SYSTEM_SUPPORT_OS 1//定义系统文件夹是否支持OS
置为1。
除此之外还需要修改usart.c,delay.c及stm32f10x_it.c,内容太多笔者就不一一展示了,这里粘一下正点原子的视频链接,大家可以自行查阅。
二、程序修改
2.1 修改配置文件
上节已经提到了,我们如果使用动态创建的方法,需要设置该宏,如下图所示。
2.2 入口参数的实现
根据上章内容,我们可以知道在创建任务时需要设定其优先级、句柄、堆栈大小以及任务函数。
// 示例
#define START_TASK_PRIO 1 //任务优先级 (1)
#define START_STK_SIZE 128 //任务堆栈大小 (2)
TaskHandle_t Task1_Handler; //任务句柄 (3)
void task1_task(void *pvParameters); //任务函数 (4)
void task1_task(void *pvParameters){
...
for(;;){
...
}
...
vTaskDelay(xxx); // 这里需要使用其自带的延时函数,用于切换任务
}
上面所提供的示例为通用的任务框架,但如需要创建“开始任务”(作为入口去创建相对应的任务),此时就不能使用死循环for(;;)了,这是由于你无法重复创建相同的任务。
2.3 任务的创建
这部分内容主要使用前章的xTaskCreate( )函数,我们根据上小节自定义的信息进行填充即可。
//创建TASK1任务
xTaskCreate((TaskFunction_t )task1_task,
(const char* )"task1_task",
(uint16_t )TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK1_TASK_PRIO,
(TaskHandle_t* )&Task1Task_Handler);
2.4 主函数的修改
不同于以往的所有操作均放置于大循环while(1)中,freertos的while(1)是很闲的,其中什么都不用加。我们只需要在各部分模块定义之后进行任务的创建以及调度,然后将原来写在大循环里的内容移动到对应的任务中的小循环即可(PS:启动函数除外,仅启动一次即可)。
int main(void)
{
... // 各种各样的初始化函数
xTaskCreate((TaskFunction_t )task1_task,
(const char* )"task1_task",
(uint16_t )TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK1_TASK_PRIO,
(TaskHandle_t* )&Task1Task_Handler);
vTaskStartScheduler(); // 开启任务调度
while(1);
}
在做完以上操作,我们的FreeRTOS 移植程序程序基本上就是完成了,需要注意的是本实验使用的是动态创建的方法。实际上,我们可以将有关一个任务的东西我们的放到一个.h 头文件里面去,比如任务堆栈、任务句柄、任务函数声明等,这样方便修改。
免责声明:本文参考了网上公开资料,仅用于学习交流,若有错误或侵权请联系笔者。