(1)单片机上的RTOS程序通常分为三个部分:系统核心、驱动程序和用户程序。以STC官方发布的STC32G实验箱的FreeRTOS范例为例,下面是该范例的项目目录树图: 上图中的“FreeRTOS”与“port”部分就是系统核心,其中“FreeRTOS”是与硬件平台无关的任务调度管理和事件队列管理程序,“port”是与硬件平台有关的部分,移植FreeRTOS到某个系列单片机上,就是要根据具体单片机的硬件操作和指令集改写这一部分。
上图中的“user”和“task”部分是用户程序部分,其中“user”部分是STC32实验箱的硬件设置、FreeRTOS系统设置和实时任务的定义,“task”是实现各个实时任务的具体程序。对于大型RTOS,通常每个实时任务一个C语言程序,这里数一数,STC的官方范例有8个实时任务。 上图中的“driver”和“isr”是驱动程序部分。作为官方范例,这个范例给出STC32G单片机的常用片上设备的驱动程序,不管用不用FreeRTOS,这些官方驱动程序很有参考价值。通常单片机的片上设备都支持中断处理,当你设置好某个设备让它完成某个任务后,不必用查询的方法等待它完成,可以离开让CPU去处理其他任务。等设备任务完成后,通过中断服务程序(ISR)来做善后工作。
(2)RTOS中最基本的驱动程序是软件延时:用软件空循环的方法按照用户的指定消耗一定的时间。下面用单片机的另一个入门程序“跑马灯”来介绍一款笔者使用的软件延时程序。下面视频是程序执行的效果:
(3)作为单片机入门程序,本文给出完整的范例程序供大家参考。下面是范例程序的系统定义和初始化部分: 其中第43行程序是打开STC32G实验箱的LED开关。
(4)下图是后台任务部分程序: 其中,在第50行将8位变量m的值取反后送给LED显示,然后第52行调用“uCx51_MCU_Delay_MS”函数延时100毫秒。
(5)下图是一个通用的使用8051指令的单片机的软件延时程序: 这个软件延时函数是用C251语言内嵌汇编语言写的。对于STC32G单片机,Keil的C251编译器可以选择C语言优化等级,对于同一个C语言函数程序,不同的优化等级编译出来的汇编语言程序很可能是不一样的,最高级别的优化会近可能会将函数的局部变量优化为寄存器变量,这样这段C语言就执行得飞快了。 因此,要想编一个通用的不受编译器模式影响的软件延时函数,只能用汇编语言编写。 (6)知识点:在C251的C语言程序中内嵌汇编语言程序,在函数中的标号是全局符号,不同函数中的标号也不能相同,因此建议像上面例子中一样,在标号名中用函数名做前缀。
(7)下图是将C251编译器优化级设置为8级时的测量图: 设置延时100毫秒,实际延时99.99毫秒。
下图是将C251编译器优化级设置为0级时的测量图: 设置延时100毫秒,实际延时100.01毫秒。可见本文用汇编语言写的软件延时方法是不受编译器优化级别的影响的。 下面是本文范例程序: |