FreeRTOS初体验
1.写在前面
实时系统(RTOS)种类五花八门,除了老牌RTOS如UCOS、vxWorks、FreeRTOS,及国内的RT-Thread、阿里AliOS、华为LiteOS等;也涌现出新兴的RTOS,或者GitHub上不缺乏开源爱好者编写的实时内核。对于RTOS的选择也是比较纠结,特别是对于未接触过操作系统的学习者。但一般情况下,如果进入公司,公司都会选择比较成熟稳定的RTOS,或者基于历史原因的还依然使用老牌RTOS。鄙人本着“支持国产”原则,一直使用的是RT-Thread实时系统,并且该RTOS确实是发展越来越好,提供的组件越来越丰富。最近基于公司考虑,后期很有可能使用上FreeRTOS。在此之前,对于FreeRTOS也只是停留了解、查阅源码阶段,所以,开始尝鲜FreeRTOS并使用。
RT-Thread确实是一个很好的“启蒙RTOS”,所以对于FreeRTOS的使用,就是依葫芦画瓢了,使用起来除了函数命名风格不一样,大部分“套路”都是一样的。
2.FreeRTOS介绍
FreeRTOS是一个迷你的实时操作系统内核。其最大的特点就是“小”,占用资源小,支持8位、16位、32位MCU平台。“麻雀虽小五脏俱全”,FreeRTOS提供了操作系统基本的功能和组件,包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等。此外,FreeRTOS还有一个最大的优势就是如其名,就是免费,在产品上使用也不需担心付费问题。
3.源码获取
3.1 获取源码
FreeRTOS源代码开源公开,可以在官网获取。官方网站:https://www.freertos.org/
3.2 源码目录结构
下载的源码是打包成一个可行文件(.exe),比较新颖,节约空间。执行成功后生成源码文件夹,其中有两个源码目录文件。
—FreeRTOS 包含FreeRTOS实时内核源文件和演示例程
—FreeRTOS-Plus 包含FreeRTOS+组件和演示例程
FreeRTOS目录下是我们关注的,其中的“Demo”目录包含了各类MCU平台的演示例程。作者已经移植好了常用MCU平台,省去了底层移植(汇编、启动文件等底层),降低了使用难度;而且还支持不同编译器,如Keil、IAR等。
FreeRTOS
|- Demo 包含演示例程工程
|- Source 包含实时内核源文件
3.3 选择例程
STM32最常用的了,毅然选择STM32+Keil的Demo工程。
4.实现一个基本任务
4.1 任务回调函数
嵌入式中的“hello word!非”流水灯”莫属。那么就用FreeRTOS实现一个“流水灯”任务。演示例程中,创建了两个任务,分别是“Check”和“LCD”,现创建一个“LED”任务执行函数(任务回调函数)。LED控制IO初始化和IO翻转不多赘述,任务函数体实现如下。
static void led_ctrl_task( void *pvParameters )
{/*流水灯*/
for( ;; )
{
led_ctrl(3,1);
led_ctrl(1,0);
vTaskDelay(mainCHECK_DELAY); /*500ms延时(释放CPU资源)*/
led_ctrl(1,1);
led_ctrl(2,0);
vTaskDelay(mainCHECK_DELAY);
led_ctrl(2,1);
led_ctrl(3,0);
vTaskDelay(mainCHECK_DELAY);
}
}
4.2 创建线程(任务)
创建任务,调用“xTaskCreate”函数。关于任务创建函数,一类RTOS或者通用操作系统的思维都是类似的,不外乎就几个入口参数。诸如:
— 线程回调函数,如上述LED任务
— 线程名称,如“LED”
— 线程堆栈大小,根据线程资源设置
— 线程用户参数,如无可设置为NULL
— 线程优先级
FreeRTOS创建一个LED流水灯任务。
xTaskCreate( led_ctrl_task, "LED", mainCHECK_TASK_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
至此,FreeRTOS实现一个基本的任务。
5.总结
[1].操作系统思维都是通用的,特别是使用技巧,选择一款经典的操作系统作为学习途径,再学习其他操作系统时,则是举一反三的过程。
[2].操作系统大部分时候充当工具载体,更多是应用编程思想、线程(任务)管理、资源分配、问题定位等。从事系统底层驱动开发的则另当别论。