📄 ucos51移植心得.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0043)http://www.avrw.com/article/art_104_967.htm -->
<HTML><HEAD><TITLE>uCOS51移植心得</TITLE>
<META
content=uCOS51移植心得/单片机、ARM、DSP、CPLD、LCD、EDA/FTP、电子资料、免费下载、电子爱好者社区,学习资料/uCOS51移植心得电子问题有问必答,综合电子论坛欢迎您!
name=keywords>
<META
content="uCOS51移植心得/前一段时间,我参与了一个SNMP网管板的项目,我负责硬件设计和单板软件开发。该板的硬件由MCS51+RTL8019AS组成,有64K FLASH 和64K SRAM。软件部分有操作系统和TCPIP协议/uCOS51移植心得电子问题有问必答,综合电子论坛欢迎您!"
name=description>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>.style1 {
COLOR: #ffffff
}
BODY {
FONT-SIZE: 12px; BACKGROUND: #ffffff; MARGIN: 0px; COLOR: #000000; FONT-FAMILY: 宋体,tahoma,fantasy; TEXT-ALIGN: center
}
.mian {
BORDER-RIGHT: #ffffff 3px double; PADDING-RIGHT: 2px; BORDER-TOP: #ffffff 3px double; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; MARGIN: 12px auto 0px; BORDER-LEFT: #ffffff 3px double; WIDTH: 98%; PADDING-TOP: 2px; BORDER-BOTTOM: #ffffff 3px double; BACKGROUND-COLOR: #ffffff; TEXT-ALIGN: left; min-width: 600px
}
.top {
BORDER-RIGHT: #99a3ab 1px solid; BORDER-TOP: #99a3ab 1px solid; FONT-WEIGHT: bold; FONT-SIZE: 12px; BORDER-LEFT: #99a3ab 1px solid; COLOR: white; TEXT-INDENT: 5px; LINE-HEIGHT: 22px; BORDER-BOTTOM: #99a3ab 1px solid; HEIGHT: 22px; BACKGROUND-COLOR: #ffffff; TEXT-ALIGN: left
}
.bottom {
BORDER-RIGHT: #99a3ab 1px solid; BORDER-LEFT: #99a3ab 1px solid; BORDER-BOTTOM: #99a3ab 1px solid; HEIGHT: 25px; BACKGROUND-COLOR: #c9d4db; TEXT-ALIGN: center
}
.title {
FONT-WEIGHT: bold; COLOR: #203e46
}
TEXTAREA {
BORDER-TOP-WIDTH: 1px; FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 12px; BACKGROUND: #fcfff7; BORDER-BOTTOM-WIDTH: 1px; WIDTH: 98%; LINE-HEIGHT: normal; FONT-STYLE: normal; BORDER-RIGHT-WIDTH: 1px
}
INPUT {
FONT-SIZE: 12px
}
SELECT {
FONT-SIZE: 12px; BACKGROUND: #fcfff7; MARGIN: 1px
}
INPUT.text {
BORDER-RIGHT: #ffffff 1px solid; PADDING-RIGHT: 1px; BORDER-TOP: #ffffff 1px solid; PADDING-LEFT: 1px; BACKGROUND: #9e9585; PADDING-BOTTOM: 1px; MARGIN: 1px; BORDER-LEFT: #ffffff 1px solid; PADDING-TOP: 1px; BORDER-BOTTOM: #ffffff 1px solid; HEIGHT: 18px
}
INPUT.button {
BORDER-RIGHT: #2c68b9 4px solid; BORDER-TOP: #2c68b9 1px solid; BACKGROUND: #ffffff; MARGIN: 2px 5px; BORDER-LEFT: #2c68b9 4px solid; COLOR: #000000; BORDER-BOTTOM: #2c68b9 1px solid; HEIGHT: 20px
}
.adding {
PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; OVERFLOW: hidden; PADDING-TOP: 3px; HEIGHT: 25px
}
.Stable {
BORDER-TOP: medium none; BACKGROUND: #def0fe; BORDER-LEFT: #99a3ab 1px solid; WIDTH: 100%
}
.Stable TD {
BORDER-RIGHT: #99a3ab 1px solid; BORDER-TOP: medium none; FONT-SIZE: 12px; BORDER-BOTTOM: #99a3ab 1px solid
}
.Stable TH {
BORDER-RIGHT: #99a3ab 1px solid; BORDER-TOP: medium none; FONT-SIZE: 12px; BACKGROUND: #c4d4dc; BORDER-BOTTOM: #99a3ab 1px solid
}
FORM {
MARGIN: 0px
}
TABLE {
FONT-SIZE: 12px
}
TH {
FONT-SIZE: 12px
}
TD {
FONT-SIZE: 12px
}
TR {
FONT-SIZE: 12px
}
.content {
BORDER-RIGHT: #99a3ab 1px solid; BORDER-TOP: #99a3ab 1px solid; BORDER-LEFT: #99a3ab 1px solid; BORDER-BOTTOM: #99a3ab 1px solid; BACKGROUND-COLOR: #f7b91a
}
.content LI {
LINE-HEIGHT: 20px; LIST-STYLE-TYPE: none
}
A:hover {
LEFT: 1px; COLOR: #ff8040; POSITION: relative; TOP: 1px; TEXT-DECORATION: none
}
.link {
COLOR: #4a4a42; TEXT-DECORATION: none
}
.link2 {
COLOR: #d65a18; TEXT-DECORATION: none
}
.link3 {
COLOR: #ffffff; TEXT-DECORATION: none
}
.style15 {
FONT-SIZE: 18px
}
.style16 {
FONT-SIZE: 24px
}
</STYLE>
<SCRIPT language=JavaScript type=text/JavaScript>
<!--
function MM_reloadPage(init) { //reloads the window if Nav4 resized
if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
//-->
</SCRIPT>
<META content="MSHTML 6.00.2900.3268" name=GENERATOR></HEAD>
<BODY leftMargin=0 topMargin=0 marginheight="0" marginwidth="0">
<SCRIPT src="uCOS51移植心得.files/top.htm"></SCRIPT>
<TABLE class=txt_css height=35 cellSpacing=0 cellPadding=0 width="100%"
align=center bgColor=#ffffff background=uCOS51移植心得.files/txt_css.gif border=0>
<TBODY>
<TR vAlign=center>
<TD width=46>
<DIV align=right><IMG height=11 src="uCOS51移植心得.files/arrow3.gif" width=29
align=absMiddle> </DIV></TD>
<TD><A class=link href="http://www.avrw.com/index.asp">综合电子论坛首页 -->
</A><A class=link href="http://www.avrw.com/learn.htm">学习资料 --> </A><A
class=link href="http://www.avrw.com/article/art_104_p1.htm">嵌入式系统 -->
</A><A class=link
href="http://www.avrw.com/article/art_104_.htm">uCOS51移植心得</A></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 width="100%" border=0>
<TBODY>
<TR>
<TD bgColor=#fffbe8>
<P align=center>
<TABLE cellSpacing=0 width="100%" border=0>
<TBODY>
<TR>
<TD bgColor=#fffbe8>
<TABLE style="WORD-BREAK: break-all" cellSpacing=10 cellPadding=0
width="90%" align=center border=0>
<TBODY>
<TR>
<TD vAlign=top width=816 height=200 line-height="35pt">
<DIV align=center><FONT
size=4><STRONG>uCOS51移植心得</STRONG></FONT></DIV><BR><BR>
<P>前一段时间,我参与了一个SNMP网管板的项目,我负责硬件设计和单板软件开发。该板的硬件由MCS51+RTL8019AS组成,有64K
FLASH 和64K
SRAM。软件部分有操作系统和TCPIP协议栈。硬件比较简单,用了一个月就搞定了,协议栈我参考了老古开发板的部分程序又上网找了SNMP源代码也很快完成了,但是测试时发现当使用较低时钟频率的CPU时(为了降低成本),由于ASN.1编解码部分过于庞大,而我的程序又是一个大循环,AGENT的响应速度受到严重影响,用户界面也反应迟钝。更坏的消息是公司为了适应市场需求,还要在上面跑PPP和HTTP。那样的话,我就得用40MHz的AT89C51RD2或者人为的把程序断成几部分然后用状态机的方法在运行时再把它们连接起来。不过,我不想增加成本,也不想把程序搞乱,迫不得已,只好使用操作系统。
<P>
说实在的,一开始我也不是很有把握,一来我不清楚51的FLASH是否装得下这么多代码,二来我只做过OS应用开发,对于它的移植想都不敢想。不过,我在BBS上搜索了一阵儿后还是有了一些头绪。我找到了几个OS的源代码(我喜欢用现成的),按照代码大小、实时性、使用人数、众人口碑等标准,最后选定了uCOS2。我感觉它的实时性有保障,延时可预测,代码据说可小到2K,网上讨论这个话题的人也比较多,而且它的网站上有针对KEIL
C51的移植实例。</P>
<P>
经过一番查找,我得到了5个版本。其中3个是用KEIL编译的。本来我想直接把OS代码嵌到应用程序中,但后来发现没有一个可以直接使用。有的无法用KEIL直接编译,有的需要修改DLL在软件仿真下使用。而我需要的是能在串口输入输出,不需要修改任何无关软件,能在软件仿真和硬件上运行的实时多任务操作系统。没有办法,我只好硬着头皮去改编。</P>
<P>
我分析了自己的劣势:1。KEIL刚开始使用,不太熟悉;2。混合编程以前从没有作过;3。时间紧迫,要在1个月内搞定。而我的优势就是有5个移植实例可供参考,可以上网查资料。一开始,我用“堆栈”、“混合编程”、“汇编”、“ucos”等关键字在C51BBS和老古论坛上检索相关信息并逐条阅读,读过之后,头脑中的思路逐渐清晰了。我了解到在KEIL的HLP目录下有A51.PDF和C51.PDF非常全面的介绍了汇编和C51,是KEIL的权威用户手册;SP初始化、内存清0等操作在STARTUP.A51文件中实现,用户可以改写它;KEIL的变量,子程序等的分配信息可以在.M51文件里查到;KEIL自己的论坛里有很多疑难问题的解答……通过阅读并经过思考,解决了堆栈起点、堆栈空间大小的设定等关键问题。论坛里的问题有些是我没有想到的,这使我发现了自己的疏漏。</P>
<P>
在网上获得大量信息后,我开始阅读《uCOSII》中文版,一共读了3遍。第一遍是浏览,了解到uCOSII包括任务调度、时间管理、内存管理、资源管理(信号量、邮箱、消息队列)四大部分,没有文件系统、网络接口、输入输出界面。它的移植只与4个文件相关:汇编文件(OS_CPU_A.ASM)、处理器相关C文件(OS_CPU.H、OS_CPU_C.C)和配置文件(OS_CFG.H)。有64个优先级,系统占用8个,用户可创建56个任务,不支持时间片轮转。第二遍主要是把整个工作过程在头脑里过了一下,不懂地方有针对性的查书,重点是思考工作原理和流程。我发现其实它的思路挺简单的。就是
“近似地每时每刻总是让优先级最高的任务处于运行状态”
。为了保证这一点,它在调用系统API函数、中断结束、定时中断结束时总是执行调度算法。原作者通过事先计算好数据,简化了运算量,通过精心设计就绪表结构,使得延时可预知。任务的切换是通过模拟一次中断实现的。第三遍重点看了移植部分的内容。对照实例,研究了代码的具体实现方法。</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -