?? c語言嵌入式系統編程修煉之軟件架構篇-開發者網絡-c-天極module1yesky.htm
字號:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<title>C語言嵌入式系統編程修煉之軟件架構篇-開發者網絡-C-天極Yesky</title>
<meta name="description" content="C語言嵌入式系統編程修煉之軟件架構篇," />
<meta name="keywords" content="C語言嵌入式系統編程修煉之軟件架構篇," />
<meta name="author" content="天極Yesky | 全球中文IT第一門戶" />
<meta name="Copyright" content="天極Yesky | 全球中文IT第一門戶" />
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta http-equiv="Content-Language" content="zh-CN" />
<link rel="stylesheet" href="http://image.yesky.com/TLimages/css/y_mobile_content.css" type="text/css" media="all" />
<script src="http://image.yesky.com/TLimages/newmobile/showlay.js"></script>
<base target="_blank">
</head>
<body>
<!--頁面頭部-->
<!--頭部-->
<div id="topmenu"><a href="http://www.yesky.com">Yesky首頁</a>| <a href="http://product.yesky.com/">產品報價</a>| <a href="http://cseek.yesky.com/">行情</a>| <a href="http://mobile.yesky.com/">手機</a> | <a href="http://digital.yesky.com/">數碼</a> | <a href="http://notebook.yesky.com/">筆記本</a> | <a href="http://pc.yesky.com/">臺式機</a> | <a href="http://diy.yesky.com/">DIY硬件</a> | <a href="http://oa.yesky.com/">外設</a> | <a href="http://net.yesky.com/">網絡</a> | <a href="http://dh.yesky.com/">數字家庭</a> | <a href="http://lab.yesky.com/">評測</a> | <a href="http://soft.yesky.com/">軟件</a> | <a href="http://e.yesky.com/">e時代</a> | <a href="http://game.yesky.com/">游戲</a> | <a href="http://pic.yesky.com/">圖片</a> | <a href="http://desktop.yesky.com/">壁紙</a> | <a href="http://q.yesky.com">群樂</a> | <a href="http://my.yesky.com">社區</a> | <a href="http://blog.yesky.com/">博客</a> | <a href="http://www.mydown.com/">下載</a></div><div id="topbox"><div class="tleft"><a href="http://www.yesky.com"><img src="http://image.yesky.com/TLimages/img/head/logo.gif" border="0" alt ="天極Yesky_全球中文IT第一門戶"/></a></div><div class="tad"><span id="ad1"></span></div><div id="search"><div><form name="searchform" method="get" action="http://search.chinabyte.com/search" target="_blank"><input id="searchzz" name="q" onmouseover="this.focus()" onfocus="this.select()" type="text"/><input value="GB2312" name="encoding" type="hidden"/><input value="connect" name="dir" type="hidden"/><input value="20002" name="cid" type="hidden"/><input id="search_btn" type="submit" value="天極搜索"/></form></div><div class="tdq"><div class="rightarea"><a href="http://bj.yesky.com/">北京</a> <a href="http://hd.yesky.com/">上海</a> <a href="http://gd.yesky.com/">廣東</a> <a href="http://xa.yesky.com/">西安</a><br /><a href="http://cq.yesky.com/">重慶</a> <a href="http://cd.yesky.com/">成都</a> <a href="http://sy.yesky.com/">沈陽</a> <a href="http://js.yesky.com/">江蘇</a></div><div class="rightarea_right"><a href="http://my.yesky.com/">用戶<br/>登錄</a></div></div></div><div class="tright"> <div class="box1"> <script type="text/javascript" src="http://www.yesky.com/TLimages/include/content_text_ad.js"></script> </div></div></div><script type="text/javascript" src="http://image.yesky.com/TLimages/include/flash.js"></script>
<DIV id=childmenu><A href="http://soft.yesky.com/">軟件頻道></A><A href="http://dev.yesky.com/">程序開發></A><A href="http://dev.yesky.com/devjava/">Java</A><A href="http://dev.yesky.com/ysdevvb">VB</A><A href="http://dev.yesky.com/ysdevvc">VC</A><A href="http://dev.yesky.com/ysdevdelphi">Delphi</A><A href="http://dev.yesky.com/ysdevc">C/C++</A><A href="http://dev.yesky.com/web/">Web開發</A><A href="http://dev.yesky.com/msdn/">微軟專欄</A><A href="http://dev.yesky.com/devydkf/">移動</A><A href="http://dev.yesky.com/devsjk/">數據庫</A><A href="http://dev.yesky.com/ysdevcxrs">程序人生</A><A href="http://dev.yesky.com/ysdevrjgc">軟件工程</A>|<A href="http://soft.yesky.com/lesson/">軟件頻道產品中心</A><A href="http://soft.yesky.com/120/3327120.shtml">群樂</A><A href="http://www.mydown.com/soft/develop/news.shtml">下載</A></DIV>
<!--導航條-->
<div id="location">
<div class="loleft">您現在的位置: <a href="http://www.yesky.com">天極Yesky</a> > <a href="http://soft.yesky.com">軟件頻道</a> > <a href="http://dev.yesky.com">開發者網絡</a> > C語言嵌入式系統編程修煉之軟件架構篇</div>
<div class="adright"><span id="ad2"></span></div></div>
<!--內容塊開始-->
<div id="conbox">
<!--左邊開始-->
<div id="conleft">
<div id="contopla1"><div id="__001"><div class="qkong"></div><div class="qw1">全文</div><div class="zkong"><div class="kl"></div><div class="bj"><a href="#pls" target="_self">評論</a></div><div class="kr"></div><!-- Error --><script type="text/javascript">
var titiepic ="#";
if (titiepic!="#")
{
document.write("<div class=\"kl\"></div><div class=\"bj\"><a href=\"#\" target=\"_blank\">圖片</a></div><div class=\"kr\"></div>");
}
</script>
<!-- Error --></div></div></div>
<div class="topadbg"><span id="ad10"></span></div>
<a name="top"></a><div id="contitle"><h1>C語言嵌入式系統編程修煉之軟件架構篇</h1></div>
<div id="conauthor"><span>
2005-06-17 15:31
</span><span>作者:
宋寶華
</span><span>出處:
天極網
</span><span>責任編輯:<a href="http://comments.yesky.com/t/%B7%BD%D6%DB/6,324/2017631.shtml" title="向本編輯提問" target="_blank">方舟</a> </span></div>
<div class="topadbg"><span id="ad9"></span></div>
<div id="conneirong"><span id="ad3"></span>
<div class="guanggao"><span id="contentAdv"></span></div> <B>模塊劃分</B><BR><BR> 模塊劃分的"劃"是規劃的意思,意指怎樣合理的將一個很大的軟件劃分為一系列功能獨立的部分合作完成系統的需求。C語言作為一種結構化的程序設計語言,在模塊的劃分上主要依據功能(依功能進行劃分在面向對象設計中成為一個錯誤,牛頓定律遇到了相對論),C語言模塊化程序設計需理解如下概念:<BR><BR> (1) 模塊即是一個.c文件和一個.h文件的結合,頭文件(.h)中是對于該模塊接口的聲明;<BR><BR> ?。?) 某模塊提供給其它模塊調用的外部函數及數據需在.h中文件中冠以extern關鍵字聲明;<BR><BR> (3) 模塊內的函數和全局變量需在.c文件開頭冠以static關鍵字聲明;<BR><BR> ?。?) 永遠不要在.h文件中定義變量!定義變量和聲明變量的區別在于定義會產生內存分配的操作,是匯編階段的概念;而聲明則只是告訴包含該聲明的模塊在連接階段從其它模塊尋找外部函數和變量。如:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>/*module1.h*/<BR>int a = 5; /* 在模塊1的.h文件中定義int a */<BR><BR>/*module1 .c*/<BR>#include "module1.h" /* 在模塊1中包含模塊1的.h文件 */<BR><BR>/*module2 .c*/<BR>#include "module1.h" /* 在模塊2中包含模塊1的.h文件 */<BR><BR>/*module3 .c*/<BR>#include "module1.h" /* 在模塊3中包含模塊1的.h文件 */</TD></TR></TBODY></TABLE><BR> 以上程序的結果是在模塊1、2、3中都定義了整型變量a,a在不同的模塊中對應不同的地址單元,這個世界上從來不需要這樣的程序。正確的做法是:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>/*module1.h*/<BR>extern int a; /* 在模塊1的.h文件中聲明int a */<BR><BR>/*module1 .c*/<BR>#include "module1.h" /* 在模塊1中包含模塊1的.h文件 */<BR>int a = 5; /* 在模塊1的.c文件中定義int a */<BR><BR>/*module2 .c*/<BR>#include "module1.h" /* 在模塊2中包含模塊1的.h文件 */<BR><BR>/*module3 .c*/<BR>#include "module1.h" /* 在模塊3中包含模塊1的.h文件 */</TD></TR></TBODY></TABLE><BR> 這樣如果模塊1、2、3操作a的話,對應的是同一片內存單元。<BR><BR> 一個嵌入式系統通常包括兩類模塊:<BR><BR> (1)硬件驅動模塊,一種特定硬件對應一個模塊;<BR><BR> (2)軟件功能模塊,其模塊的劃分應滿足低偶合、高內聚的要求。<BR><BR> <B>多任務還是單任務</B><BR><BR> 所謂"單任務系統"是指該系統不能支持多任務并發操作,宏觀串行地執行一個任務。而多任務系統則可以宏觀并行(微觀上可能串行)地"同時"執行多個任務。<BR><BR> 多任務的并發執行通常依賴于一個多任務操作系統(OS),多任務OS的核心是系統調度器,它使用任務控制塊(TCB)來管理任務調度功能。TCB包括任務的當前狀態、優先級、要等待的事件或資源、任務程序碼的起始地址、初始堆棧指針等信息。調度器在任務被激活時,要用到這些信息。此外,TCB還被用來存放任務的"上下文"(context)。任務的上下文就是當一個執行中的任務被停止時,所要保存的所有信息。通常,上下文就是計算機當前的狀態,也即各個寄存器的內容。當發生任務切換時,當前運行的任務的上下文被存入TCB,并將要被執行的任務的上下文從它的TCB中取出,放入各個寄存器中。<BR><BR> 嵌入式多任務OS的典型例子有Vxworks、ucLinux等。嵌入式OS并非遙不可及的神壇之物,我們可以用不到1000行代碼實現一個針對80186處理器的功能最簡單的OS內核,作者正準備進行此項工作,希望能將心得貢獻給大家。<BR><BR> 究竟選擇多任務還是單任務方式,依賴于軟件的體系是否龐大。例如,絕大多數手機程序都是多任務的,但也有一些小靈通的協議棧是單任務的,沒有操作系統,它們的主程序輪流調用各個軟件模塊的處理程序,模擬多任務環境。<BR><BR><div class="right">共3頁。 <a class="page" href="2017631.shtml" target="_self"><font color="#666666"><b>1</b></font></a> <a class="page" href="2017631_1.shtml" target="_self"><b>2</b></a> <a class="page" href="2017631_2.shtml" target="_self"><b>3</b></a> <a class="page" href="2017631_1.shtml" target="_self"><font face="Webdings">8</font></a> <a class="page" href="2017631_2.shtml" target="_self"><font face="Webdings">:</font></a></div>
</div>
<!--廣告代碼開始-->
<script>
var ad_cid;
if (window.location.search.substring(1) != "")
{
ad_cid = window.location.search.substring(1);
} else {
ad_cid = 412;
}
</script>
<!--小通欄:c-scolumn頂部500*90-->
<span id="span_ad1">
<script language="JavaScript">
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-scolumn.js\"><\/script>");</script>
</span>
<script language="JavaScript">
document.getElementById("ad1").innerHTML=document.getElementById("span_ad1").innerHTML;
document.getElementById("span_ad1").innerHTML="";
</script>
<!--c-pip文章正文中間240*200-->
<span id="span_ad3">
<script language="JavaScript">
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-pip.js\"><\/script>");</script>
</span>
<script>
if(document.getElementById("contentAdv")) {
document.getElementById("contentAdv").innerHTML=document.getElementById("span_ad3").innerHTML;
document.getElementById("span_ad3").innerHTML="";
} else {
document.getElementById("ad3").innerHTML=document.getElementById("span_ad3").innerHTML;
document.getElementById("span_ad3").innerHTML="";
}</script>
<!--c-text-1“您現在的位置”右側文字-->
<span id="span_ad2">
<script language="JavaScript">
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-text-1.js\"><\/script>");</script>
</span>
<script language="JavaScript">
document.getElementById("ad2").innerHTML=document.getElementById("span_ad2").innerHTML;
document.getElementById("span_ad2").innerHTML="";
</script>
<!--c-column-2“標題”上面的廣告-->
<span id="span_ad10">
<script language="JavaScript">
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-column-2.js\"><\/script>");</script>
</span>
<script language="JavaScript">
document.getElementById("ad10").innerHTML=document.getElementById("span_ad10").innerHTML;
document.getElementById("span_ad10").innerHTML="";
</script>
<!--c-column-1“摘要”下面的廣告-->
<span id="span_ad9">
<div id="ad9ad">
<script language="JavaScript">
document.write("<script src=\"http://vd.yesky.com/html/"+ad_cid+"/"+ad_cid+"_c-column-1.js\"><\/script>");</script>
</div>
</span>
<script language="JavaScript">
document.getElementById("ad9").innerHTML=document.getElementById("span_ad9").innerHTML;
document.getElementById("span_ad9").innerHTML="";
</script>
<!--廣告代碼結束-->
<div id="ad7ad"><span id="ad7"></span></div>
<div class="clear"></div>
<div id="conlink">
<script type="text/javascript">var clipBoardContent = document.URL; function copyUserHomeToClipBoard() { window.clipboardData.setData("Text",clipBoardContent); alert("復制成功,請粘貼到你的QQ/MSN上推薦給你的好友!\r\n\r\n內容如下:\r\n" + clipBoardContent); }</script><form action="http://feedback.yesky.com/reader/user/doWelcome.view" name="feedbackForm" id="feedbackForm" target="_blank"> <input type="hidden" name="refurl" value="" id="refurl" /> <input type="hidden" name="reftitle" value="" id="reftitle" /></form><script type="text/javascript">document.write("<a href=\"http:\/\/dig.yesky.com\" id=\'yeskyDig\' onclick=\"javascript:this.href=\'http:\/\/dig.yesky.com\/ding.php?t=\'+encodeURIComponent(document.title)+\'&u=\'+escape(document.location.href)+\'&ac=ding\';\" target=_blank title=\"此文不錯,我頂!\"><b>我頂一下<\/b><\/a> <a onclick='javascript:submitFeedback();' style='cursor:hand;'><font color='#FF0000'><b>我要挑錯</b></font></a> <a href=\"#top\" target=\"_self\"><a href=\"javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(yesky=window.open('http://hot.yesky.com/dp.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t)+'&st=2','_blank','scrollbars=no,width=400,height=480,left=75,top=20,status=no,resizable=yes'));yesky.focus();\"title=\"推薦到天極網摘 http://hot.yesky.com [鼠標劃選本文摘要,然后點擊本圖片]\" target=\"_self\">收藏到天極收藏夾</a> <a href=\"JavaScript: copyUserHomeToClipBoard()\" target=\"_self\">復制鏈接發給好友</a> <a href=\"javascript:window.external.AddFavorite('"+clipBoardContent+"')\" target=\"_self\">加入收藏</a> <a href=\"javascript:window.print()\" target=\"_self\">打印</a> <img src=\"http://image.yesky.com/TLimages/newmobile/titlebg19.gif\" title=\"返回頂部\"/></a>");function submitFeedback() { document.getElementById("refurl").value=document.location.href; document.getElementById("reftitle").value=document.title; document.getElementById("feedbackForm").submit();}</script>
</div>
<div class="clear"></div>
<!--評論-->
<script language="JavaScript">
<!--
var aid = 2017631;
var channelid = 324;
var tagname = "";
//-->
</script>
<script language="JavaScript">
if(typeof(channelid) != "undefined") {
document.write("<script language=\"JavaScript\" charset=\"gb2312\" src=\"http://comments.yesky.com/channlereview/6/"+(channelid%5000)+"/"+channelid+".js\"><\/script>");
}
</script>
<script language="javascript">
<!--
if(typeof(aid) != "undefined") {
document.write("<script language=\"JavaScript\" charset=\"gb2312\" src=\"http://comments.yesky.com/articlereplies/6/"+(aid%5000)+"/"+aid+".js\"><\/script>");
}
//-->
</script>
<script type="text/javascript" src="http://image.yesky.com/TLimages/include/mobile_comment.js"></script>
<div class="clear"></div>
<!--相關文章等-->
<div id="conrele">
<div class="xgleft" id="__002"><div class="xgmenus">相關文章</div>
<dt>
<!-- Error -->
</dt>
</div>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -