本帖最后由 leoyk 于 2018-5-22 08:28 编辑 $ f) z: {0 }. a$ B/ a: ] 首先感谢论坛给的机会。 今天的实验内容是使用cubeMX配置freeRTOS,创建3个任务使NUCLEO-L496ZG上的三个LED实现不同频率的闪烁。 : E& ~) v& a5 p5 p/ } 这是未使用RTOS实现的流水灯效果 https://www.stmcu.org.cn/module/forum/thread-615434-1-1.html ,典型的单线程应用。在时间敏感的应用中,单线程的程序必须等待整个程序运行完或者中断发生才能再次运行,实时性较弱。今天采用的freeRTOS是实时操作系统之一,特点是多线程,采用“轮换”的方式实现“并行”的效果,操作系统内可以建立任务,每个任务都可以认为自己完全占有着cpu,这样整个系统的灵活性就会非常强。今天使用cubeMX简单配置MCU实现多线程的效果。 1.使用cubeMX创建一个新的工程,本文选择STM32L496ZG主控 2.如图,配置三个LED所接引脚为输出模式,并标注好名称,注意:LD1-->PC7(初始硬件状态下), p& ?- v6 ?, N. y+ q 3.配置系统HCLK为72M,这里告诉我们最高可以设置为80Mhz(振荡器HSI 16Mhz) 4.勾选FreeRTOS 5.点击配置界面的FreeRTOS出现具体配置界面,本文只配置tasks & queues* e' q5 W+ w. n' L) M. z 6.双击初始的task进行配置 7.修改任务名称、任务函数并配置优先级为belowNormal( o; L: P1 @8 `6 @( c2 c 8.点击add增加两个新的任务分别控制LD2和LD3,注意他们的优先级分别为normal和beyondNormal,优先级是可以自定义的,本文仅仅是将三个任务区分开来 9.到现在,目测配置已经完成了,整个流程十分简洁,尝试生成模板,此处使用默认的设置,未将所有外设分.c.h存储% o! Q* P' n, l J: @/ S$ G2 z6 r 10.弹出错误,提示不建议使用systick作为timebase source,我在网上查到两条信息:1.可以在RCC内设置timebase source为定时器,2.(未验证)不需要处理这条信息,系统会自动分配。此处我们尝试使用TIM1 11.生成成功,打开文件,可以看到系统自动创建了三个任务名称(我们之前设置的名称),建立并开启了三个任务。 12.此处提示理论上用户不要在下面的循环里写程序了,因为调度器已经开始了。* m! _. _+ ~" o" D, {) E 13.我们找到三个任务的函数,可以看到每个任务都是一个死循环,并且内部有一个延时。死循环是代表每个任务都可以认为自己是独占cpu的,延时是为了给其他任务一个执行的机会。如果不加延时就会导致调度器无法为其他任务分配资源,也就无法执行到了。! n9 u& t2 F, y N" h- R 14.分别在三个循环内写入不同频率的闪烁语句8 n8 Y M' z, t. H. `5 C 15.编译无误后上传,停止调试后可以观察到LD1看不到闪烁(100hz肉眼无法察觉闪烁),但亮度只有其他灯的一半,其他两个灯分别以10hz和1hz的频率闪烁,如果有示波器应该能清楚的验证开发板同时输出三种频率的方波。! Y: g9 w( i) k" s X, z 后记:每个任务都可以有自己的“初始化”即在任务内循环之上进行变量定义和初始化操作,不建议在程序内使用全局变量,因为在没有保护的情况下,全局变量有被意外改变的风险,程序之间可以通过邮箱和信号量来进行交互,下一篇再说。& R4 ^0 m6 q' ]6 {, M / [; W2 ?" m8 ^. Y6 [ |
期待下一篇.......多谢!!