【FreeRTOS】01 初识freertos操作系统,第一个任务

1)概述

最近打算写一个实时操作系统编程的系列。

操作系统分很多种,有大型的复杂、功能齐全操作系统,也有小型的代码几百行的操作系统内核;也有实时和非实时之分。这里我们学习可以运行在资源很少的类单片机处理器上的实时操作系统(RTOS)。

至于为什么以freeRTOS为例来学习,一方面是它完全开源和免费;另一方面它的功能在小型操作系统里是比较齐全的,学会它在很多场合就够用了;第三个理由是它网上的资源非常多,很多大芯片厂官方都有对它的移植支持,学习起来很方便。

硬件平台还是常用的stm32,它官方出品了代码生成工具cubemx,可以自动生成移植好的FreeRTOS系统代码。这样我们可以把主要的精力放在学习实时操作系统的应用上。

注意,本系列教程打算讲RTOS的应用为主。许多教程一上来就讲系统的移植,而移植可以说是最难理解的,往往让初学者望而生畏;所以我们先来讲应用,等熟悉了之后再去讲操作系统的底层实现和移植。

2)初识FreeRTOS,cubemx建立工程,配置硬件

这一节我们开始写第一个程序,建立两个任务,每个任务控制一个LED灯闪烁。

我们的工程都是由cubemx建立,在keil中修改、编译、下载。先从cubemx创建工程,进入后,先选择stm32f103c8处理器。

首先配置SYS,debug选上serial wire,即SW调试接口;Timebase选择systick以外的一个定时器。

注意,在使用RTOS时,cubemx建议不用systick作为时间基准。这是由于用cubemx生成HAL库工程时,systick的相关函数被定义成了weak类型,可能被用户重写,那么就会造成时间混乱;另外在cubemx生成的代码中它的优先级最低,如果被其他中断打断会使得时间基准不准确,而选其他的定时器会初始化为最高优先级。

我觉得用不用systick作为时间基准,主要看应用场景,一般来讲,系统调度的优先级低于中断的优先级也是合理的,毕竟中断的实时性要求可能更紧迫一些;不过如果在这个时间基准的中断服务程序中,运行时间很短,只是更新定时器,在us级别,那么我觉得设置一个高优先级也是可以的,毕竟一般应用场景见不到要求几us级时间要响应的中断。

这里如果现在不明白,可以无脑按cubemx的推荐走,不用systick。

然后选择时钟源,这里都用的是外部晶振时钟:

接下来选择GPIO,这里我们选择两个引脚设置为输出,我们选择PC13和PA0两个引脚,去控制板子上的LED灯,设置为GPIO_Output:

然后启用freeRTOS,如下图,在中间件中选中freertos,选择interface为CMSIS_V1:

这里说明一下,V1和V2的区别,V1适用于简单的MCU,V2扩展到了一些比较强的MCU,V2的代码中会有很多为了兼容不同处理器的代码,为了简单易学我们使用V1即可。

切换到Task and Queue页面,添加两个任务,添加时只改变任务的优先级为high,其他都暂时都不改:(关于各参数的配置说明,以后会详细讲,现在咱们都默认)

添加完成后,Task栏里出现我们添加的myTask02任务,同时还会多一个default任务;我们用同样的方法再添加一个myTask03任务,完成后如图所示:

切换到时钟配置页面,如下配置,选择外部时钟,设置到最高的时钟频率:

切换到project Manager页面:

先填写工程名称、保存路径,以及生成的工具链,由于我们使用keil开发,选择MDK-ARM V5,其他默认

勾选为每个外设建立.c和.h文件,这样以后方便修改,不会很混乱:

这样就基本配置完成了,点击右上角的generate code生成代码:

3)keil中编辑代码

刚刚生成的工程文件,可以用keil5打开,我们打开freertos.c文件:

我们编写的代码从freertos这个文件里开始,可以看到我们之前建立的两个用户任务:StartTask02和StartTask03。

一般c语言的函数都是从main开始执行,但是这里由于工程文件已经建立好了,我们只需要把我们自己的代码添加到任务的函数中即可。

我们看到,StartTask02和StartTask03中各有一个无限循环,这和我们编写裸机程序主函数中的无限循环类似,都会循环执行。只不过在裸机程序中,只在主函数中有一个无限循环,而这里freeRTOS帮我们实现了在一个MCU里“同时”跑两个无限循环的功能。这其实就是操作系统的最核心功能,可以实现多任务。这里我们不再深入,以后会有更多的讲解。

我们在两个任务中添加闪灯的代码,如下:

 

以task02为例,是在无限循环中,先延时500ms,再拉低PA0引脚;然后延时500ms,再拉高PA0引脚,如此不断循环。task03的功能一样,只是延时是1000ms,操作的引脚是PC13。

点击keil主界面的rebuil图标进行编译:

编译成功无错误后,就可以烧写到开发板了。

4)烧写和运行

将开发板和stlink连接,stlink连接到计算机的usb口上,然后点击keil上的download,就可以下载到开发板运行了:

程序运行起来后,两个任务可以各自延时后翻转LED的状态,互不影响地运行;也可以在调试模式下,通过断点查看程序运行到进入task02和task03的情况。可以看到,本例子中的两个任务虽然都是无限循环,但是都在正常运行,互不影响。

5)总结

本节我们利用cubemx自动生成了一个移植好的freeRTOS工程,然后在上面运行了两个任务,初步试验了多任务。这其中,操作系统相关的代码都不用我们编写,只需要关注应用程序(闪灯)即可,cubemx的强大功能使得我们的学习更加便利。

好了,本节的内容就到这里了,这是freeRTOS嵌入式系统编程的第一课,以后还有更深入的学习。

如果觉得有用可以关注作者微信号“小白白学电子”,在公众号可以找到代码和资料下载地址:

  • 12
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值