嵌入式实时操作系统FreeRTOS
基本概述
在嵌入式领域当中,实时操作系统的应用越来越广泛了,目前嵌入式操作系统种类很多,例如:μClinux、μC/OS-II、μC/OS-III、FreeRTOS、RT-Thread等等。这篇文章所记录的就是我在学习FreeRTOS的过程中所记录的心得体会。
FreeRTOS是RTOS系统的一种,FreeRTOS十分的小巧,可以在资源有限的微控制器中运 行,当然了,FreeRTOS 不仅局限于在微控制器中使用。但从文件数量上来看FreeRTOS要比μC/OS-II和 μC/OS-III 小的多。
作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。FreeRTOS内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。
为什么学习FreeRTOS?
- FreeRTOS开源且免费,这是比较重要的一点,μC/OS是需要收费的,如果想把自己的作品变为产品的话,节约成本也是一件重要的事情,显而易见,FreeRTOS是一个不错的选择。当然也可以选择其他的免费嵌入式实时操作系统。
- 学习时可以参考的文档较为丰富,不过文档多为英文版且下载收费,但是可以在网页上免费观看和学习。顺便可以提高英语文献和文档的阅读能力。
- FreeRTOS文件数量少,且相对于μC/OS来说移植更加简单。
- 社会占有量很高,FreeRTOS可以很容易地移植到多个平台,例如:MSP430、STM32、PIC等等。许多软件厂商也使用FreeRTOS做本公司软件的操作系统,比如著名的 TouchGFX,其 所有的例程都是基于FreeRTOS操作系统的。ST 公司的所有要使用到 RTOS 系统的例程也均采 用了FreeRTOS。
FreeRTOS的特点
FreeRTOS是一个可裁剪的小型 RTOS 系统,其特点包括:
- 其内核支持抢占式、合作式和时间片调度。
- 提供了用于低功耗的Tickless模式。
- 在创建任务、信号量、消息队列等系统组件时,内存分配方式可采用动态或静态分配。
- FreeRTOS-MPU支持Cortex-M系列的内存保护单元(MPU)。
- 强大的执行跟踪功能。
- 堆栈溢出检测。
- 没有限制的任务数量。
- 没有限制的任务优先级。
- 具有优先级继承特性的互斥信号量。
- 任务与任务、任务与中断之间可以使用任务通知、消息队列、二值信号量、数值型信
号量、递归互斥信号量和互斥信号量进行通信和同步。
- 多个任务可以分配相同的优先权。
试着来创建一个基本的工程文件
选择自己所用的单片机型号,这里我使用的是STM32F103ZET6。
Timebase Source要选TIM1,因为FreeRTOS需要占用Systick来作为系统的时钟源。
选择板载的LED。
创建一个LED任务。
配置时钟
最后配置完成,点击GENERATE CODE直接生成工程文件。
我们打开工程,找到并打开freertos.c文件,找到void led_task(void const * argument)这个函数,如图所示。并在for(;;)中加入自己的代码来实现功能。
// 例如
void led_task(void const * argument)
{
/* USER CODE BEGIN led_task */
/* Infinite loop */
for(;;)
{
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
vTaskDelay(500);
}
/* USER CODE END led_task */
}
编译完成后,把程序下载到板子上就可以看到LED灯闪烁的的效果了,闪烁的间隔是0.5s。
结尾
由于学习过程中的FreeRTOS工程文件是通过STM32CubeMX软件配置好后直接创建出来的,所以本学习笔记的内容不包括FreeRTOS的移植过程。如果想自己动手移植,请参考正点原子的FreeRTOS开发手册。