你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

cubeMX + FreeRTOS 第一篇 创建任务实现3个LED不同频闪烁

[复制链接]
leoyk 发布时间:2018-5-21 19:55
本帖最后由 leoyk 于 2018-5-22 08:28 编辑

    首先感谢论坛给的机会。    今天的实验内容是使用cubeMX配置freeRTOS,创建3个任务使NUCLEO-L496ZG上的三个LED实现不同频率的闪烁。

    这是未使用RTOS实现的流水灯效果 https://www.stmcu.org.cn/module/forum/thread-615434-1-1.html ,典型的单线程应用。在时间敏感的应用中,单线程的程序必须等待整个程序运行完或者中断发生才能再次运行,实时性较弱。今天采用的freeRTOS是实时操作系统之一,特点是多线程,采用“轮换”的方式实现“并行”的效果,操作系统内可以建立任务,每个任务都可以认为自己完全占有着cpu,这样整个系统的灵活性就会非常强。今天使用cubeMX简单配置MCU实现多线程的效果。
1.使用cubeMX创建一个新的工程,本文选择STM32L496ZG主控
9f4cc26cb7a706ceef4610d1bfb9bbc.png
2.如图,配置三个LED所接引脚为输出模式,并标注好名称,注意:LD1-->PC7(初始硬件状态下)
53b8c1ec2cb528643d918e21cb18e60.png
1.png
3.配置系统HCLK为72M,这里告诉我们最高可以设置为80Mhz(振荡器HSI 16Mhz)
f0707e1906b2fd0c54a51b077833a74.png
4.勾选FreeRTOS
766e751c4a0a582e87b70b5c9d3f742.png
5.点击配置界面的FreeRTOS出现具体配置界面,本文只配置tasks & queues
c9c644905ffa0f955f0b5d4bcf7515a.png
6.双击初始的task进行配置
9e615b7cce9786b71f7c046bd529519.png
7.修改任务名称、任务函数并配置优先级为belowNormal
205fd000d54b83ebf3b780ea0cb036f.png
8.点击add增加两个新的任务分别控制LD2和LD3,注意他们的优先级分别为normal和beyondNormal,优先级是可以自定义的,本文仅仅是将三个任务区分开来
a1ecc5de1038b0dc09ff13e36fd12dd.png 02b4db3d2b2dbc21104679f15537400.png
9.到现在,目测配置已经完成了,整个流程十分简洁,尝试生成模板,此处使用默认的设置,未将所有外设分.c.h存储
ff9863f13bf44b93be22936a0b34cd7.png
10.弹出错误,提示不建议使用systick作为timebase source,我在网上查到两条信息:1.可以在RCC内设置timebase source为定时器,2.(未验证)不需要处理这条信息,系统会自动分配。此处我们尝试使用TIM1
6dd4827177f0f9808da1e261f1f63a6.png

517b6c88c658190357bdf4ff819661f.png
11.生成成功,打开文件,可以看到系统自动创建了三个任务名称(我们之前设置的名称),建立并开启了三个任务。
b683bf39bc1044a433efb943af72c62.png
167c92c04efdfb39bb40848ee5264b7.png

cd1cebfccbd169c0dd8c3b4c8e9deac.png
12.此处提示理论上用户不要在下面的循环里写程序了,因为调度器已经开始了。
c187f906d64a9df23db380b8320a202.png
13.我们找到三个任务的函数,可以看到每个任务都是一个死循环,并且内部有一个延时。死循环是代表每个任务都可以认为自己是独占cpu的,延时是为了给其他任务一个执行的机会。如果不加延时就会导致调度器无法为其他任务分配资源,也就无法执行到了。
840f4fae4180eece688f99a35f37332.png
14.分别在三个循环内写入不同频率的闪烁语句
39837ab1a533233bf36584ebfe6ba86.png
15.编译无误后上传,停止调试后可以观察到LD1看不到闪烁(100hz肉眼无法察觉闪烁),但亮度只有其他灯的一半,其他两个灯分别以10hz和1hz的频率闪烁,如果有示波器应该能清楚的验证开发板同时输出三种频率的方波。
539014094576620497.jpg
后记:每个任务都可以有自己的“初始化”即在任务内循环之上进行变量定义和初始化操作,不建议在程序内使用全局变量,因为在没有保护的情况下,全局变量有被意外改变的风险,程序之间可以通过邮箱和信号量来进行交互,下一篇再说。


收藏 5 评论7 发布时间:2018-5-21 19:55

举报

7个回答
pythonworld 回答时间:2018-5-26 08:08:05
很详细,入门必备!!!
xiaojie0513 回答时间:2018-5-30 10:19:26
很详细哦
king_lv 回答时间:2018-5-31 11:33:54
感谢楼主分享
emon 回答时间:2018-6-8 14:02:10

期待下一篇.......多谢!!
Lufie 回答时间:2018-8-6 17:52:16
藏不住的时光 回答时间:2019-4-16 15:59:19
谢谢,很好的内容!!!!
ljm996054544 回答时间:2020-3-9 16:46:07
有生之年还能看到第二章

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版