在STM32下完成一个基于FreeRTOS的多任务程序
文章目录前言一、从官网下载最新版的FreeRTOS源码二、MDK下移植FreeRTOS1.修改程序1、修改增加任务句柄2、修改增加任务3、修改创建任务修改和增加任务函数三、烧录程序1、keil设置2、编译,创建hex文件3、打开野火的mcusip软件四、查看执行结果前言FreeRTOS是一款 “开源免费”的实时操作系统,遵循的是 GPLv2+的许可协议,由美国的 Richard Barry 于 2
文章目录
前言
FreeRTOS是一款 “开源免费”的实时操作系统,遵循的是 GPLv2+的许可协议,由美国的 Richard Barry 于 2003 年发布,Richard Barry 是FreeRTOS 的拥有 者和维护者,在过去的十多年中FreeRTOS历经了 9 个版本,与众多半导体厂商合作密切, 累计开发者数百万,是目前市场占有率最高的 RTOS。
FreeRTOS于 2018 年被亚马逊收购,改名为 AWS FreeRTOS,版本号升级为 V10,且 开源协议也由原来的 GPLv2+修改为 MIT,与 GPLv2+相比,MIT 更加开放,你完全可以理解为是为所欲为的免费。V9 以前的版本还是维持原样,V10 版本相比于 V9 就是加入了一 些物联网相关的组件,内核基本不变。亚马逊收购FreeRTOS也是为了进军眼下炒的火热 的物联网和人工智能。
一、从官网下载最新版的FreeRTOS源码
官方最新源码的下载地址
本人目前使用的版本是v9.0.0, FreeRTOS源码在解压目录下的路径为FreeRTOS_V9.0.0rc2\FreeRTOS\Source
二、MDK下移植FreeRTOS
由于我使用的是野火的指南者F103,给了配套的代码这些。所以不用那么麻烦,我们直接打开。

1.修改程序
由于给的代码是执行2个点灯任务,所以我们需要在上面的基础上修改增加。
我们只需呀修改main.c就好了。
修改如下:
1、修改增加任务句柄
/* 创建任务句柄 */
static TaskHandle_t AppTaskCreate_Handle = NULL;
/* LED1任务句柄 */
static TaskHandle_t LED1_Task_Handle = NULL;
/* PRINT任务句柄 */
static TaskHandle_t PRINT_Task_Handle = NULL;
/* AHT20任务句柄 */
static TaskHandle_t AHT20_Task_Handle = NULL;
2、修改增加任务
static void AppTaskCreate(void);/* 用于创建任务 */
static void LED1_Task(void* pvParameters);/* LED1_Task任务实现 */
static void PRINT_Task(void* pvParameters);/* PRIN_Task任务实现 */
static void AHT20_Task(void* pvParameters);/* AHT20_Task任务实现 */
static void BSP_Init(void);/* 用于初始化板载相关资源 */
3、修改创建任务
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
taskENTER_CRITICAL(); //进入临界区
/* 创建LED_Task任务 */
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("创建LED1_Task任务成功!\r\n");
/* 创建PRINT_Task任务 */
xReturn = xTaskCreate((TaskFunction_t )PRINT_Task, /* 任务入口函数 */
(const char* )"PRINT_Task",/* 任务名字 */
(uint16_t )512, /* 任务栈大小 */
(void* )NULL, /* 任务入口函数参数 */
(UBaseType_t )3, /* 任务的优先级 */
(TaskHandle_t* )&PRINT_Task_Handle);/* 任务控制块指针 */
if(pdPASS == xReturn)
printf("创建PRINT_Task任务成功!\r\n");
/* 创建AHT20_Task任务 */
xReturn = xTaskCreate((TaskFunction_t )AHT20_Task, /* 任务入口函数 */
(const char* )"AHT20_Task",/* 任务名字 */
(uint16_t )512, /* 任务栈大小 */
(void* )NULL, /* 任务入口函数参数 */
(UBaseType_t )4, /* 任务的优先级 */
(TaskHandle_t* )&PRINT_Task_Handle);/* 任务控制块指针 */
if(pdPASS == xReturn)
printf("创建AHT20_Task任务成功!\r\n");
vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
taskEXIT_CRITICAL();
4、修改和增加任务函数
static void PRINT_Task(void* parameter)
{
while (1)
{
vTaskDelay(2000); /* 延时2000个tick */
printf("helloworld!\r\n");
}
}
/***********************************************************************/
static void AHT20_Task(void* parameter)
{
while (1)
{
vTaskDelay(5000); /* 延时5000个tick */
printf("目前只是框架!\r\n");
}
}
三、烧录程序
1、keil设置

2、编译,创建hex文件

3、打开野火的mcusip软件
用usb线接上stm32开发板后。
四、查看执行结果

这就完美执行好了,芜湖!!!!!!
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)