完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前言
学习FreeRTOS原理,在STM32下完成一个基于FreeRTOS的多任务程序,执行3个周期性task,具体任务不限,但建议如下:task1,每间隔500ms闪烁(变化)一次LED;task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";task3,每间隔5000ms,从AHT20采集一次温湿度数据一、FreeRTOS原理 1.RTOS Real Time Operating System 实时操作系统。 2.FreeRTOS FreeRTOS 是一款 “开源免费”的实时操作系统,遵循的是 GPLv2+的许可协议。 3.FreeRTOS的编程风格 ①FreeRTOS 的数据类型 对标准 C 的数据类型进行了重定义。 详细内容如下: ②FreeRTOS的变量名 定义变量的时候往往会把变量的类型当作前缀加在变量上。 通常规则是char 型变量的前缀是 c,short 型变量的前缀是 s,long 型变量的缀是 l, portBASE_TYPE 类型,数据结构,任务句柄,队列句柄变量的前缀是 x。如果一个变量是无符号型的那么会有一个前缀 u,如果是一个指针变量则会有一个前缀 p。因此,当我们定义一个无符号的 char 型变量的时候会加一个 uc 前缀,当定义一个char 型的指针变量的时候会有一个 pc 前缀。 ③FreeRTOS的函数名 函数名包含了函数返回值的类型、函数所在的文件名和函数的功能,如果是私有的函数则会加一个 prv(private)的前缀。 ④FreeRTOS的宏 宏均是由大写字母表示,并配有小写字母的前缀,前缀用于表示该宏在个头文件定义。比如 configUSE_PREEMPTION(config就表示宏定义在FreeRTOSConfig.h中) 二、FreeRTOS任务 任务的定义创建任务 ①定义任务栈 每个任务都分配独立的栈空间,这个栈空间通常是一个预先定义好的全局数组,也可以是动态分配的一段内存空间,但它们都存在于 RAM 中。 /* FreeRTOS头文件 */ #include "FreeRTOS.h" #include "task.h" /* 开发板硬件bsp头文件 */ #include "bsp_led.h" #include "bsp_usart.h" /* 创建任务句柄 */ static TaskHandle_t AppTaskCreate_Handle = NULL; /* LED1任务句柄 */ static TaskHandle_t LED1_Task_Handle = NULL; /* hello任务句柄 */ static TaskHandle_t hello_Task_Handle = NULL; /* AHT任务句柄 */ static TaskHandle_t AHT_Task_Handle = NULL; static void AppTaskCreate(void);/* 用于创建任务 */ static void LED1_Task(void* pvParameters);/* LED1_Task任务实现 */ static void hello_Task(void* pvParameters);/* hello_Task任务实现 */ static void AHT_Task(void* pvParameters); static void BSP_Init(void);/* 用于初始化板载相关资源 */ int main(void) { BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */ /* 开发板硬件初始化 */ BSP_Init(); printf("这是一个[野火]-STM32全系列开发板-FreeRTOS-动态创建多任务实验!rn"); /* 创建AppTaskCreate任务 */ xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate, /* 任务入口函数 */ (const char* )"AppTaskCreate",/* 任务名字 */ (uint16_t )512, /* 任务栈大小 */ (void* )NULL,/* 任务入口函数参数 */ (UBaseType_t )1, /* 任务的优先级 */ (TaskHandle_t* )&AppTaskCreate_Handle);/* 任务控制块指针 */ /* 启动任务调度 */ if(pdPASS == xReturn) vTaskStartScheduler(); /* 启动任务,开启调度 */ else return -1; while(1); /* 正常不会执行到这里 */ } 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任务成功!rn"); /* 创建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_Task任务成功!rn"); /* 创建AHT*/ 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("创建AHT_Task任务成功!rn"); vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务 taskEXIT_CRITICAL(); //退出临界区 } static void LED1_Task(void* parameter) { while (1) { LED1_ON; vTaskDelay(500); /* 延时500个tick */ printf("LED1_Task Running,LED1_ONrn"); LED1_OFF; vTaskDelay(500); /* 延时500个tick */ printf("LED1_Task Running,LED1_OFFrn"); } } static void hello_Task(void* parameter) { while (1) { vTaskDelay(2000); printf("hello World!rn"); } } static void AHT_Task(void* parameter) { while (1) { vTaskDelay(5000); printf("温湿度为:rn"); } } static void BSP_Init(void) { NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 ); /* LED 初始化 */ LED_GPIO_Config(); /* 串口初始化 */ USART_Config(); } 三、FreeRTOS移植 下载 FreeRTOS 的源码 链接: https://pan.baidu.com/s/12hmlzM9OBxM_m2SqvqLKRw. 提取码:g6jk 将下载后的 zip 文件解压缩,然后下面开始将源码移植到一个工程文件中。 准备一个工程 链接: https://pan.baidu.com/s/1yS32ZAQpdaC3QG0FINHNUQ. 提取码:lwpq 解压缩后,进入目录FreeRTOS工程ProjectRVMDK(uv5)下双击打开工程文件。 点击编译按钮进行编译 程序无错,可以移植 移植 FreeRTOS 最简源码 打开 FreeRTOS 源码文件夹,在FreeRTOSv9.0.0FreeRTOSSource路径下,将 include 文件夹复制到刚刚新建的 FreeRTOS 文件夹中。 include 同目录下新建两个文件夹——port、src。 将 MemMang、RVDS 文件夹复制到刚刚新建的 port 文件夹中。 将所有的 .c 文件复制到刚刚新建的 src 文件夹中。 拷贝 FreeRTOSConfig.h 文件到 user 文件夹中 添加 FreeRTOS 源码到工程分组中,创建 FreeRTOS/src 和 FreeRTOS/port 打开工程。 添加文件夹:三色方块 ——> 添加按钮 ——> 输入文件名 ——> OK ——> 添加完成。 添加 FreeRTOS C 源程序 添加 FreeRTOS 端口源程序 添加 FreeRTOSConfig.h 到 USER 中 添加头文件路径 魔术棒 ——> C/C++ ——> … ——> 添加按钮 ——> 添加两个路径 点击编译 显示如下图 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1763 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1617 浏览 1 评论
1059 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
723 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1932浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
725浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
564浏览 3评论
591浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
549浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 01:54 , Processed in 0.750440 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号