目录
一、前言
二、详细步骤
三、总结
一、前言
从本文开始,将会逐步介绍FreeRTOS的一些功能,由浅入深。本文将上手通过STM32CUBEMX快速实现FreeRTOS的移植。随后创建点灯任务。
芯片选型:STM32F103C8T6
二、FreeRTOS
如果你想要在单片机程序中同时实现LED闪烁和检测按键,只用最简单的扫描检测,不使用中断等,你会怎么实现呢?
常见的方法是:
if(按键 == 按下)
{
...
}
延时(1000ms)
LED翻转()
这样的话,我们按下按键往往要等待1s才被响应。
还有的小伙伴选择这样写:
if(按键 == 按下)
{
...
}
延时(10ms)
延时计数++
if(延时计数 >= 100)
{
延时计数 = 0
LED翻转()
}
这样可以做到10ms内就能响应按键操作,但是如果我们面对更快的场景呢?比如必须捕捉到时间很短的按键事件,又该如何做?
我们做不到一心二用,CPU也是这样,他们需要执行完一条语句随后转身去执行另外一条。但这样并不符合实时响应的要求,如果能够多线程处理就好了。那么,FreeRTOS可以帮助你。
CPU同样不能一心二用,CPU的多线程不过是快速在多个线程间切换执行。执行任务A的一条指令然后再去执行任务B的一条指令,切换的事件之快,对于任务来说就是在一心而用。
什么是FreeRTOS?FreeRTOS 是一个开源的、免费的、实时操作系统内核(RTOS),专为嵌入式微控制器设计。它由 Richard Barry 开发,并在全球范围内得到广泛使用,特别是在需要高实时性、低资源消耗和灵活性的应用中。FreeRTOS 提供了任务调度、时间管理、同步机制(如信号量、互斥锁和队列)等功能,使得开发者可以更容易地构建复杂的多任务应用程序。
三、详细步骤
打开STM32CUBEMX 配置LED引脚,基本时钟树。
将时基源改为TIM4或其他不使用的定时器
使能FreeRTOS
4.点击Task and Queues,点击Add,添加我们自己的任务。Entry Function是程序入口。
在New Task中,我们可以看到如下选项
点击Generate Code,生成代码。
打开Keil之后,先编译一遍,确保没有错误。
找到freertos.c文件,找到之前程序入口的函数。
将里边的程序改为LED闪烁。
for(;;)
{
osDelay(1000);
HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
}
四、总结
显而易见,相较于我们使用常规途径移植STM32的FreeRTOS系统,STM32CUBEMX为我们提供了便利快捷的途径,让我们能够有更多时间在开发上,而非环境移植和部署。日后我也会陆续出几篇关于FreeRTOS的文章,深入学习交流。
本文工程源码:FreeRTOS