首 页       用户登录  |  用户注册
设为首页
加入收藏
联系我们
按字母检索 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
按声母检索 A B C D E F G H J K L M N O P Q R S T W X Y Z 数字 符号
您的位置: 5VAR论文频道论文中心理工论文电子通信
   uCOS51移植心得[社区]      ★★★ 【字体: 】  
uCOS51移植心得[社区]
收集整理:佚名    来源:本站整理  时间:2009-01-10 22:26:30   点击数:[]    

StkPtr                          SP---->       
*           -----------------------                                 ----------
*                                                                         
*                               ---------- -                       ----------
*                                                                 .   
*                               ----------                           .   
*                                                                 .   
*                               ----------                        ----------
*                                  .    长度                             +1
*                                  .                           ----------
*                                  .               OSStack---->        0
*                               ----------                        ----------
*                                               OSStkStart----> 不关心 -1 低地址
*                               ---------- -                       ----------
*                      \-------->  长度  低地址                   系统堆栈
*                                ----------
*                                 用户堆栈              长度=SP-OSStkStart
********************************************************************

       TCB结构体中OSTCBStkPtr总是指向用户堆栈最低地址,该地址空间内存放用户堆栈长度,其上空间存放系统堆栈映像,即:用户堆栈空间大小=系统堆栈空间大小+1。

       SP总是先加1再存数据,因此,SP初始时指向系统堆栈起始地址(OSStack)减1处(OSStkStart)。很明显系统堆栈存储空间大小=SP-OSStkStart。

       任务切换时,先保存当前任务堆栈内容。方法是:用SP-OSStkStart得出保存字节数,将其写入用户堆栈最低地址内,以用户堆栈最低地址为起址,以OSStkStart为系统堆栈起址,由系统栈向用户栈拷贝数据,循环SP-OSStkStart次,每次拷贝前先将各自栈指针增1。

       其次,恢复最高优先级任务系统堆栈。方法是:获得最高优先级任务用户堆栈最低地址,从中取出“长度”,以最高优先级任务用户堆栈最低地址为起址,以OSStkStart为系统堆栈起址,由用户栈向系统栈拷贝数据,循环“长度”数值指示的次数,每次拷贝前先将各自栈指针增1。

       用户堆栈初始化时从下向上依次保存:用户堆栈长度(15),PCL,PCH,PSW,ACC,B,DPL,DPH,R0,R1,R2,R3,R4,R5,R6,R7。不保存SP,任务切换时根据用户堆栈长度计算得出。

       OSTaskStkInit函数总是返回用户栈最低地址。

       操作系统tick时钟我使用了51单片机的T0定时器,它的初始化代码用C写在了本文件中。

       最后还有几点必须注意的事项。本来原则上我们不用修改与处理器无关的代码,但是由于KEIL编译器的特殊性,这些代码仍要多处改动。因为KEIL缺省情况下编译的代码不可重入,而多任务系统要求并发操作导致重入,所以要在每个C函数及其声明后标注reentrant关键字。另外,“pdata”、“data”在uCOS中用做一些函数的形参,但它同时又是KEIL的关键字,会导致编译错误,我通过把“pdata”改成“ppdata”,“data”改成“ddata”解决了此问题。OSTCBCur、OSTCBHighRdy、OSRunning、OSPrioCur、OSPrioHighRdy这几个变量在汇编程序中用到了,为了使用Ri访问而不用DPTR,应该用KEIL扩展关键字IDATA将它们定义在内部RAM中。

    (4)重写OS_CPU_A.ASM
       A51宏汇编的大致结构如下:
       NAME 模块名    ;与文件名无关
       ;定义重定位段   必须按照C51格式定义,汇编遵守C51规范。段名格式为:?PR?函数名?模块名
       ;声明引用全局变量和外部子程序  注意关键字为“EXTRN”没有‘E’
           全局变量名直接引用
           无参数/无寄存器参数函数 FUNC
           带寄存器参数函数      _FUNC
           重入函数            _?FUNC
       ;分配堆栈空间
           只关心大小,堆栈起点由keil决定,通过标号可以获得keil分配的SP起点。切莫自己分配堆栈起点,只要用DS通知KEIL预留堆栈空间即可。
           ?STACK段名与STARTUP.A51中的段名相同,这意味着KEIL在LINK时将把两个同名段拼在一起,我预留了40H个字节,STARTUP.A51预留了1个字节,LINK完成后堆栈段总长为41H。查看yy.m51知KEIL将堆栈起点定在21H,长度41H,处于内部RAM中。
       ;定义宏
           宏名 MACRO  实体  ENDM
       ;子程序
           OSStartHighRdy
           OSCtxSw
           OSIntCtxSw
           OSTickISR
           SerialISR
       END           ;声明汇编源文件结束
      
       一般指针占3字节。+0类型+1高8位数据+2低8位数据 详见C51.PDF第178页
       低位地址存高8位值,高位地址存低8位值。例如0x1234,基址+0:0x12 基址+1:0x34
      
    (5)移植串口驱动程序

       在此之前我写过基于中断的串口驱动程序,包括打印字节/字/长字/字符串,读串口,初始化串口/缓冲区。把它改成重入函数即可直接使用。

       系统提供的显示函数是并发的,它不是直接显示到串口,而是先输出到显存,用户不必担心IO慢速操作影响程序运行。串口输入也采用了同样的技术,他使得用户在CPU忙于处理其他任务时照样可以盲打输入命令。

    (6)编写测试程序Demo(YY.C)

       Demo程序创建了3个任务A、B、C优先级分别为2、3、4,A每秒显示一次,B每3秒显示一次,C每6秒显示一次。从显示结果看,显示3个A后显示1个B,显示6个A和2个B后显示1个C,结果显然正确。
       显示结果如下:
       AAAAAA111111 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       BBBBBB333333 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       BBBBBB333333 is active
       CCCCCC666666 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       BBBBBB333333 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       AAAAAA111111 is active
       BBBBBB333333 is active
       CCCCCC666666 is active

上一页  [1] [2] [3] [4]  下一页


Tags:


文章转载请注明来源于:5VAR论文频道 http://paper.5var.com。本站内容整理自互联网,如有问题或合作请Email至:support@5var.com
或联系QQ37750965
提供人:佚名
  • 上一篇文章:基于RTOS的智能交通灯设计方法

  • 下一篇文章:在MIPS开发板上建立Linux系统及开发环境
  • 返回上一页】【打 印】【关闭窗口
    中查找“uCOS51移植心得[社区]”更多相关内容 5VAR论文频道
    中查找“uCOS51移植心得[社区]”更多相关内容 5VAR论文频道
    最新热点 最新推荐 相关新闻
  • ››嵌入式系统的通信规约管理平台设计...
  • ››一种基于七号信令的局间话单采集系...
  • ››对于变频器的制动技术分析
  • ››电子文件管理元数据宏观结构多维分...
  • ››浅论卫星电视接收机的常见故障的检...
  • ››信息时代网络用户信息检索焦虑的心...
  • ››论GIS在高校房产管理中的实际应用
  • ››关于电力通信发展战略的思考 金李莎...
  • ››2G、3G切换精细化优化分析思路探讨...
  • ››光纤自动化生产的需求与时机
  • ››ucos+lwip应用心得[社区]
  • ››uCOS51移植心得[社区]
  •   文章-网友评论:(评论内容只代表网友观点,与本站立场无关!)
    关于本站 - 网站帮助 - 广告合作 - 下载声明 - 网站地图
    Copyright © 2006-2033 5Var.Com. All Rights Reserved .