目录
- 一、FreeRTOS简介
- 1.什么是FreeRTOS?
- 2. FreeRTOS特点
- 二、创建项目
- 三、编写代码
- 四、编译烧录
- 五、总结
- 参考链接
一、FreeRTOS简介
1.什么是FreeRTOS?
我们看一下FreeRTOS的名字,可以分为两部分:Free和 RTOS,Free 就是免费的、自由的、不受约束的意思,RTOS全称是RealTimeOperating System,中文名就是实时操作系统。可以看出 FreeROTS就是一个免费的RTOS类系统。这里要注意,RTOS不是指某一个确定的系统,而是指一类系统。比如UCOS,FreeRTOS,RTX,RT-Thread等这些都是RTOS类操作系统。
操作系统允许多个任务同时运行,这个叫做多任务,实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务,任务调度在各个任务之间的切换非常快!这就给人们造成了同一时刻有多个任务同时运行的错觉。
操作系统的分类方式可以由任务调度器的工作方式决定,比如有的操作系统给每个任务分配同样的运行时间,时间到了就轮到下一个任务,Unix操作系统就是这样的。RTOS的任务调度器被设计为可预测的,而这正是嵌入式实时操作系统所需要的,实时环境中要求操作系统必须对某一个事件做出实时的响应,因此系统任务调度器的行为必须是可预测的。像FreeRTOS这种传统的RTOS类操作系统是由用户给每个任务分配一个任务优先级,任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务。
FreeRTOS是RTOS系统的一种,FreeRTOS十分的小巧,可以在资源有限的微控制器中运行,当然了,FreeRTOS不仅局限于在微控制器中使用。但从文件数量上来看FreeRTOS要比UCOSI和 UCOSIII小的多。
2. FreeRTOS特点
FreeRTOS是一个可裁剪的小型RTOS系统,其特点包括:
- FreeRTOS的内核支持抢占式,合作式和时间片调度。
- SafeRTOS衍生自FreeRTOS,SafeRTOS在代码完整性上相比FreeRTOS更胜一筹。
- 提供了一个用于低功耗的Tickless模式。
- 系统的组件在创建时可以选择动态或者静态的RAM,比如任务、消息队列、信号量、软件定时器等等。
- 已经在超过30种架构的芯片上进行了移植。
- FreeRTOS-MPU支持Corex-M系列中的MPU单元,如 STM32F103。
- FreeRTOS系统简单、小巧、易用,通常情况下内核占用4k-9k字节的空间。高可移植性,代码主要C语言编写。
- 支持实时任务和协程(co-routines也有称为合作式、协同程序,本教程均成为协程)
- 任务与任务、任务与中断之间可以使用任务通知、消息队列、二值信号量、数值型信号量、递归互斥信号量和互斥信号量进行通信和同步。
- 创新的事件组(或者事件标志)。
-具有优先级继承特性的互斥信号量。
高效的软件定时器。 - 强大的跟踪执行功能。
- 堆栈溢出检测功能。
- 任务数量不限。
- 任务优先级不限。
二、创建项目
使用CubeMx创建,我这里用的是STM32F103C8。
配置两个GPIO引脚来点灯:
![在这里插入图片描述](https://img-blog.csdnimg.cn/3cd44d3a552743eab18359f17ed49935.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV09PWkk5NjAwTMKy,size_20,color_FFFFFF,t_70,g_se,x_16)
配置SYS:
![在这里插入图片描述](https://img-blog.csdnimg.cn/1d5319e705d043fb87b06d633ef4efe2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV09PWkk5NjAwTMKy,size_20,color_FFFFFF,t_70,g_se,x_16)
配置FREERTOS:
![在这里插入图片描述](https://img-blog.csdnimg.cn/95734ed038f6452f959ea602ceadb255.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV09PWkk5NjAwTMKy,size_20,color_FFFFFF,t_70,g_se,x_16)
配置项目信息并生成项目:
![在这里插入图片描述](https://img-blog.csdnimg.cn/4de9070a81f94f80aad0261ddfed6a94.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV09PWkk5NjAwTMKy,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/f86d1f278c5b4b97b6aae1bdb06194de.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV09PWkk5NjAwTMKy,size_20,color_FFFFFF,t_70,g_se,x_16)
使用keil打开项目文件。
三、编写代码
打开ferrrtos.c:
![在这里插入图片描述](https://img-blog.csdnimg.cn/967ed828a1c344feab123b5799841ec7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV09PWkk5NjAwTMKy,size_20,color_FFFFFF,t_70,g_se,x_16)
在ferrrtos.c对应函数内写代码:
void StartUTask(void const * argument)
{
for(;;)
{
osDelay(2000);
printf("hello uc/OS! 欢迎来到RTOS多任务环境!\r\n");
}
}
void StartTask02(void const * argument)
{
for(;;)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);
osDelay(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);
osDelay(500);
}
}
void StartTask03(void const * argument)
{
for(;;)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);
osDelay(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);
osDelay(2500);
}
}
四、编译烧录
编译烧录前设置:
![在这里插入图片描述](https://img-blog.csdnimg.cn/a913bade5ab04a84931912a1662ce58e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV09PWkk5NjAwTMKy,size_20,color_FFFFFF,t_70,g_se,x_16)
结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/4e2da85bd3d24556a357767e2336c9a2.gif#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/bcbb01146f55427b964434b1ed81f3cd.gif#pic_center)
五、总结
在本次实验中,相比uCOS移植,FreeRTOS的操作更简单,大多数CubeMxy已经写好了,自己只需写几行代码即可。
参考链接
https://blog.csdn.net/Mouer__/article/details/121616118?spm=1001.2014.3001.5501
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)