本帖最后由 杨为民 于 2024-3-31 10:48 编辑
一、简 介 (1)uC/OS-II分三个重要部分:下层硬件接口、任务调度核心和任务间协调工作。uC/OS-II程序框架设计巧妙,通常只需要改写下层硬件接口就可以将uC/OS-II移植到新的单片机上了,目前将uC/OS-II移植到8051类单片机上有多个版本都只是改写了这个部分。 下层硬件接口中最重要的部分是两个任务切换函数:在中断程序中使用的“中断内任务切换”函数“OSIntCtxSw()”和在非中断程序中使用的“任务内任务切换” 函数“OSCtxSw()”。 (2)最原始的uC/OS-II移植例子是使用80x86的CPU,这两个任务切换函数都是利用80x86指令集里的“软中断指令”实现的。由于8051指令集里面没有“软中断指令”,所以以前移植到8051单片机上的uC/OS-II都采用了“程序实现”的方法,我发表的系列移植帖子也都是介绍这种方法的。 (3)STC32G/F系列单片机采用了80251指令集作为基本指令集,80251指令集里面有一个供构造RTOS这类操作系统的软中断指令“TRAP”,但这个TRAP指令目前在STC32G/F系列单片机上还没有对用户开发,因此笔者在将uC/OS-II移植到STC32G单片机上的时候仍然采用了和移植到STC8H单片机上一样的“程序实现法”。 (4)最近坛友“挑战者”(网名“tzz1983”)在论坛里提供他在STC32G单片机上实现的“C251-UCOSII”移植版,其中他采用了利用定时器4硬件中断代替软中断的方法(以后称这种方法为“替代法”)。这种替代法具有明显的两个优点:程序简明易懂和任务切换速度很快。 本文将介绍挑战者坛友在STC32G单片机移植uC/OS-II的新方法:“替代法”的具体实现程序和实测任务切换速度比较。 二、替代法的实现方法 替代法是在STC32G单片机上用硬中断替代软中断实现任务切换的方法,本节介绍挑战者实现的程序方法。 (5)uC/OS-II核心代码中的两个任务调度函数“OSIntExit()”和“OS_Sched”中分别使用了任务切换函数宏“OSIntCtxSw()”和“OS_TASK_SW()” (6)上面的两个宏定义在“OS_CPU.h”中定义: 这三个宏定义都指向一个宏定义“PendSv_GenerateSWInterrupt()”,这个就是替代法的软中断。它的定义如下: 最终落实为一行C语言语句:“T4IF=1;”
(7)在定时器4的中断标志被设置起来后,当中断允许(EA=1)的时候,就会产生定时器4中断,这个中断的ISR如下: 其中第95行和第139行是供逻辑分析仪测试的信号。 整个任务的ISR分为6个部分:当前任务的寄存器现场存入系统堆栈,保存系统堆栈指针SP到任务堆栈中,将就绪任务中最高优先级的任务设置为当前任务,将任务堆栈中保存的SP恢复为系统堆栈指针,从系统堆栈中恢复任务现场寄存器,最后使用“RETI”指令将CPU控制权交到新任务手中。 (8)为了测试替代法的任务切换速度,本文范例硬件采用了最简单的“降龙棍”作为STC32G单片机的开发板。测试范例只使用开发板上的LED灯作为实时任务的视觉显示,同时使用P2端口连接一个8通道逻辑分析仪来显示各个任务的时序关系以及测量各种性能指标。
下面是测试范例程序运行的效果视频:
从视频中可以看到开机时的LED闪烁LOGO,可以看到开发板左上部的P0端口LED的交替闪烁(任务A),左下部的P1端口LED的左右闪烁(任务B),右下部的P3端口LED的跑马灯(任务C),以及右上部的P2端口逻辑分析仪的LED闪烁。
下图是6.5秒逻辑分析仪的整体截屏: 图中第0通道是1KHz的定时器0中断信号(系统任务切换中断), 第1通道是中断任务切换信号,同时也是非中断任务切换信号。 第2通道是任务A信号。 第4通道是任务B信号。 第5通道是任务C信号。 三、替代法的任务切换时间
(9)下图是第1通道的任务切换信号的放大图: 前面一个是替代法的非中断任务切换信号,经过测量为1.375微秒(33M主频),后面一个是替代法的中断任务切换信号,经过测量为1.125微秒(33M主频)。 (10)微山x51-uCOSII是笔者用传统的“程序法”在STC32G单片机上移植的uC/OS-II系统,同样的测试程序和同样的主频,这两个任务切换时间分别为4.000和3.375微秒。 (11)结论:与传统的8051方法相比,挑战者坛友采用替代法移植的uC/OS-II系统的任务切换速度是程序法的三倍。
下面是采用替代法的STC32G单片机上的uC/OS-II的任务切换速度测试程序: 下面是采用传统8051程序法的STC32G单片机上的uC/OS-II的任务切换速度测试程序:
|