0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于M16C62与uC/OS-II的实时多任务系统的设计

电子设计 来源:郭婷 作者:电子设计 2018-12-06 08:05 次阅读

随着微电子技术和网络的发展,人们对网络的认识日益深入。网络终端产品也越来越受到人们的关注,嵌入式操作系统的应用也得到了前所未有的发展,人们对嵌入式的研究也有了长足的进步。基于某个操作系统的实时、多任务系统的设计合应用成为单片机应用的新的发展趋势。

μC/OS-Ⅱ是一个源码公开的实时嵌入式操作系统,它的特点在于公开的源代码,很强的移植性,占先式多任务,每个任务有单独的栈,中断管理及很强的稳定性与可靠性等,目前越来越受到实时嵌入式系统设计者的关注,本文详细讲述了如何把uC/OS-II 操作系统移植到M16C62 单片机中,并给出了以M16C62 单片机为核心处理器构成的一个实时多任务系统的设计方案。

1、uC/OS-II的移植

uC/OS-II采用完全占先式的实时内核,最多可以管理56个任务,每个任务对应一个不同的优先级,因而,uC/OS-II操作系统并不支持时间片轮转调度法。但是全部UC/OS-II的函数调用与服务的执行时间是可知的,也就是,uC/OS-II系统服务的执行时间不依赖于应用程序任务的多少。另外,uC/OS-II中每个任务都有自己单独的栈,每个栈的大小可以根据应用程序的需要进行分配,这样压低了系统对RAM的需求;在中断管理方面,uC/OS-II中的中断可以使正在执行的任务挂起,如果优先级更高的任务被中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,uC/OS-II的中断嵌套可达255层。

uC/OS-II的源码大部分是用可移植性很强的ANSI C 写的。只是和微处理器有关的很小一部分代码是用汇编写的,这样把uC/OS-II移植到MC16C62中就变得相对容易很多,主要是要修改和处理器有关的代码,如:OS-CPU.H、OS-CPU-A.ASM、OS-CPU-C.C。

(1)、OS-CUP.H头文件

OS_CUP.H头文件主要是定义和处理器有关的数据类型,在M16C62中的数据类型包括无符号整型、有符号整型、无符号字符型、有符号字符型等。因此,OS_CPU.H头文件对这些类型进行全新的定义。除了和处理器有关的数据类型定义外,在OS-CUP.H中还作了有关中断禁止、中断允许、堆栈的增长方向等一些简单宏的定义。

(2)、OS-CPU-A.ASM文件

在OS-CPU-A.ASM文件中包含四个汇编语言的函数:OSStartHighRdy()、OSCtxsw()、OSIntCtxsw()、OSTickISR()。在uC/OS-II中处于就绪态的任务的堆栈结构,看起来和刚中断的情形是一样的。要想运行最高优先级任务,移植要做的是就是将所有处理器的寄存器按顺序从任务堆栈中恢复出来,并且通过一条中断返回语句来实现任务的切换。因而,OSStartHighRdy()就是使要恢复的任务堆栈指针指到任务控制块的0偏址的内存单元中。也就是要把保存在任务堆栈中的数据以及CPU寄存器,如R0、R1、R2、R3、A0、A1、SB和FB返回到系统当前的寄存器中,并把当前堆栈指针指到PC指针的位置。

在uC/OS-II中任务的切换问题是通过发软件中断命令或依靠处理器执行陷阱指令来完成的。但是中断服务例程、陷阱或异常处理例程的向量地址必须指向OSCtxSw()。在M16C62单片机中可以通过定义软件中断0来完成任务的切换。因而,在M16C62中的中断向量表中的0号软件中断地址指向OSCtxSW()。对应的中断号为0。

OSInCtxSw()用来在ISR中执行切换功能。由于这个函数本身就是在中断中被调用,因而,在中断处理时寄存器的状态已经都被正确保存了。在OSInCtxSw()函数中要进行堆栈清理工作,只有这样被中断的任务的堆栈内容才能正确返回。

OSTickISR()这个函数时UC/OS-II所要求的时钟基准,即时钟节拍,uC/OS-II的时钟节拍频率在10到100之间,通常为了计算方便而设为整数。在M16C62中有多个定时计数器可以选择用来作为系统的时钟基准。在该系统中利用时钟定时器A0来产生频率为100的一个时钟节拍。OSTickISR()是一个中断响应函数,因而必须在M16C62的中断向量表中,A0的中断向量应分配给OSTickISR(),对应的中断向量号是21。

(3)、OS_CPU_C.C文件

在这个C文件中包含6个简单的C函数,而这6个函数中和移植关系最密切的OSTaskInit()函数,这个函数是用来创建一个任务堆栈。OSTaskCreat()和OSTaskExt()就是通过调用这个函数来初始化任务的堆栈结构的,由此看来,OSTaskInit()是移植的关键。在前面的OS_CPU_A.ASM文件中,任务的切换是通过调用一个软中断0来实现任务切换,通过中断的返回指令使堆栈中的数据返回到CPU寄存器,使最高优先级的任务占有CPU,因而,OSTaskInit()函数要做的就是模拟中断发生时处理器压栈的过程,把CPU的寄存器内容压到任务堆栈中。在M16C62单片机中,系统分为两个堆栈,即:用户堆栈和中断堆栈,而在uC/OS-II进行任务切换是通过软中断0来实现的,因此,uC/OS-II的任务堆栈是M16C62中的中断堆栈。在M16C62中,响应中断后堆栈的状态如图1所示:

基于M16C62与uC/OS-II的实时多任务系统的设计

图1 响应中断后的堆栈状态

中断堆栈中依次保存程序计数器PC和标志寄存器FLG中的内容,因此,在OSTaskStkInit()函数中就是要模拟这样的一个压栈过程。先压入FLAG的高四位和PC指针的高四位,接着压入FLAG低位、PC中间八位和PC的低八位。在保存完PC和FLAG位后就应该为CPU的寄存器FB、SB、A1、A0、R3、R2、R1和R0分配相应存储空间。OSTaskInit()函数返回的是任务堆栈的指针。

2、多任务系统设计

多任务系统的设计是以M16C62单片机为CPU,以uC/OS-II为操作系统构成一个实时多任务系统,系统包括一个基于SPI总线的温度传感器(DS1722)、一个基于I2C总线的实时钟(X1226)、一个LCD(JM202A)和键盘。M16C62工作在微处理器模式,片外扩展一个32K×16位的RAM(Cy7c1021b)和由两片EEPROM(EEP29010-90)构成的存储器。多任务系统的设计主要包括:单片机资源分配和多任务设计两个方面。

(1)、M16C62单片机资源分配

M16C62单片机是一个16位单片机,线性寻址空间是1M,但片内的RAM大小只有3Kbyte,因此要使多任务系统能正常稳定地工作必须合理分配资源。uC/OS-II中所有内核代码必须在RAM区而把系统堆栈区划块到3K RAM 区外。通过对Ncrt0.a30和Sect30.inc这两个M16C62配置文件,可以完成对单片机的资源划分。NC30编译器一开始就会编译Ncrt0.a30和Sect30.inc这两个文件,完成对CPU的初始化,和资源分配,主要包括:存储器空间、RAM区分配、中断向量分配、堆栈区划分等。

(2)、多任务设计

该系统中除了uC/OS-II的空闲任务外,还包括实时钟任务、温度采集任务和键盘中断任务和数据存储任务。实时钟主要是能精确记录系统的日期,任务优先级为10,该任务处于一直工作状态;温度采集任务的优先级为20,主要是完成温度数据的采集;数据存储任务是在温度发生较大变化的时候记录当时的时间和温度,任务优先级为30,在一般情况下这个任务是处在挂起状态,一旦温度变动超过预置范围,温度采集任务就会发出一个有效信号量使处于挂起态的数据存储任务转为就绪态。键盘中断任务是通过M16C62的键盘中断来完成参数的设定,该任务以一个中断处理函数的形式来完成的。系统的程序流程图如图2所示。

基于M16C62与uC/OS-II的实时多任务系统的设计

图2 系统主程序流图

3、结束语

把uC/OS-II移植到M16C62单片机中,并以M16C62单片机为微处理器构成一个实时多任务系统,不仅系统设计简洁、硬件结构相对与51系列单片机来说也要简单,而且具有较强的抗干扰能力和系统稳定性。以M16C62为微处理器,以uC/OS-II为实时操作系统构成的多任务系统能广泛应用在小型实时多任务系统中,具有较好的应用前景。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44521

    浏览量

    633092
  • 嵌入式
    +关注

    关注

    5068

    文章

    19021

    浏览量

    303356
  • 操作系统
    +关注

    关注

    37

    文章

    6742

    浏览量

    123192
收藏 人收藏

    评论

    相关推荐

    UC/OS-II操作系统——任务(一)

    和调度了    ……  }  (2)系统任务(空闲任务和统计任务)   UC/OS-II预定义了
    发表于 02-22 14:40

    uC/OS-II简介

    知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务
    发表于 10-08 09:11

    uC/OS-II简介

    知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务
    发表于 10-11 09:26

    uC/OS-II简介

    知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务
    发表于 10-15 11:03

    uC/OS-II简介

    知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务
    发表于 10-20 09:35

    uC/OS-II简介

    知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务
    发表于 10-25 09:59

    uC/OS-II简介

    知名的CPU 上。严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务
    发表于 10-27 09:29

    uC/OS-II系统开发的6条重要总结

    uC/OS-II是一个简洁、易用的基于优先级的嵌入式抢占式多任务实时内核。尽管它非常简单,但是它的确在很大程度上解放了我的嵌入式开发工作。既然是一个操作系统内核,那么一旦使用它,就会涉
    发表于 04-18 11:44

    uC/OS-II实时操作系统移植技巧

    作者:曾 鸣引言 实时操作系统的使用,能够简化嵌入式系统的应用开发,有效地确保稳定性和可靠性,便于维护和二次开发。 μC/OS-II是一个基
    发表于 07-17 07:07

    uC/OS-II源码包的下载

    ,如下图所示。uC/OS-II内核结构2、对各部分的进一步解释:第一部分 (1):与硬件无关的高层的操作系统部分大部分是关于任务的创建、信号量的创建、邮箱和队列的创建,以...
    发表于 08-05 08:09

    M16C62uC/OS-II嵌入式系统中的应用

    μC/OS-Ⅱ是一个源码公开的实时嵌入式操作系统,它的特点在于公开的源代码,很强的移植性,占先式多任务,每个
    发表于 05-30 09:07 19次下载

    μC/OS-II多任务系统实时性分析与优先级分配

    μC/OS-II多任务系统实时性分析与优先级分配 从产品研发的角度,针对小资源系统中使用μ
    发表于 03-29 15:12 990次阅读
    μ<b class='flag-5'>C</b>/<b class='flag-5'>OS-II</b>的<b class='flag-5'>多任务</b><b class='flag-5'>系统</b><b class='flag-5'>实时</b>性分析与优先级分配

    μC/OS-II实时性能测试与分析

    μC/OS-II实时性能测试与分析 任务切换时间和中断响应时间是嵌入式实时操作系统
    发表于 03-29 15:14 1525次阅读
    μ<b class='flag-5'>C</b>/<b class='flag-5'>OS-II</b><b class='flag-5'>实时</b>性能测试与分析

    μC/OS-II多任务系统实时性解析

    摘要 从产品研发的角度,针对小资源系统中使用C/OS-II实时性和优先级关系进行了分析,提出了可删除任务的灵活应用和可变大小
    发表于 11-06 14:29 2次下载
    μ<b class='flag-5'>C</b>/<b class='flag-5'>OS-II</b>的<b class='flag-5'>多任务</b><b class='flag-5'>系统</b><b class='flag-5'>实时</b>性解析

    如何把uC/OS-II操作系统移植到M16C62单片机中去

    uC/OS-II采用完全占先式的实时内核,最多可以管理56个任务,每个任务对应一个不同的优先级,因而,u
    发表于 03-26 15:25 887次阅读
    如何把<b class='flag-5'>uC</b>/<b class='flag-5'>OS-II</b>操作<b class='flag-5'>系统</b>移植到<b class='flag-5'>M16C62</b>单片机中去