本帖最后由 fish001 于 2019-11-7 22:18 编辑
最近有个小师弟想省下饭钱,就为了买块正点原子STM32开发板,学RTT。他省了三天了,体重倒是降了一斤,但还是没把钱凑够。我知道后非常震惊,赶紧让他悬崖勒马,并教了他怎么在没板子的时候用模拟器学习STM32开发。
1 RTT简介
RT-Thread(简称RTT)是一款完全由国内团队开发维护的嵌入式实时多线程操作系统,基本属性之一是支持多任务(线程)。其中,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行非常快速地切换,给人造成多个任务在一个时刻同时运行的错觉
模拟器" class="reference-link">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:
区别于传统的无操作系统的代码,RTT的各种功能不需要写进main函数里。
新建个控制LED的C文件(如果使用two-led-rtt-sim工程,这个文件已经帮您写好了),名字叫twoled。我们往里写入代码,先写上大概的代码框架:
其中,PC14和PC15在RTT的GPIO驱动。比如,LQFP48封装的STM32CxT6,PC14和PC15对应于RTT的3和4号引脚。
写一下RTT的CMD命令列表中two_led命令要执行的功能(如果使用two-led-rtt-sim工程,这些代码已经帮您写好了,下文不重复说了)。two_led要创建并启动两个线程,一个是thread1,入口是thread1_entry;另一个thread2,入口是thread2_entry。
线程1的入口函数如下,一边控制LED1亮灭,一边串口打印调试信息。这里的rt_kprintf函数的定义在RTT的串口驱动里,它控制串口1打印。
线程2具有与线程1一样的形式,区别只是GPIO引脚编号的延时时间。
5 测试
点击debug按钮,进入调试界面。
点击serial windows右边的小箭头,把串口1的窗口打开
把串口1的窗口拖动到合适的位置。宽屏的显示器,当横屏放置时,可以把UART1的窗口放在代码窗口右侧;当竖屏放置时,可以把UART1的窗口放在代码窗口下方。总之,主要目的是为了布局美观,方便观测。
点击运行按钮(或按F5键),然后UART1窗口就会打印RTT的命令行
点击运行按钮或按F5以后,程序就开始跑了。开机后显示了RTT的启动打印信息。其中,控制LED的CMD命令都是需要输入命令指令以后才会跑的。
下面启动LED控制,在串口1界面输入CMD命令two_led,然后回车:
UART1显示了运行过程的串口打印。其中P14和P15引脚按各自的时序拉高和拉低,以控制LED亮灭。调试信息如下:
|