μC/OS-Ⅱ在C8051F系列单片机上的移植及其应用系统开发

时间:2022-10-14 09:26:31

μC/OS-Ⅱ在C8051F系列单片机上的移植及其应用系统开发

随着微处理器技术的飞速发展和嵌入式系统实时性要求的不断提高,应用实时多任务操作系统(RTOS)作为嵌入式设计的开发平台已逐步成为嵌入式应用设计的主流。本研究讨论将μC/OS-Ⅱ移植到C8051F系列高性能8位单片机中,并以C8051F060为例阐述了其应用系统的开发过程。

一、μC/OS-Ⅱ的基本工作原理

1.任务管理

µC/OS-II中的任务可以是一个无限的循环,也可以在一次执行完毕后被“删除”掉,即该任务可以认为CPU完全属于该任务本身,实时应用程序的设计过程包括将问题分割为多个任务。µC/OS-II可以管理64个任务,每个任务有一定的优先级,且优先级不重复。

2.任务调度机制的实现

µC/OS-II是可剥夺型内核,优先级高的任务一旦就绪就能剥夺优先级较低任务的CPU使用权,这提高了系统的实时响应能力。在没有中断情况下,任务间的切换一般会调用OSSched()函数。µC/OS-II的中断服务子程序和一般前/后台的操作有所不同。

3.任务之间的通信

在µC/OS-II中,可以通过信号量、消息邮箱和消息队列等机制,实现数据共享和任务通信。消息邮箱用一个指针型变量,一个任务或一个中断服务子程序通过内核服务,将一则消息放入邮箱,一个或多个任务通过内核服务接受这则消息。每个邮箱有相应的等待消息任务表,等待消息的任务在无消息时被置挂起态,并记入邮箱等待消息任务表中。消息放入邮箱,内核将运行等待消息任务表中优先级最高的任务。

二、移植及应用

C8051F060系列单片机特别适用于任务繁重的小型化测控系统。当芯片具有的功能被较多地使用时,系统要处理的任务就较多,编程头绪也多。为了简化应用程序实现程序模块化,提高应用程序的实时性和可靠性,将μCOS2Ⅱ移植到C8051F060中就成为一件很有意义的事。

1.µC/OS-II的移植

(1)修改INCLUDES.H文件:增加的头文件放在头文件列表的最后。

#include "os_cpu.h"

#include "os_cfg.h"

#include "ucos_ii.h"

(2)修改OS CPU.H文件:为确保系统在KEIL环境下正常运行,重新定义了一系列与C8051F060和KEIL编译器相关的数据结构、宏和常数。

typedef unsigned char OS_STK;/*定义堆栈宽度为8位*/

typedef unsigned char OS_CPU_SR;

#define OS_ENTER_CRITICAL() EA="0"

#define OS_EXIT CRITICAL()EA="1"

(3)修改OS_CPU_A.ASM文件

①编写OSSTartHihgRdy()函数:获得将要恢复运行的就绪任务的堆栈映像的最低地址,并计算出堆栈长度,然后向系统堆栈复制数据、堆栈指针SP和堆栈映像指针?C_XBP,最后利用中断返回。

②编写OSCtxSw()函数:先从当前任务的TCB控制块中获得当前任务堆栈长度和堆栈映像指针,然后将系统堆栈的内容复制到任务堆栈映像,最后获得将要恢复运行的就绪任务的TCB,程序跳至OSSTartHihgRdy()函数的入口,实现任务的切换。

③编写OSIntCtxSw()函数:代码大部分与OSCtxSw()相同,不同之处在于此处不需要再保存寄存器;需要调整堆栈指针(SP=SP-4),去掉在调用OSIntExit(),OSIntCtxSw()中压入堆栈中的多余的内容,以使堆栈中只包含任务的运行环境。

④编写OSTickISR()函数:用定时器0作中断源,初始化定时器0使系统每秒中断100次,节拍率Tick=100次/秒。

(4)修改OS_CPU_C.C文件:编写OSTaskStkInit()函数用来初始化堆栈。

2. 基于µC/OS-II的C8051F060应用系统开发

移植了µC/OS-II的C8051F060的每个功能都可以作为一个独立的任务,每个任务都有自己的堆栈空间,可以被其他任务和中断服务程序挂起。在设计中,主函数均以OSInit()开始,以OSStart()结束,中间部分为与硬件相关的系统初始化函数。对于任务的建立,必须依照µC/OS-II系统中建立任务的格式,根据自己的需求来确定任务的个数,并且根据任务的重要程度和被调用的频率来设置好优先级。创建好任务后,在主函数外面分别列出各个任务函数,每个任务函数都是一个无限循环程序,调用实现某些功能的应用程序函数,然后按设计的需求设置挂起方式和挂起时间。

应用系统测试程序实现了6个任务:Task1是每1s发送CAN数据包,Task2是处理CAN接收到的数据,Task3是每3s发送串口数据,Task4是处理串口接收到的数据,Task5是处理按键信息,Task6是显示数据。CAN总线接收采用中断方式,其优先级高于其他任务,为了保证系统的实时性,在中断程序中不处理数据,只是发送一个信号量,在Task2中处理CAN数据。串口数据接收亦采用中断方式,其优先级低于CAN高于其他任务。串口数据发送采用的是查询方式,按字节发送。程序中设置6个任务的优先级依次为13,11,14,12,15,16。

在主程序中,首先初始化C8051F060和CAN,调用OsInit();然后调用API函数,创建6个任务(不包括空闲任务);再创建一个信号量CAN_EVENT,为中断与Task2通信所用;最后调用OSStart(),OS系统开始运行优先级最高的任务。Task2的优先级最高,但是在没收到CAN_EVENT之前,任务一直处于休眠状态,当CAN接收器收到数据包后,Task2进入就绪态,在中断返回时,进行任务切换,执行优先级最高Task2。在Task2还未收到信号量之前,Task1、Task3、Task4、Task5和Task6根据时间延时和优先级的不同各自独立运行。

三、结束语

将编写的测试程序下载到C8051F060应用系统中进行了实际的运行测试,测试表明,基于µC/OS-II的C8051F060应用系统中的各任务工作稳定可靠,取得了满意的效果,为进行嵌入式应用系统的进一步设计奠定了基础。

(作者单位:黑龙江省大庆职业学院)

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

上一篇:《计算机组装与维护课程》“小组合作学习”教... 下一篇:抗干扰设计方案在PLC控制系统中的应用