电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
Keil模拟器玩RTT多线程点灯
分 享
扫描二维码分享
Keil模拟器玩RTT多线程点灯
RTT
多线程
点灯
xukejing
关注
发布时间: 2019-08-13
丨
阅读: 4236
最近有个小师弟想省下饭钱,就为了买块正点原子STM32开发板,学RTT。他省了三天了,体重倒是降了一斤,但还是没把钱凑够。我知道后非常震惊,赶紧让他悬崖勒马,并教了他怎么在没板子的时候用模拟器学习STM32开发。 ## 1 RTT简介 RT-Thread(简称RTT)是一款完全由国内团队开发维护的嵌入式实时多线程操作系统,基本属性之一是支持多任务(线程)。其中,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行非常快速地切换,给人造成多个任务在一个时刻同时运行的错觉。 ## 2 为什么用Keil模拟器 近期,已经有不少小伙伴在电子芯吧客社区获得STM32开发板的免费试用资格了,虽然还没收到货,但也有手快的老哥已经来问我咨询例程和学习资料了。另一边,也有假扮萌新的老司机也去申请,而被管理识破了。相信大家的初心还是很淳朴的,只是想尽量省钱地学学STM32开发。 当然,不管大家是否拿到了板子,都不耽误学习的。因为,随着计算机技术的发展,我们可以采用软件方式来模拟一个能够运行 RT-Thread 操作系统的硬件模块,这就是 ARM 公司的 MDK-ARM 仿真模拟环境。今天,我们来聊聊用Keil模拟器玩玩RTT多线程点灯。 ## 3 例程要实现的功能 假设STM32F103的PC14和PC15分别接上了LED1和LED2。LED1循环着亮197毫秒、灭199毫秒。LED2循环着亮353毫秒、灭349毫秒。这样的亮灭时序,因为两个LED完全不同步,在无操作系统框架的条件下能写代码实现,但极其麻烦。但是,如果基于RTT来写,就简单多了。创建两个线程,线程1跑LED1的时序,线程2跑LED2的时序。 ## 4 代码示例 打开RTT例程,工程文件名two-led-rtt-sim,该工程可去电子芯吧客qq群的群共享下载。 打开main.c文件,你会发现主函数里啥都不需要添加,直接返回0: ![main函数](https://cf01.ickimg.com/bbsimages/201908/30623ffbb4a45773abb5ab0c7a7bfc74.jpg "main函数") 区别于传统的无操作系统的代码,RTT的各种功能不需要写进main函数里。 新建个控制LED的C文件(如果使用two-led-rtt-sim工程,这个文件已经帮您写好了),名字叫twoled。我们往里写入代码,先写上大概的代码框架: ![led控制框架](https://cf01.ickimg.com/bbsimages/201908/a5c40d07017c64210fec9cc5a8291ed0.jpg "led控制框架") 其中,PC14和PC15在RTT的GPIO驱动。比如,LQFP48封装的STM32CxT6,PC14和PC15对应于RTT的3和4号引脚。 ![RTT的GPIO引脚说明](https://cf01.ickimg.com/bbsimages/201908/fa4c87ca0f3a6a614e9e862436b03e02.jpg "RTT的GPIO引脚说明") 写一下RTT的CMD命令列表中two_led命令要执行的功能(如果使用two-led-rtt-sim工程,这些代码已经帮您写好了,下文不重复说了)。two_led要创建并启动两个线程,一个是thread1,入口是thread1_entry;另一个thread2,入口是thread2_entry。 ![RTT的CMD命令](https://cf01.ickimg.com/bbsimages/201908/c10128f74b3c2a78f0ce8d6ae380f682.jpg "RTT的CMD命令") 线程1的入口函数如下,一边控制LED1亮灭,一边串口打印调试信息。这里的rt_kprintf函数的定义在RTT的串口驱动里,它控制串口1打印。 ![线程1](https://cf01.ickimg.com/bbsimages/201908/0b5e6a9f2c4e1a8344b696d7109429e3.jpg "线程1") 线程2具有与线程1一样的形式,区别只是GPIO引脚编号的延时时间。 ![线程2](https://cf01.ickimg.com/bbsimages/201908/3dc9bac47a3fa6ea8b6213d267623485.jpg "线程2") ## 5 测试 点击debug按钮,进入调试界面。 ![debug按钮](https://cf01.ickimg.com/bbsimages/201908/accf31ee69a388158bd556ca6cdb0138.jpg "debug按钮") 点击serial windows右边的小箭头,把串口1的窗口打开 ![uart1按钮](https://cf01.ickimg.com/bbsimages/201908/582919cb478808fa186476232a51f705.jpg "uart1按钮") 把串口1的窗口拖动到合适的位置。宽屏的显示器,当横屏放置时,可以把UART1的窗口放在代码窗口右侧;当竖屏放置时,可以把UART1的窗口放在代码窗口下方。总之,主要目的是为了布局美观,方便观测。 ![uart1窗口放在右侧的效果](https://cf01.ickimg.com/bbsimages/201908/a4be36483465ae6b06dd6b697b3146e9.jpg "uart1窗口放在右侧的效果") 点击运行按钮(或按F5键),然后UART1窗口就会打印RTT的命令行 ![运行按钮](https://cf01.ickimg.com/bbsimages/201908/6858274d9e699ddc9357ebf7ab2356f7.jpg "运行按钮") 点击运行按钮或按F5以后,程序就开始跑了。开机后显示了RTT的启动打印信息。其中,控制LED的CMD命令都是需要输入命令指令以后才会跑的。 下面启动LED控制,在串口1界面输入CMD命令two_led,然后回车: ![输入命令](https://cf01.ickimg.com/bbsimages/201908/e572eede4cf96a95a94121bdeaae7418.jpg "输入命令") UART1显示了运行过程的串口打印。其中P14和P15引脚按各自的时序拉高和拉低,以控制LED亮灭。调试信息如下: ![调试信息](https://cf01.ickimg.com/bbsimages/201908/14baa0e172627fb5bd6e5b6d70dd5fac.jpg "调试信息")
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
5
)
xukejing
擅长:其他应用
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交