直接意识代码:
int main()
{
while(1)
{
//LED1置为高电平
......
//延时1000MS
......
//LED1置为低电平
......
//延时1000MS
......
//LED2置为高电平
......
//延时500MS
......
//LED2置为低电平
......
//延时500MS
......
}
}
这是我们大脑最希望的添加代码方式,很显然他是错的,两个任务之间产生了相互的影响,使得两个任务都执行错误,这种思想在裸机开发中肯定是错的,但是在我们的RTOS中他就可以是对的。
任务型代码:
//创建LED1任务
void LED1_Task()
{
//LED1置为高电平
......
//延时1000MS
......
//LED1置为低电平
......
//延时1000MS
......
}
//创建LED2任务
void LED2_Task()
{
//LED2置为高电平
......
//延时500MS
......
//LED2置为低电平
......
//延时500MS
......
}
这是独立的两个任务内容,我们只需要把他的扔到我们的任务执行器里,他就会**“同时”运行了,很多小伙伴就会疑问了,单片机明明只有一个核**,为什么可以同时执行多个任务呢?这就需要去了解RTOS操作系统中任务“同时”执行的原理。
1.4 任务“同时”执行的原理
在RTOS中,RTOS利用了一种类似于**“视觉暂留”的工作原理,多个任务之间快速切换。在ROTS中,可以让我们的每个任务执行一个时间单位**,然后就切换到另外一个任务执行一个时间单位,再切换回去,两个任务都是独立运行的,互不影响,由于切换的频率很快,就感觉像是同时运行的一样。
上图为一个简单的示意图,读者朋友们可以结合该图好好理解一下RTOS系统的执行过程。
二、 FreeRTOS的手动移植
为了图方便,笔者这里直接使用CubeMX去生成一个基于HAL库的初始STM32工程文件。不习惯用HAL库的,可以找一个标准库的初始STM32工程文件,进行手动移植工作。
①、建立STM32空工程
这里使用STM32CubeMX快速创建项目,要注意的是我们完成最基本的配置以后,需要将我们的Timebase Source修改一下,修改成除了滴答定时器的其他定时器,