科协近期大事汇总
1. 科协网络服务恢复。
2. 第二周周六下午,科协迎新。
3. 下周预计举办python培训。
4. 挑战杯初审将在下周举行。
开学第三周了,科协五分钟终于又和大家见面了。这次给大家带来嵌入式实时操作系统freeRTOS在STM32单片机上的简单教程。由于我也是刚学会,有不准确之处欢迎指正。
嵌入式实时操作系统?想学会这个我需要首先去学操作系统的课程吗?
当然不需要!只要接触过一点单片机(裸机开发),学习起来就不困难,特别是有了CubeMX这种神器,用图形界面配一个freeRTOS就和配一个PWM输出,串口中断一样简单。
嵌入式实时操作系统(RTOS)有什么作用呢?
我就不复制RTOS的介绍了,简单来说,通过RTOS的任务调度机制,你可以在单核处理器上近似实现多个任务的并行执行。例如,本教程会实现三个LED以三种不同频率独立闪烁。
LED不同频率闪烁?这个我也会!
的确,裸机代码也能实现此效果,但这样三个LED闪烁互相存在耦合,如果想改变相位差之类的就不太容易;更重要的是,如果想增加其他任务,要么继续在主循环里添加代码(轮询),要么利用中断,轮询在任务较多时较难设计,而中断过多可能会产生一些不可预知的bug。
而freeRTOS提供了一种在轮询和中断之外实现多任务的方式,每个任务独立性很高,编程简单,写出逻辑bug的概率较低。让我们进入正题!
首先,打开STM32CubeMX软件
(什么?不知道CubeMX?这里有教程:
http://www.waveshare.net/study/article-629-1.html
也欢迎关注科协后续培训)
新建项目,选择和你的开发板型号相符的单片机,我是F407VE。
创建项目,首先在System Core-SYS选项中开Serial Wire Debug,并将Timebase Source从Systick改为某一定时器。
因为我们的任务是点亮3个LED,所以设置对应的3个引脚为GPIO输出模式,除此之外,再设置一个和开关相连的引脚为输入上拉模式,以便演示用开关控制LED的一些行为。
然后配置freeRTOS,在MiddleWare中找到FreeRTOS,将它的Interface开启。
在下面一大堆选项中只需要改变Tasks and Queues。点击Tasks and Queues中的Add添加任务,重命名Task Name和Entry Function,再OK即可添加任务。添加四个任务,命名为LED1,LED2,LED3和KEY。
选项Priority,也就是优先级,越高,任务的执行越接近实时。在本例程中可以不用改。
对于一般的STM32应用,还推荐将系统主频改为允许的最高频率。在Clock Configuration中将System Clock Mux设为PLLCLK,调整PLL倍频和各处分频,让各处频率满足要求的同时,SYSCLK尽可能高(对于F407,168MHz)。
之后就可以生成代码了。选择项目位置和IDE(我用的MDK-ARM V5,但据说CubeIDE的支持更好),在Code Generator选中“Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”,点击右上角Generate Code。
之后的工作在IDE中进行。打开生成的项目,可以看到main.c中生成了freeRTOS的初始化代码。
这次我们不需要在while(1)主循环中写任何代码,因为所有任务都交给freeRTOS来调度了。
在freeRTOS中找到刚刚定义的startLED1等四个函数,在函数里写你需要的任务内容。每一个函数(任务)都可以理解为独立的进程,在这里你可以随便delay,而不用担心阻塞其他进程,只不过不是HAL_Delay,而是osDelay。在osDelay被执行时,操作系统会把这部分时间分配给其他的任务。
这里我写了三个最简单的LED闪烁程序,初始周期分别为400*2,500*2和600*2(ms)。变量pause是配合按键使用的。
此外还有一个简单的带去抖的按键任务,作用是每按一次,就将三个LED立即熄灭并相位差归零,随后以新的周期组继续闪烁(从400*2,500*2,600*2变为600*2,500*2,400*2)。
编译下载程序,观察到LED以三种周期闪烁。由于800,1000,1200的最小公倍数为12000,每12秒三个LED的状态会重复一次。
按动按键,可观察到LED闪烁周期的变化。
这种写法有什么优势吗?
和裸机相比,RTOS最大的优势是各任务基本解耦,编程方便,逻辑清晰,自动调度让各任务基本保留了实时性,不会阻塞。其实,从广义上来说,裸机上写的中断啊轮询啊也算是一种任务调度方式,而RTOS把这个功能自动化了。
应用领域的话,比如做比较复杂的仪器面板时,可以一个任务扫描矩阵键盘和电位器旋钮输入,一个任务从传感器采集数据,一个任务扫描数码管进行输出显示。再比如做智能小车,可以一个任务对电机码盘计数,一个任务进行PID控制,一个任务采集各种传感器数据,一个任务进行主逻辑控制,这样可以减少中断,提高可靠性。
当然也不是说RTOS就一定比裸机好,具体用哪种,还要根据具体需求具体分析。(而且我刚学会会简单调用RTOS没几天,以上分析都是凭经验推测,不保证准确)
好了,这就是本期的科协五分钟,对单片机/嵌入式/硬件感兴趣的同学,欢迎加入精仪系科协,我们有一套完整的培训体系!
这次我们点亮了“科创-嵌入式层-嵌入式操作系统”
编辑 王广晗
审核 林逸晗,丁荣