uCOS51移植心得.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
uCOS51移植心得

uCOS51 移植心得 讨论1----uCOS51 高效内核 前一段时间我参与了一个SNMP 网管板的项目我负责硬件设计和单板软件开发该板的硬件由MCS51+RTL8019AS 组成有64K FLASH 和64K SRAM 软件部分有操作系统和TCPIP 协议栈硬件比较简单用了一个月就搞定了协议栈我参考了老古开发板的部分程序又上网找了SNMP 源代码也很快完成了但是测试时发现当使用较低时钟频率的CPU 时为了降低成本由于ASN.1 编解码部分过于庞大而我的程序又是一个大循环AGENT 的响应速度受到严重影响用户界面也反应迟钝更坏的消息是公司为了适应市场需求还要在上面跑PPP 和HTTP 那样的话我就得用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 开中断这样定义即减少了程序行数又避免了退出临界区后关中断造成的死机 MCS-51 堆栈从下往上增长(1=向下0=向上) OS_STK_GROWTH 定义为0 #define OS_TASK_SW() OSCtxSw() 因为MCS-51 没有软中断指令所以用程序调用代替两者的堆栈格式相同RETI 指令复位中断系统RET 则没有实践表明对于MCS-51 用子程序调用入栈用中断返回指令RETI 出栈是没有问题的反之中断入栈RET出栈则不行总之对于入栈子程序调用与中断调用效果是一样的可以混用在没有中断发生的情况下复位中断系统也不

文档评论(0)

kakaxi + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档