📄 《电子设计应用》.htm
字号:
<P><IMG onmousewheel="return bbimg(this)" onclick=ImgClick(this)
src="《电子设计应用》.files/040614005.jpg" onload=ImgLoad(this) border=0
resized="0"><BR>图2
任务堆栈初始化程序<BR>·数据类型定义<BR>数据类型的修改与所用的编译器相关,不同的编译器使用不同的字节长度表示同一数据类型,比如int,同样在x86平台上,GNU的gcc编译为4
bytes,而MS VC++则编译为2 bytes。本文使用GNU 的
arm-elf-gcc,相关的数据类型定义如下:<BR>·堆栈单位<BR>在任务切换时,CPU现场的寄存器将保存在当前运行任务的堆栈中,所以OS_STK
数据类型应该与CPU的寄存器长度一致。<BR>typedef unsigned int os
STK;<BR>·堆栈增长方向<BR>堆栈由高地址向低地址增长,也与编译器有关,在函数调用时,入口参数和返回地址一般保存在当前任务的堆栈中,编译器的编译选项和由此生成的堆栈指令就会决定堆栈的增长方向。<BR>#define
OS_STK_GROWTH<BR>·宏定义<BR>包括开关中断的宏定义,以及进行任务切换的宏定义。<BR>#define
OS_ENTER_CRITICAL() ARMDisable Int()<BR>#define OS_EXIT_CRITICAL()
ARMEnable Int()<BR>#define OS_TASK_SW() OSCtxSw()</P>
<P>OS_CPU_C.C
文件<BR>·任务堆栈初始化<BR>在此讨论任务初始化时的堆栈设计,也就是在堆栈增长方向上如何定义每个需要保存的寄存器位置。在ARM体系结构下,任务堆栈空间由高至低依次将保存着pc、lr、r12、r11、r10、...
r1、r0、CPSR、SPSR,如图1所示。<BR>图1
ARM体系结构的寄存器位置<BR>有两点需要说明:一是,当前任务堆栈初始化完成后,OSTaskStkInit 返回新的堆栈指针STK,在
OSTaskCreate()执行时,将会调用 OSTaskStkInit
的初始化过程,然后通过OSTCBInit()函数调用,将返回的SP指针保存到该任务的TCB块中。二是,初始状态的堆栈是模拟了一次中断后的堆栈结构,因为任务创建后并不是直接就获得执行,而是通过OSSched()函数进行调度分配,满足执行条件后才能获得执行。为了使这个调度简单一致,就预先将该任务的PC指针和返回地址LR都指向函数入口,以便被调度时从堆栈中恢复刚开始运行时的CPU现场。<BR>·系统钩子函数<BR>在该文件中需要实现几个操作系统规定的hook函数,如下:<BR>OSSTaskCreateHook(
)<BR>OSTaskDelHook( )<BR>OSTaskSwHook( )<BR>OSTaskStatHook(
)<BR>OSTimeTickHook( )<BR>若无特殊需求,只需简单地将它们都实现为空函数即可。<BR>OS_CPU_A.S
文件<BR>·OSStartHighRdy()<BR>此函数是在OSStart()多任务启动后,负责从最高优先级任务的TCB控制块中获得该任务的堆栈指针SP,通过SP依次将CPU现场恢复,这时系统就将控制权交给用户创建的该任务进程,直到该任务被阻塞或者被其他更高优先级的任务抢占CPU。该函数仅在多任务启动时被执行一次,即执行最高优先级任务,之后多任务的调度和切换由以下函数实现。<BR>·OSCtxSw()<BR>任务级的上下文切换,当任务因为被阻塞而主动请求CPU调度时被执行,由于此时的任务切换在非异常模式下进行,因此区别于中断级别的任务切换。它的工作是先将当前任务的CPU现场保存到该任务堆栈中,然后获得最高优先级任务的堆栈指针,从该堆栈中恢复此任务的CPU现场,使之继续执行。这样就完成了一次任务切换。<BR>·OSIntCtxSw()<BR>中断级的任务切换,在时钟中断ISR(中断服务例程)中发现有高优先级任务等待的时钟信号到来,则在中断退出后并不返回被中断任务,而是直接调度就绪的高优先级任务执行,从而能够尽快地让高优先级的任务得到响应,保证系统的实时性能。其原理基本上与任务级的切换相同,但是由于进入中断时已经保存了被中断任务的CPU现场,因此不用再进行类似的操作,只需对堆栈指针做相应调整。<BR>·OSTickISR()<BR>时钟中断处理函数,其主要任务是负责处理时钟中断,调用系统实现的OSTimeTick函数,如果有等待时钟信号的高优先级任务,则需要在中断级别上调度其执行。其他相关的两个函数是OSIntEnter()和OSIntExit(),都需要在ISR中执行。<BR>·ARMEnableInt()&
ARMDisableInt()<BR>分别是退出临界区和进入临界区的宏指令实现。主要用于在进入临界区之前关闭中断,在退出临界区的时候恢复原来的中断状态。它的实现比较简单,可以直接开关中断来实现,也可以通过保存关闭/恢复中断屏蔽位来实现。<BR>全部移植代码在SkyEye仿真器上调试通过,在SkyEye的主页上可以下载获得(http://hpclab.cs.tsinghua.edu.cn/~skyeye/)。</P>
<P>结语<BR>uC/OS-II作为一个优秀的实时操作系统已经被移植到各种体系结构的微处理器上,而ARM体系结构在嵌入式领域也获得了广泛的应用和支持。将uC/OS-II
移植到ARM平台上,能够使我们更深入地了解实时操作系统的构造,加快在ARM平台上的应用和开发,并为更高层次上的扩展和改进打下基础。</P>
<P>参考文献<BR>1 ARM Architecture Reference Manual. http://www.arm.com<BR>2
《ARM 嵌入式处理器结构与应用基础》.马忠梅等编著.北京航空航天大学出版社.2002年出版<BR>3《uC/OS-II
-源码公开的实时嵌入式操作系统》.Jean J.Labrosse 著.劭贝贝译.中国电力出版社.2001年出版<BR>4 uC/OS
网站.http://www.ucos-ii.com<BR><BR></P></DIV><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width="97%">
<TBODY>
<TR>
<TD align=right>
<TABLE>
<TBODY>
<TR>
<TD>来源:<SPAN id=SourceLabel>电子设计应用</SPAN><BR>阅读:<SPAN
id=HitsLabel>1894</SPAN> 次<BR>日期:<SPAN
id=TimeLabel>2004-6-14</SPAN><BR><BR></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD align=right>【 <A
href="http://www.edw.com.cn/remark.aspx?ID=2537"
target=_blank>评论</A> 】 【 <A
href="http://www.edw.com.cn/mail.aspx?ID=2537" target=_blank>推荐</A>
】 【 <A href="javascript:doPrint()">打印</A> 】 </TD></TR></TBODY></TABLE>
<TABLE width="97%" align=center>
<TBODY>
<TR>
<TD> </TD></TR></TBODY></TABLE></TD></TR></TBODY>
<TBODY id=printHide>
<TR>
<TD class=summary-title> >> 相关新闻 <A
href="http://www.edw.com.cn/search.aspx?Where=Nkey&Keyword=uC%2fOS-II%a3%bbARM%a3%bb%d2%c6%d6%b2">全部相关新闻</A>
</TD></TR>
<TR class=tdbg vAlign=top>
<TD></TD></TR>
<TR>
<TD class=summary-title> >> <A
href="http://www.edw.com.cn/remark.aspx?id=2537" target=_blank>本文评论</A>
</TD></TR>
<TR class=tdbg vAlign=top>
<TD
style="PADDING-RIGHT: 2px; PADDING-LEFT: 2px; PADDING-BOTTOM: 5px; PADDING-TOP: 5px"></TD></TR>
<TR>
<TD class=summary-title align=middle>发表评论 </TD></TR>
<TR>
<TD class=tdbg>
<FORM name=remarkForm onsubmit="return checkRemark();"
action=remark.aspx?id=2537 method=post>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD>
<SCRIPT language=javascript type=text/javascript>
<!--
function checkRemark()
{
var form=document.all.remarkForm;
if (form.body.value=="")
{ alert("请填写评论内容");
form.body.focus();
return false;
}
if (form.username.value=="")
{ alert("请填写姓名");
form.username.focus();
return false;
}
if (form.body.value.length>200)
{ alert("评论内容不可以超过200字");
form.body.focus();
return false;
}
if (form.username.value.length>10)
{ alert("姓名不可以超过10个字");
form.username.focus();
return false;
}
form.submit.disabled=true;
return true;
}
function showLen(obj)
{
document.all.bodyLen.value=obj.value.length;
}
-->
</SCRIPT>
<INPUT type=radio CHECKED value=1 name=face><IMG alt=""
src="《电子设计应用》.files/face1.gif"> <INPUT type=radio value=2
name=face><IMG alt="" src="《电子设计应用》.files/face2.gif"> <INPUT
type=radio value=3 name=face><IMG alt=""
src="《电子设计应用》.files/face3.gif"> <INPUT type=radio value=4
name=face><IMG alt="" src="《电子设计应用》.files/face4.gif"> <INPUT
type=radio value=5 name=face><IMG alt=""
src="《电子设计应用》.files/face5.gif"> <INPUT type=radio value=6
name=face><IMG alt="" src="《电子设计应用》.files/face6.gif"> <INPUT
type=radio value=7 name=face><IMG alt=""
src="《电子设计应用》.files/face7.gif"> <INPUT type=radio value=8
name=face><IMG alt="" src="《电子设计应用》.files/face8.gif"> <INPUT
type=radio value=9 name=face><IMG alt=""
src="《电子设计应用》.files/face9.gif"><BR><INPUT type=radio value=10
name=face><IMG alt="" src="《电子设计应用》.files/face10.gif"> <INPUT
type=radio value=11 name=face><IMG alt=""
src="《电子设计应用》.files/face11.gif"> <INPUT type=radio value=12
name=face><IMG alt="" src="《电子设计应用》.files/face12.gif"> <INPUT
type=radio value=13 name=face><IMG alt=""
src="《电子设计应用》.files/face13.gif"> <INPUT type=radio value=14
name=face><IMG alt="" src="《电子设计应用》.files/face14.gif"> <INPUT
type=radio value=15 name=face><IMG alt=""
src="《电子设计应用》.files/face15.gif"> <INPUT type=radio value=16
name=face><IMG alt="" src="《电子设计应用》.files/face16.gif"> <INPUT
type=radio value=17 name=face><IMG alt=""
src="《电子设计应用》.files/face17.gif"> <INPUT type=radio value=18
name=face><IMG alt="" src="《电子设计应用》.files/face18.gif"><BR>点评: <TEXTAREA onkeydown=showLen(this) onkeyup=showLen(this) name=body rows=4 cols=40></TEXTAREA>
字数<INPUT id=bodyLen
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BACKGROUND: none transparent scroll repeat 0% 0%; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
size=4> <BR>姓名: <INPUT maxLength=15 size=10 value=ruiding
name=username> <INPUT type=submit value=" 发 表 " name=submit>
<BR><BR><INPUT id=clientDate type=hidden name=clientDate>
<SCRIPT language=javascript type=text/language> d=new Date();document.all.clientDate.value=d.getYear()+","+d.getMonth()+","+d.getDate()+","+ d.getHours() +","+ d.getMinutes() +","+ d.getSeconds();</SCRIPT>
</TD>
<TD width=350></TD></TR></TBODY></TABLE></FORM></TD></TR></TBODY></TABLE></DIV>
<TABLE class=twidth cellSpacing=0 cellPadding=0 width=428 align=center>
<TBODY>
<TR>
<TD height=20></TD></TR>
<TR>
<TD class=footline></TD></TR>
<TR style="LINE-HEIGHT: 130%" align=middle>
<TD height=60>
<DIV style="DISPLAY: none">
<TABLE width=760 align=center>
<TBODY>
<TR>
<TD align=middle colSpan=4 height=50><BR><A
href="http://www.edw.com.cn/us/aboutus.htm">公司简介</A> | <A
href="http://www.edw.com.cn/dh/ggb.htm">广告服务</A> | <A
href="http://www.edw.com.cn/fw/bdwl/zong.htm">投稿须知</A> | <A
href="http://www.edw.com.cn/us/map.htm">网站地图</A> | <A
href="mailto:marychen@edw.com.cn">社长信箱</A><BR>Copyright (C) 2002
Electronic Engineering & Product World. All rights reserved.
<BR>《电子产品世界》杂志社 版权所有<BR>北京东晓国际技术信息咨询有限公司<BR>联系电话:(86)10-68578428
传真:(86)10-68580564 </TD></TR></TBODY></TABLE></DIV>
<DIV>Copyright (C) 2002 Electronic Design & Application World-Nikkei
Electronics China. All rights reserved.<BR>《电子设计应用》杂志社
版权所有<BR>北京东晓国际技术信息咨询有限公司<BR>联系电话:(86)10-68580742 传真:(86)10-68580564
</DIV></TD></TR></TBODY></TABLE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -