• 首页 |  
  • 查询 |  
  • 供应 |  
  • 求购 |  
  • 资讯 |  
  • 产品中心 |  
  • 技术应用 |  
  • 商务中心 |  
  • IC供货商 |  
  • 下载中心 |  
  • 求职招聘 |  
  • 论坛 |  
  • 博客
  • 您所在的位置: 首页 > 新闻资讯 > 科技成果 > 正文
    文章搜索:
    实时操作系统μC/OS-II在AT89S52上的移植

    http://www.ic36.com 2007年8月27日9:47
           1引言
          实时操作系统是为微处理器或微控制器管理设计的底层软件。在嵌人式应用中,使用实时操作系统的最主要目的是增加系统的可靠性,提高开发效率、缩短开发周期。μC/OS-II是一个可移植(portable)、可固化的(romable)和占先式的(preemptive)实时内核,最多可以管理64个任务(用户最多可以设计56任务)。μC/oS-II的源代码公开,绝大部分代码使用标准的ANSIC:

     
    清华微电子推出高频管分立器件裸片,已做到9G截止频率

    书写,所以可以方便地移植到很多不同种类的处理器或控制器上。用户可以免费从相关网站下载源代码。
          目前,51系列的单片机在世界范围内有着广泛的应用。AT89S52是ATMEL公司利用51内核生产的一款FLASH型8位微控制器。控制器内部集成了8 kB的FLASH,256 B RAM,3个16位定时计数器,4组8位并行口,1个全双工可编程串行口。
          笔者在用AT89S52单片机设计多路数据采集器时,在编译器KEIL环境下,成功地把μC/OS-II移植到AT89S52单片机上面。下面论述如何将μC/OS-II移植到AT89S52上。
          2移植条件和必要步骤
          μc/OS-II要求微处理器有堆栈指针、有CPU内部人栈与出栈指令以及一定容量的硬件堆栈。AT89S52能够满足这些要求。
          μC/OS-II在设计的时候充分考虑了可移植性。移植工作包括在OS CPU.H中设置1个常量、声明几个数据类型、声明3个宏,在OS CPU C.C中写6个简单的C函数,以及在OS CPU A.ASM中写几个汇编语言函数。
          3移植的主要过程
          3.1 OS CPU.H的编写
          OS CPU.H需要规定栈的增长方向。这里定义常量OS STK GROWTH为0,表明栈的增长方向向上。
          用户要用到的变量类型应该在这里定义,同时必须注意KEIL对C语言的扩展。笔者只定义了以下几种变量类型。
     
    最后还需要声明OS-TASK-SW()宏。 
          #define OS TASK SW() OSCtxSw()
          3.2 OS CPU C.C中相关函数的编写
          在(OS CPU C.C)中要写几个C函数(OS CPUC.C)。这几个C函数包括OSTaskStklnit(),OSTaskCreateHook(),OSTaskDelHook(),()STaskSwHook(),OSTaskStatHook(),OSTimeTickHook()。他们中除了OSTaskStkInit()外都是用户根据自己的需要定义的,可以没有任何内容。下面着重讨论OSTaskStklnit()。
          函数OSTaskStklnit()由任务创建函数OSTaskCreate()或()STaskCreateExt(),在建立每个任务的时候初始化任务堆栈。初始化后的任务堆栈看起来就像刚刚发生中断一样。开始运行这个任务就是模拟中断返回,把初始化后堆栈的各个值恢复给各个寄存器。所以初始化任务堆栈就是在任务堆栈中模拟发生过1次中断后的堆栈结构,按照中断后的进栈次序预留各个寄存器的存储空间,还要在这些存储空间里面放上恰当的初值。用户堆栈初始化时从下向上依次保存:用户堆栈长度,PCL,PCH,PSW,ACC,B,DPL,DPH,R0,R1,R2,R3,R4,R5,R6,R7。
          初始化任务栈的时候,需要传递任务代码起始指针(task)、参数指针(pdata)、任务堆栈顶端的地址(就是堆栈栈顶指针ptos)。任务栈初始化完成后,返回1个新的堆栈栈顶指针,OSTaskcreate()或OSTaskCreateExt()将他保存到OS TCB中去。OSTaskStklnit()的程序清单如下:
          OS STK*OSTaskStklnit(void(*task)(void*pd),void*
          ppdata,OS STK *ptos,INTl 6U opt)reentrant
    3.3 OS_CPU_A.ASM中相关函数的编写
          在OS CPU A.ASM中要写几个汇编语言的程序。这几个汇编程序包括OSStARtHIghRdy(),OSTIckISR(),OSCtxSw()和OSIntCtxSw()。限于篇幅,笔者在这里只给出了OaNtARtHIghRdy()和OSTIckISR()的程序代码。
          这里先介绍4个宏:PUSHALL,POPALL,SAVESTFACK和RESTORESACK。PUSHALL的作用是把当前所有寄存器的内容以保存到系统栈中;POPALL的作用是在任务切换之前从系统堆栈恢复所有的寄存器中的内容;SAVESTACK的作用把系统栈的内容保存到任务栈(片外RAM);RESTORESTACK的作用把任务栈的内容复制到系统栈(片内)。在本设计中,由于AT89S52单片机的片内RAM有限,所以把任务栈设计在了片外。 
          OSStARtHIghRdy()的作用是使处于就绪状态的任务开始运行。在这个函数中调用钩子函数OSTaskSwHook(),这个函数可以让用户扩展系统的功能。然后获得优先级最高的任务的指针,根据这个指针从要开始运行任务的任务堆栈中恢复所有寄存器,恢复完后执行1次中断返回(AT89S52单片机没有直接改变PC的指令),程序就开始运行就绪状态任务了。OSStARtHIghRdy()的程序清单如下:
    OSTIcKISR()μC/OS-Ⅱ中的时钟节拍中断服务程序。μC/OS-Ⅱ需要用户提供周期性信号源,用于实现时间延时和确认超时。μC/OS-Ⅱ中的时钟节拍服务是通过在中断服务子程序OSTIcklSR()中调用OSTimeTick()来实现的。OSTIcklSR()的程序清单如下:
     
          OSCtxSw()用在任务级的切换场合。当需要从低优先级的任务切换到高优先级的任务时或当前任务自动放弃CPU时,先保存处理器的内容到当前任务的任务堆栈。再调用钩子函数OSTaskSwHook。然后从要开始任务的任务堆栈里恢复所有寄存器和PC的值,最后执行中断返回指令开始运行新的任务。 
    OSIntCtxSw()用于中断级的任务切换。在μC/OS-Ⅱ中,中断发生后,有时会激活优先级比被中断的任务更高的任务,此时就需要任务切换,将调用OSIntCtxSw()。OSIntCtxSw()是在OSIntExit()中被调用的。
          4 结 语
          在移植过程中有几个地方必须注意:由于AT89852单片机的程序存储器和数据存储器容量有限,所以必须扩展片外ROM和RAM,必须把系统和用户程序对ROM和RAM的需求量都考虑在内,并留有一定的余量。为了更好地利用系统功能,还必须对OS CFG.H中的常量进行相关的设置。随着嵌入式技术的不断发展,相信μC/OS-Ⅱ将有更加广泛的应用。

    (关键词):操作系统 μC/OS-II 移植

    IC型号速查
    [0]  [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9]  [A]  [B]  [C]  [D]  [E]  [F]  [G]  [H]
    [I]  [J]  [K]  [L]  [M]  [N]  [O]  [P]  [Q]  [R]  [S]  [T]  [U]  [V]  [W]  [X]  [Y]  [Z]
    相关链接
    嵌入式系统µC/OS-II在LPC2119上的移植方法和技巧 2006-8-21 14:04:08
    中国即将拥有自主研发的3G手机操作系统2006-7-31 17:31:34
    中国即将拥有自主研发的3G手机操作系统2006-8-1 11:40:08
    基于LPC2104的爬壁机器人控制系统设计2006-8-19 10:12:55
    TCP/IP协议栈在MSP430单片机上的实现2006-9-30 11:17:09
    微软今日停止支持XP-SP1有利于Vista普及2006-10-10 11:11:45
    移植来的创意如何获得300万销售额?2006-9-1 14:03:32
    uC/OS-II在ARM系统上的移植与实现2006-9-16 9:10:18
     我来评两句
    查看最新评论〗 

    昵称:  匿名
    请您注意:
    ·遵守中华人民共和国的各项有关法律法规
    ·承担一切因您的行为而导致的法律责任
    ·本网留言板管理人员有权删除其管辖留言内容
    ·您在本网的留言,本网有权在网站内转载或引用
    ·参与本留言即表明您已经阅读并接受上述条款

    芯片之家  电子之家  电子元器件之家  半导体之家  微电子之家 
    ·免费发布紧急IC求购 ·到哪里找工厂求购 ·全球最好十个IC网站 ·我为什么选择IC36
    ·IC是怎样炼成的 ·想知道所有的IC封装吗 ·如何鉴别旧货刷新货 ·芯片的前缀代表什么
    ·IC行业的网站体验 ·元器件常见问题解答 ·这里居然可以实时洽谈 ·有问必有答
    ·IC行业之25颗钻石 ·IC代理商查询 ·十家最牛的公司 ·中国IC公司200强
    元器件之家  晶圆之家  集成电路之家  电子元件之家  模块之家  电子管之家
    ·舍我其谁的高级会员 ·IC36是怎样收费的 ·网站广告是如何占领的 ·IC之家的增值服务
    ·我该到哪里去找工作 ·到哪里去招人呢 ·今日芯片需求排行 ·还有我们没有的型号吗
    ·中国IC行业的害群之马 ·中国最优秀的IC供应商 ·国外的IC骗子公司 ·信誉良好的IC供货商
    ·谁是IC之家的明星 ·做我们的代理吧 ·免费注册 机不可失 ·广告热线 010-51653935
    热 点 专 题
    热 点 论 坛
    关于我们 | 增值服务 | 免责条款 | 收费标准 | 付款方式 | 广告服务 | 网站地图 | 联系我们 | 友情链接 | 网站代理
    MSN:ic36@hotmail.com  QQ:IC之家 在线咨询  联系电话:(010)51653935 传真:(010)51653936 客户服务:service@ic36.com
    Copyright © 2003-2006 IC36.COM IC之家 本网站中文域名:IC之家 芯片之家
    京ICP证060068号