一、背景
几年前,为了给学生学习单片机编程提供方便的控制材料,我设计了一个轮子驱动单元。它的最大特点是集成了电机驱动和码盘反馈,使用了几条TTL电平线。可以驱动,类似于舵机的驱动器。这样,您就可以根据自己的喜好和需求来选择核心板驱动程序了。
可用于构建不同驱动方式的汽车底盘。最简单的驱动方式是利用车轮驱动装置和转向器实现的“单轮驱动转向车”。它的移动方式与现实世界中的类似。电动叉车类似
由于这种驱动方式中汽车的转向和行走两个主要控制元件是相互独立的,因此从学习编程的角度来看,它比两轮差速驱动方式更简单、容易。
当时的目标是降低学习门槛,所以选择了Arduino作为控制器。为了方便接线,我选择了市面上的Nano扩展板。其外观与UNO相同,只是每个IO都配有地线和电源端子。用杜邦线连接非常方便。
后来感觉Arduino Nano控制器资源太少,所以考虑改用主流的STM32F103C8T6核心板。不过Nano扩展板的想法不错,所以我参考它为STM32F103C8核心板设计了一个扩展板。
由于大环境的影响,国产操作系统受到重视。在RTOS领域,RT-Thread无疑是国产系统中的佼佼者。因此,我萌生了在汽车平台上尝试的想法。既然有可以方便使用的STM32F103C8扩展板,并且有兼容STM32F103C8核心板的STM32F411CE核心板,那么小车的控制也应该改进,运行我们自己的RTOS。
下面将实现过程完整记录下来,希望对想要选择RT-Thread开发产品的朋友有所帮助,因为小车控制具有比较高的实时性要求和真正的多任务要求,这与HMI(人机界面)不同机接口)应用程序。可以通过事件驱动,没有那么强的实时性和并发性要求。
2. 目标
按照实时多任务的思想,基于RT-Thread,完成小车行驶,通过串口(蓝牙透传)即可控制小车运动。
因为RT-Thread的特点是有丰富的可扩展的组件和软件包,但要享受这些,就必须是标准版本;如果使用Nano版本,与FreeRTOS没有太大区别。因此,选择RT-Thread标准版本。
三、实施过程
3.1 总体思路和任务设计
我做项目的时候,一般都会先构思程序框架,合理拆解需要完成的功能,根据功能确定框架。
如果选择成熟的RTOS,你只有实现多任务的手段和工具,但程序框架还是需要自己设计。
对于基于RTOS的程序,首先要设计的是任务(RT-Thread中的线程)。根据RTOS提供的工具和想要实现的功能,合理划分任务,创建相应的线程,并确定线程之间的交互方式和内容,从而完成一个基于RTOS的多任务控制程序。
任务划分的首要目标是相对独立,即构建的任务是完整的,有明确的输入消息和输出结果,它们的工作只是对输入进行相应的处理并给出输出,中间过程不受影响受其他因素影响。
其次,任务可以一次性完成,不需要中间长时间的等待操作。任务通常处于等待输入的状态。接收到输入后,立即完成对输入的处理,输出结果,然后再次回到等待输入的状态。
这样的设计主要是因为所谓的多任务操作。从表面上看,每个任务都是连续执行的。事实上,MCU仍然以分时的方式处理各个任务,只是通过RTOS在后台进行切换。
RTOS的调度方法决定了每个任务的分配时间和响应速度。虽然各个RTOS的调度方式不同,但都遵循一个原则:即处于等待状态的任务不分配运行时间,使程序达到最优效率。
使用RTOS的等待消息功能是为了通知OS我当前“很好”,正在等待新消息。
这样构建任务既保证了程序的执行效率和实时性,又方便调试。您可以手动注入消息来触发任务执行,并观察输出结果是否符合设计。它可以采用多模块方法,每个模块一个任务,单独编写并由多人完成。
基于RTOS编程,考虑到其多任务特性,通常需要先创建一个基本框架,然后根据不同场景设计相应的任务。
所谓“基本框架”就是结合单片机应用的特点,融入一些通用的要求,这样每次做新的项目时都可以在此基础上增加新的功能。
基本框架包括:
1)串口命令接收:作为人机交互通道,取代了以往通过按键实现的程序控制方式。可以利用PC、手机等交互方式丰富的设备生成操作指令,比物理按键更加灵活、直观、丰富。
2)串口数据传输:作为人机交互通道,不再是以前通过显示器输出的信息,也可以被PC、手机等设备接收并显示。界面设计远比显示屏灵活、丰富、任意。之所以将接收和发送分开,是因为输出的信息需要服务于所有任务,这样功能设计才能更加合理。
3)调试信息输出任务:当IDE调试不可用或无法使用时,需要在程序中输出相应的调试信息,以实现Debug;不过RT-Thread内置的Finsh已经很完善了,所以不再需要使用RT-Thread。设计这个任务是RT-Thread的优点之一。
4)护理任务:利用RTOS的信息交换机制,周期性地与各个任务交换信息。当没有反应时,解释相应的