?? 自由風(fēng)os夢工廠--改進(jìn)uc-os ii,減少內(nèi)存使用量.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0049)http://half.nease.net/ucos/article/decmemucos.htm -->
<HTML><HEAD><TITLE>自由風(fēng)OS夢工廠--改進(jìn)uC/OS II,減少內(nèi)存使用量</TITLE><!-- InstanceBegin template="/%C4%A3%B0%E5/Document.dwt" codeOutsideHTMLIsLocked="false" -->
<META
content="嵌入式系統(tǒng),ucos,ucos ii,uc/os,vxworks,linux,os,arm,ppc,x86,embed,操作系統(tǒng),單片機,實時操作系統(tǒng),驅(qū)動,文件系統(tǒng),網(wǎng)絡(luò),計算機,tcpip,總線,通信,郭景峰,崔卿,自動控制"
name=Keywords>
<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>
<!-- InstanceBeginEditable name="doctitle" --><!-- InstanceEndEditable -->
<META http-equiv=Content-Type content="text/html; charset=gb2312"><!-- InstanceParam name="OptionalRegion1" type="boolean" value="true" --><LINK
href="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/format.css" type=text/css
rel=stylesheet>
<META content="MSHTML 6.00.2600.0" name=GENERATOR></HEAD>
<BODY>
<TABLE cellSpacing=0 cellPadding=0 width=750 align=center border=0>
<TBODY>
<TR>
<TD align=middle width=150 height=55><A
href="http://www.textclick.com/viewmain.asp?name=guojingfen"><IMG
height=50 src="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/logo.gif" width=150
border=0></A></TD>
<TD colSpan=2 height=55>
<DIV align=right>
<OBJECT
codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0
height=50 width=595 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000><PARAM NAME="movie" VALUE="/flash/Head.swf"><PARAM NAME="quality" VALUE="high">
<embed src="/flash/Head.swf" quality="high"
pluginspage="http://www.macromedia.com/go/getflashplayer"
type="application/x-shockwave-flash" width="595"
height="50"></embed></OBJECT></DIV></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=750 align=center border=0>
<TBODY>
<TR>
<TD bgColor=#f7f7f7>
<TABLE cellSpacing=0 cellPadding=0 width=750 align=center border=0>
<TBODY>
<TR>
<TD colSpan=2 height=30>當(dāng)前位置<IMG height=8
src="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/arrow.gif" width=12><A
href="http://half.nease.net/main.htm">首頁</A><IMG height=8
src="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/arrow.gif" width=12><!-- InstanceBeginEditable name="navigate" --><A
href="http://half.nease.net/ucos/index.htm">uC/OS-II</A><IMG
height=8 src="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/arrow.gif"
width=12><A href="http://half.nease.net/ucos/article.htm">技術(shù)應(yīng)用</A><!-- InstanceEndEditable --></TD>
<TD width=160 height=30>
<DIV align=center><IMG height=14
src="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/home.gif" width=14
align=absMiddle> <A
onclick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://half.nease.net')"
href="http://half.nease.net/ucos/article/decmemucos.htm#"
target=_self>設(shè)為首頁</A> <IMG height=13
src="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/fav.gif" width=15
align=absMiddle> <A
href="javascript:window.external.addfavorite('http://half.nease.net','自由風(fēng)OS夢工廠--嵌入式系統(tǒng)開發(fā)')">收藏本站</A></DIV></TD></TR>
<TR>
<TD width=150 bgColor=#000000 height=1></TD>
<TD width=450 bgColor=#000000 height=1></TD>
<TD width=150 bgColor=#000000 height=1></TD></TR>
<TR>
<TD vAlign=top align=middle colSpan=3>
<P> </P>
<TABLE cellSpacing=0 cellPadding=0 width=700 border=0>
<TBODY>
<TR>
<TD bgColor=#cccccc height=25>
<DIV align=center><FONT size=4><!-- InstanceBeginEditable name="title" --><FONT
size=4><STRONG>改進(jìn)uC/OS II,減少內(nèi)存使用量</STRONG></FONT><!-- InstanceEndEditable --></FONT></DIV></TD></TR>
<TR>
<TD bgColor=#ebebeb height=30>
<DIV align=center><!-- InstanceBeginEditable name="smalltitle" -->2003-08-08[中][摘]
John_Lee <A href="http://www.driverdevelop.com/index.php"
target=_blank>驅(qū)動程序開發(fā)論壇</A>[文]<FONT color=#0000ff></FONT><!-- InstanceEndEditable --></DIV></TD></TR>
<TR>
<TD height=40>聲明:<FONT
color=#c60d0d>本網(wǎng)站資源來自本站原創(chuàng)、網(wǎng)友來稿和摘自別處等途徑,在此敬告各位網(wǎng)友,下載和使用時要充分尊重作品版權(quán),對來自不同途徑的資源請分別參照<A
href="http://half.nease.net/info/declare.htm"
target=_blank>相關(guān)聲明</A>嚴(yán)格執(zhí)行。本站拒絕一切具有商業(yè)化色彩的使用與下載。萬望注意,特此聲明!</FONT></TD></TR></TBODY></TABLE>
<TABLE borderColor=#000000 cellSpacing=0 cellPadding=0 width=700
border=1>
<TBODY>
<TR>
<TD borderColor=#ffffff bgColor=#666666 height=20>
<TABLE cellSpacing=0 cellPadding=0 width=700 border=0>
<TBODY>
<TR>
<TD width=25>
<DIV align=center><FONT face=Wingdings
color=#ffffff>1</FONT></DIV></TD>
<TD width=652> </TD>
<TD width=23>
<DIV align=center><A
href="javascript:window.close()"><FONT face=Wingdings
color=#ffffff>x</FONT></A></DIV></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD vAlign=top borderColor=#ffffff align=middle
height=120><BR><!-- InstanceBeginEditable name="EditRegion1" -->
<TABLE cellSpacing=0 cellPadding=0 width=600 border=0>
<TBODY>
<TR>
<TD>
<P
class=p4>在以uC/OS為操作系統(tǒng)的項目中,系統(tǒng)可能要處理各種不同的中斷請求,如果某個中斷處理程序需要調(diào)用uC/OS的各種Post函數(shù)向任務(wù)發(fā)出消息,那么uC/OS建議中斷服務(wù)程序的寫法是:<BR>1、保存全部CPU寄存器<BR>2、調(diào)用OSIntEnter或OSIntNesting直接加1<BR>3、執(zhí)行用戶代碼做中斷服務(wù)<BR>4、調(diào)用OSIntExit<BR>5、恢復(fù)所有CPU寄存器<BR>6、執(zhí)行中斷返回指令<BR>暫且稱為“標(biāo)準(zhǔn)中斷”方式,這種方式實際上是將這個中斷處理加入了任務(wù)調(diào)度系統(tǒng),也就是說這個中斷可以引起任務(wù)的切換。</P>
<P
class=p4>如果在中斷處理中沒有調(diào)用各種Post函數(shù)的話,則可以用一般的、象原來沒有操作系統(tǒng)時的寫法:<BR>1、保存中斷處理程序需要用到的CPU寄存器<BR>2、執(zhí)行中斷處理<BR>3、恢復(fù)保存了的CPU寄存器<BR>4、執(zhí)行中斷返回指令<BR>暫且稱為“快中斷”方式,按照這種方法定義的中斷永遠(yuǎn)不會引起任務(wù)切換。</P>
<P
class=p4>在uC/OS系統(tǒng)中,每個任務(wù)都要定義獨立的棧空間,一個棧空間的使用包括5個部分:<BR>1、任務(wù)包括的各個函數(shù)的調(diào)用返回地址<BR>2、任務(wù)包括的各個函數(shù)中可能在棧上分配的局部變量<BR>3、發(fā)生了“標(biāo)準(zhǔn)中斷”方式定義的中斷或任務(wù)被掛起時,所要保存的任務(wù)上下文<BR>4、發(fā)生了“快中斷”方式定義的中斷時,中斷處理程序所需要的棧空間<BR>5、中斷嵌套時,所要保存的中斷嵌套上下文</P>
<P
class=p4>在這些使用的部分中,1,2,3,4的內(nèi)存占用量是比較容易估算的,最精確和保險的確定方法是:查看由C生成的asm文件,并計算各個函數(shù)的棧使用量。但是第5部分的棧空間使用量是隨中斷嵌套的深度而不斷增加的,是不確定的,一般的方法只能定義一個充分大的棧空間,使之不會溢出。</P>
<P
class=p4>為每個任務(wù)都定義一個充分大的棧空間,這在某些內(nèi)存稀缺的小項目中是非常痛苦的,有時不得不增擴(kuò)內(nèi)存,這就會使成本增加。</P>
<P
class=p4>我深入研究了uC/OS后,認(rèn)為,可以將所有任務(wù)棧空間使用的第5部分合并,這樣將會大大的降低整個系統(tǒng)對內(nèi)存的需求。</P>
<P
class=p4>uC/OS的任務(wù)調(diào)度是靠OS_Sched和OSIntExit來完成的,這兩個函數(shù)中都要先判斷一個叫OSIntNesting的系統(tǒng)變量,如果OSIntNesting不為0,則不進(jìn)行任務(wù)切換。也就是說:在OSIntNesting為1(當(dāng)前只有一個中斷在處理中,并且沒有嵌套的中斷)時起,如果發(fā)生了嵌套的中斷(不管嵌套的層數(shù)有深),那么在所有嵌套的中斷一層一層地都返回直到OSIntNesting再次為1時止,任務(wù)棧是不會切換的(棧指針都在一個任務(wù)的棧空間中變化)。</P>
<P
class=p4>據(jù)此,我們可以這樣改動:設(shè)置一個緩沖區(qū)OSInterruptStk,作為嵌套中斷的棧空間,由所有任務(wù)共享,中斷服務(wù)程序改為:<BR>1、保存全部CPU寄存器<BR>2、調(diào)用OSIntEnter或OSIntNesting直接加1<BR>增加:2.1、判斷OSIntNesting是否等于1,如果不是則轉(zhuǎn)到3<BR>增加:2.2、將棧指針SP保存到OSTCBCur->OSTCBStkPtr<BR>增加:2.3、將SP指向OSInterruptStk的棧頂(注意棧增長的方向)。<BR>3、執(zhí)行用戶代碼做中斷服務(wù)<BR>4、調(diào)用OSIntExit<BR>增加:4.1、判斷OSIntNesting是否等于0,如果不是則轉(zhuǎn)到5<BR>增加:4.2、從OSTCBCur->OSTCBStkPtr中恢復(fù)棧指針SP<BR>5、恢復(fù)所有CPU寄存器<BR>6、執(zhí)行中斷返回指令</P>
<P
class=p4>并且要修改OSIntCtxSw函數(shù),原始的OSIntCtxSw函數(shù)的寫法是:<BR>1、調(diào)整棧指針來去掉在調(diào)用:OSIntExit,OSIntCtxSw過程中入棧的多余內(nèi)容<BR>2、將當(dāng)前任務(wù)棧指針保存到OSTCBCur中(OSTCBCur->OSTCBStkPtr
= __SP__)<BR>3、如果需要則調(diào)用OSTaskSwHook<BR>4、OSTCBCur =
OSTCBHighRdy<BR>5、OSPrio =
OSPrioHighRdy<BR>6、從OSTCBCur中恢復(fù)棧指針(__SP__ =
OSTCBCur->OSTCBStkPtr)<BR>7、恢復(fù)保存了的CPU寄存器<BR>8、執(zhí)行中斷返回指令</P>
<P
class=p4>新的寫法只需將原寫法中的1,2去掉即可,因為1,2步只是保存舊任務(wù)的棧指針,而新的寫法中,這些步被移到了“中斷服務(wù)程序”中的2.2。</P>
<P class=p4>以上的修改已在我的項目中驗證通過了。</P></TD></TR></TBODY></TABLE>
<P
class=p4> </P><!-- InstanceEndEditable --><BR></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=750 align=center border=0>
<TBODY>
<TR>
<TD background="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/bot.gif" height=40>
<DIV align=center><A href="http://half.nease.net/info/about.htm"><FONT
color=#666666>◇</FONT> 關(guān)于本站</A> <FONT color=#666666>◇</FONT> <A
href="http://half.nease.net/info/server.htm">網(wǎng)站服務(wù)</A> <FONT
color=#666666>◇ </FONT><A
href="http://half.nease.net/info/declare.htm">網(wǎng)站聲明</A> <FONT
color=#666666>◇ </FONT><A
href="http://half.nease.net/info/help.htm">幫助信息</A> <FONT
color=#666666>◇</FONT><A
href="http://gb.go98.com:81/gbbs.cgi?user=freewind" target=_blank> 留 言
簿</A> <FONT color=#666666>◇</FONT> <A
href="mailto:freewindos@sina.com">給我寫信</A> <FONT
color=#666666>◇</FONT></DIV></TD></TR>
<TR bgColor=#cccccc>
<TD bgColor=#ffffff height=100>
<DIV align=center>
<P class=p7 align=center><FONT color=#666666>★ Copyright © 2003 FreeWind
Studio All Rights Reserved ★<BR><IMG height=20
src="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/vline.gif" width=1><IMG height=20
src="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/hline.gif" width=102>
自由風(fēng)工作室版權(quán)所有<FONT color=#ffffff> </FONT></FONT><FONT color=#666666><IMG
height=20 src="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/hline.gif"
width=102><IMG height=20
src="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/vline.gif" width=1></FONT></P>
<P class=p7 align=center><FONT class=p2 color=#666666><IMG
src="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/count.png"
align=absMiddle></FONT></P></DIV></TD></TR></TBODY></TABLE>
<DIV id=Layer1
style="Z-INDEX: 1; LEFT: 221px; VISIBILITY: hidden; WIDTH: 49px; POSITION: absolute; TOP: 289px; HEIGHT: 45px"><FONT
class=p2 color=#666666>
<SCRIPT>var tc_user="guojingfen";var tc_class="2";</SCRIPT>
<SCRIPT src="自由風(fēng)OS夢工廠--改進(jìn)uC-OS II,減少內(nèi)存使用量.files/stat.js"></SCRIPT>
</FONT></DIV>
<P align=center><SPAN class=p7><FONT class=p2 color=#666666></FONT></SPAN></P><!-- InstanceEnd --></BODY></HTML>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -