前言
此次,本菜鸟有个任务
学习FreeRTOS原理,在STM32下完成一个基于FreeRTOS的多任务程序
基于FreeRTOS的多任务程序
在移植freertos到stm32之前,我们首先要对它有一定的了解
本篇参考为野火大学堂提供的资料
路径如上,需要的朋友可以通过下面链接得到
密码(pmf1)
资料自取
什么是FreeRTOS?
FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。
为什么要学习FreeRTOS?
此次任务
学习FreeRTOS原理,在STM32下完成一个基于FreeRTOS的多任务程序,执行3个周期性task,具体任务不限,但建议如下:
task1,每间隔500ms闪烁(变化)一次LED;
task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";
task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。
由于我用的板子是stm32指南者,所以从野火提供的资料里找到任务对应的sram动态创建
为了编译不出错,将中文路径改成英文路径
打开project文件夹中的
我们能看出来,野火已将FreeRTOS的源码拷贝到了工程文件中,所以我们可以把它作为模板,略过一些添加文件的步骤,所以我们接下来就可以直接调整代码。
打开工程文件的页面如下
我们先把没有修改的程序试着编译一下
没有错误,此时我们开始修改代码
为了方便观察修改,此处删除一些注释
首先,我们需要创建三个任务
第一,创建LED灯任务句柄
第二,创建hello任务句柄
第三,创建AHT20任务句柄
对函数进行声明
在主程序中添加hello任务
xReturn = xTaskCreate((TaskFunction_t )hello_Task,
(const char* )"hello_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )3,
(TaskHandle_t* )&hello_Task_Handle);
if(pdPASS == xReturn)
printf("创建hello任务成功!\r\n");
在主程序中添加AHT20任务
xReturn = xTaskCreate((TaskFunction_t )AHT_Task,
(const char* )"AHT_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )3,
(TaskHandle_t* )&AHT_Task_Handle);
if(pdPASS == xReturn)
printf("创建AHT20任务成功!\r\n");
添加如下两个函数
static void hello_Task(void* parameter)
{
while (1)
{
vTaskDelay(2000);
printf("hello World!\n");
}
}
static void AHT_Task(void* parameter)
{
/*暂无*/
}
修改完成后主程序如下
#include "FreeRTOS.h"
#include "task.h"
#include "bsp_led.h"
#include "bsp_usart.h"
static TaskHandle_t AppTaskCreate_Handle = NULL;
static TaskHandle_t LED1_Task_Handle = NULL;
static TaskHandle_t hello_Task_Handle = NULL;
static void AppTaskCreate(void);
static void LED1_Task(void* pvParameters);
static void hello_Task(void* pvParameters);
static void AHT_Task(void* pvParameters);
static void BSP_Init(void);
int main(void)
{
BaseType_t xReturn = pdPASS;
BSP_Init();
printf("这是一个多任务实验\r\n");
xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,
(const char* )"AppTaskCreate",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )1,
(TaskHandle_t* )
if(pdPASS == xReturn)
vTaskStartScheduler();
else
return -1;
while(1);
}
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL();
xReturn = xTaskCreate((TaskFunction_t )LED1_Task,
(const char* )"LED1_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )2,
(TaskHandle_t* )&LED1_Task_Handle);
if(pdPASS == xReturn)
printf("创建LED灯任务成功!\r\n");
xReturn = xTaskCreate((TaskFunction_t )hello_Task,
(const char* )"hello_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )3,
(TaskHandle_t* )&hello_Task_Handle);
if(pdPASS == xReturn)
printf("创建hello任务成功!\r\n");
vTaskDelete(AppTaskCreate_Handle);
taskEXIT_CRITICAL();
}
static void LED1_Task(void* parameter)
{
while (1)
{
LED1_ON;
vTaskDelay(500);
printf("LED1_Task Running,LED1_ON\r\n");
LED1_OFF;
vTaskDelay(500);
printf("LED1_Task Running,LED1_OFF\r\n");
}
}
static void hello_Task(void* parameter)
{
while (1)
{
vTaskDelay(2000);
printf("hello World!\n");
}
}
static void BSP_Init(void)
{
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
LED_GPIO_Config();
USART_Config();
}
修改完成后,编译运行
没有错误,生成hex文件
程序的烧录
接下来通过usb将程序烧录到指南者板子里
过程如下
首先利用USB线将板子与上位机连接(注意!连“usb转串口”)
安装野火资料里的CH340驱动
成功后可以在此电脑点击右键,属性>设备管理器>端口处检查
下载并安装野火资料包中的mcuisp1
完成后设置相关参数如下
在mcuisp中进行配置
并导入刚才修改完代码的hex文件如下
点击开始编程
板子变化如下,第一个LED任务执行成功
在野火资料包中下载野火串口调试助手v1.0.1.5
双击运行,设置串行口调试设置波特率为115200,1位停止位,无校验位:
点击打开串口,程序运行如下
总结
以上就是用freertos搭建多任务程序的全部过程
这次终于上手硬件了,操作有些手忙脚乱,但是相信我会越来越熟练
此处给出 freertos的官网