导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[gdtyy]C51编程:uCOS51移植心得



No.11825
作者:gdtyy
邮件:gdtyy@ri.gdt.com.cn
ID:577
登陆:14次
文章数:44篇
最后登陆IP:221.216.12.86
最后登陆:2006/6/30 22:03:44
注册:2002/8/9 15:33:00
财富:127
发帖时间:2002/10/3 23:35:00
发贴者IP:211.159.152.84
标题:gdtyy:C51编程:uCOS51移植心得
摘要:No.11825C51编程:uCOS51移植心得                  uCOS51移植心得
           asdjf@163.com 2002/10/03
  
    前一段时间,我参与了一个SNMP网管板的项目,我负责硬件设计和单板软件开发。该板的硬
件由MCS51+RTL8019AS组成,有64K FLASH 和64K SRAM。软件部分有操作系统和TCPIP协议栈。
硬件比较简单,用了一个月就搞定了,协议栈我参考了老古开发板的部分程序又上网找了SNMP源
代码也很快完成了,但是测试时发现当使用较低时钟频率的CPU时(为了降低成本),由于ASN.1
编解码部分过于庞大,而我的程序又是一个大循环,AGENT的响应速度受到严重影响,用户界面也
反应迟钝。更坏的消息是公司为了适应市场需求,还要在上面跑PPP和  <a href=HTTP target=_blank>  HTTP  </a>  。那样的话,我就得
用40MHz的AT89C51RD2或者人为的把程序断成几部分然后用状态机的方法在运行时再把它们连接
起来。不过,我不想增加成本,也不想把程序搞乱,迫不得已,只好使用操作系统。
    说实在的,一开始我也不是很有把握,一来我不清楚51的FLASH是否装得下这么多代码,二
来我只做过OS应用开发,对于它的移植想都不敢想。不过,我在BBS上搜索了一阵儿后还是有了一
些头绪。我找到了几个OS的源代码(我喜欢用现成的),按照代码大小、实时性、使用人数、众
人口碑等标准,最后选定了uCOS2。我感觉它的实时性有保障,延时可预测,代码据说可小到
2K,网上讨论这个话题的人也比较多,而且它的网站上有针对KEIL C51的移植实例。
    经过一番查找,我得到了5个版本。其中3个是用KEIL编译的。本来我想直接把OS代码嵌到应
用程序中,但后来发现没有一个可以直接使用。有的无法用KEIL直接编译,有的需要修改DLL在
软件仿真下使用。而我需要的是能在串口输入输出,不需要修改任何无关软件,能在软件仿真和
硬件上运行的实时多任务操作系统。没有办法,我只好硬着头皮去改编。
    我分析了自己的劣势:1。KEIL刚开始使用,不太熟悉;2。混合编程以前从没有作过;3。
时间紧迫,要在1个月内搞定。而我的优势就是有5个移植实例可供参考,可以上网查资料。一开
始,我用“堆栈”、“混合编程”、“汇编”、“ucos”等关键字在C51BBS和老古论坛上检索相
关信息并逐条阅读,读过之后,头脑中的思路逐渐清晰了。我了解到在KEIL的HLP目录下有
A51.PDF和C51.PDF非常全面的介绍了汇编和C51,是KEIL的权威用户手册;SP初始化、内存清0
等操作在STARTUP.A51文件中实现,用户可以改写它;KEIL的变量,子程序等的分配信息可以
在.M51文件里查到;KEIL自己的论坛里有很多疑难问题的解答……通过阅读并经过思考,解决了
堆栈起点、堆栈空间大小的设定等关键问题。论坛里的问题有些是我没有想到的,这使我发现了
自己的疏漏。
    在网上获得大量信息后,我开始阅读《uCOSII》中文版,一共读了3遍。第一遍是浏览,了
解到uCOSII包括任务调度、时间管理、内存管理、资源管理(信号量、邮箱、消息队列)四大部
分,没有文件系统、网络接口、输入输出界面。它的移植只与4个文件相关:汇编文件
(OS_CPU_A.ASM)、处理器相关C文件(OS_CPU.H、OS_CPU_C.C)和配置文件(OS_CFG.H)。
有64个优先级,系统占用8个,用户可创建56个任务,不支持时间片轮转。第二遍主要是把整个工
作过程在头脑里过了一下,不懂地方有针对性的查书,重点是思考工作原理和流程。我发现其实
它的思路挺简单的。就是 “近似地每时每刻总是让优先级最高的任务处于运行状态” 。为了保
证这一点,它在调用系统API函数、中断结束、定时中断结束时总是执行调度算法。原作者通过事
先计算好数据,简化了运算量,通过精心设计就绪表结构,使得延时可预知。任务的切换是通过
模拟一次中断实现的。第三遍重点看了移植部分的内容。对照实例,研究了代码的具体实现方
法。
    前期准备用了20几天,真正编写代码只用了1.5天,调试用了2天。具体过程如下:
    (1)拷贝书后附赠光盘sourcecode目录下的内容到C:\YY下,删除不必要的文件和EX1L.C,
只剩下p187(《uCOSII》)上列出的文件。
    (2)改写最简单的OS_CPU.H
       数据类型的设定见C51.PDF第176页。注意BOOLEAN要定义成unsigned char 类型,因为
bit类型为C51特有,不能用在结构体里。
       EA=0关中断;EA=1开中断。这样定义即减少了程序行数,又避免了退出临界区后关中断
造成的死机。
       MCU-51堆栈从下往上增长(1=向下,0=向上),OS_STK_GROWTH定义为0
       #define  OS_TASK_SW() OSCtxSw() 因为MCU-51没有软中断指令,所以用程序调用代
替。两者的堆栈格式相同,RETI指令复位中断系统,RET则没有。实践表明,对于MCU-51,用子
程序调用入栈,用中断返回指令RETI出栈是没有问题的,反之中断入栈RET出栈则不行。总之,
对于入栈,子程序调用与中断调用效果是一样的,可以混用。在没有中断发生的情况下复位中断
系统也不会影响系统正常运行。详见《uC/OS-II》第八章193页第12行
    (3)改写OS_CPU_C.C
       我设计的堆栈结构如下图所示:
********************************************************************************
*
*
* ----------
* |OSTCBCur|
* ----------
*     |
*     |     -----------------------                                 ----------
*     \---->|OSTCBCur->OSTCBStkPtr|                          SP---->|        |
*           -----------------------                                 ----------
*                      |                                            |        |
*                      |         ---------- -                       ----------
*                      |         |        | |                       |   .    |
*                      |         ---------- |                       |   .    |
*                      |         |        | |                       |   .    |
*                      |         ---------- |                       ----------
*                      |         |   .    |长度                     |        | 
+1
*                      |         |   .    | |                       ----------
*                      |         |   .    | |           OSStack---->|        | 0
*   &n ......

>>返回讨论的主题


  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:31毫秒 最大:5186毫秒 查询6次