⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c语言嵌入式系统编程修炼之内存操作-软件频道-c-天极网2.htm

📁 C语言嵌入式系统编程修炼,关于如何编写高质量程序的文章,非常好!
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0041)http://soft.yesky.com/426/2020426_1.shtml -->
<HTML lang=zh-CN xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>C语言嵌入式系统编程修炼之内存操作-软件频道-C-天极网</TITLE>
<META 
content=C语言嵌入式系统编程修炼之内存操作,天极软件——中国最大最专业的软件频道。内容涵盖设计软件、操作系统、工具软件、程序开发、办公软件、网络安全、网站建设、IT教育八大领域,全面系统提供各类软件教程、软件技巧以及应用解决方案,提供最新最全的软件资讯、软件下载、软件应用互动交流平台。 
name=description>
<META content=C语言嵌入式系统编程修炼之内存操作,平面设计,照片处理,Vista,杀毒软件,qq软件,办公软件,网络安全,黑客,软件开发,软件下载 
name=keywords>
<META content="天极网 | 全球中文IT第一门户" name=author>
<META content="天极网 | 全球中文IT第一门户" name=Copyright>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META http-equiv=Content-Language content=zh-CN><LINK media=all 
href="C语言嵌入式系统编程修炼之内存操作-软件频道-C-天极网2.files/y_mobile_content.css" type=text/css 
rel=stylesheet>
<SCRIPT src="C语言嵌入式系统编程修炼之内存操作-软件频道-C-天极网2.files/showlay.js"></SCRIPT>

<META content="MSHTML 6.00.2900.3314" name=GENERATOR></HEAD>
<BODY><!--页面头部--><!--头部-->
<DIV>
<SCRIPT 
src="C语言嵌入式系统编程修炼之内存操作-软件频道-C-天极网2.files/kingsoft-kuanban-071105.js"></SCRIPT>
</DIV>
<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://fashion.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 id=pagelogo href="http://www.yesky.com/"><IMG 
alt=天极Yesky_全球中文IT第一门户 src="C语言嵌入式系统编程修炼之内存操作-软件频道-C-天极网2.files/logo.gif" 
border=0></A></DIV>
<DIV class=tad><SPAN id=ad1></SPAN></DIV>
<DIV id=search>
<DIV>
<FORM name=searchform action=http://search.chinabyte.com/search method=get 
target=_blank><INPUT id=searchzz onmouseover=this.focus() onfocus=this.select() 
name=q><INPUT type=hidden value=GB2312 name=encoding><INPUT type=hidden 
value=connect name=dir><INPUT type=hidden value=20002 name=cid><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://sz.yesky.com/">深圳</A><BR><A href="http://cd.yesky.com/">成都</A> <A 
href="http://cq.yesky.com/">重庆</A> <A href="http://sy.yesky.com/">沈阳</A> <A 
href="http://xa.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 src="C语言嵌入式系统编程修炼之内存操作-软件频道-C-天极网2.files/content_text_ad.js" 
type=text/javascript></SCRIPT>
</DIV></DIV></DIV>
<SCRIPT src="C语言嵌入式系统编程修炼之内存操作-软件频道-C-天极网2.files/flash.js" 
type=text/javascript></SCRIPT>

<DIV id=childmenu target="_blank"><A 
href="http://soft.yesky.com/">软件频道&gt;</A><A 
href="http://design.yesky.com/">设计</A><A href="http://tools.yesky.com/">工具</A><A 
href="http://os.yesky.com/">系统</A><A href="http://dev.yesky.com/">开发</A><A 
href="http://soft.yesky.com/security/">安全</A><A 
href="http://soft.yesky.com/office/">办公</A><A 
href="http://homepage.yesky.com/">陶吧</A><A 
href="http://edu.yesky.com/">IT教育</A><A 
href="http://vista.yesky.com/">Vista频道</A>|<A 
href="http://soft.yesky.com/lesson/" target=_blank>软件频道产品中心</A> <A 
href="http://q.yesky.com/group/search.do?cid=661" target=_blank>群乐</A> <A 
href="http://www.mydown.com/soft/" target=_blank>软件下载</A> <FONT color=#ff0000 
target="_blank"><A href="http://q.yesky.com/group/202019" target=_blank><FONT 
color=#ff0000>Vista群乐</FONT></A> </FONT></A></DIV><!--导航条-->
<DIV id=location>
<DIV class=loleft>您现在的位置: <A href="http://www.yesky.com/" target=_self>天极网</A> 
&gt; <A href="http://soft.yesky.com/" target=_self>软件频道</A> &gt; 
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="http://soft.yesky.com/426/2020426_1.shtml#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 style="PADDING-BOTTOM: 5px"><SPAN id=ad10></SPAN></DIV><A 
name=top></A>
<DIV id=contitle>
<H1>C语言嵌入式系统编程修炼之内存操作</H1></DIV>
<DIV id=conauthor><SPAN>2005-06-23 14:08 </SPAN><SPAN>作者: 宋宝华 </SPAN><SPAN>出处: 
天极网 </SPAN><SPAN>责任编辑:<A title=向本编辑提问 
href="http://comments.yesky.com/t/·&frac12;&Ouml;&Ucirc;/6,324/2020426.shtml" 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>关键字const</B><BR><BR>  const意味着"只读"。区别如下代码的功能非常重要,也是老生长叹,如果你还不知道它们的区别,而且已经在<A 
class=bluekey href="http://dev.yesky.com/" 
target=_blank>程序</A>界摸爬滚打多年,那只能说这是一个悲哀:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
  <TBODY>
  <TR>
    <TD>const int a;<BR>int const a;<BR>const int *a;<BR>int * const a;<BR>int 
      const * a const;</TD></TR></TBODY></TABLE><BR>  (1) 
关键字const的作用是为给读你代码的人传达非常有用的信息。例如,在函数的形参前添加const关键字意味着这个参数在函数体内不会被修改,属于"输入参数"。在有多个形参的时候,函数的调用者可以凭借参数前是否有const关键字,清晰的辨别哪些是输入参数,哪些是可能的输出参数。<BR><BR>  (2)合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改,这样可以减少bug的出现。<BR><BR>  const在C++语言中则包含了更丰富的含义,而在C语言中仅意味着:"只能读的普通变量",可以称其为"不能改变的变量"(这个说法似乎很拗口,但却最准确的表达了C语言中const的本质),在编译阶段需要的常数仍然只能以#define宏定义!故在C语言中如下程序是非法的:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
  <TBODY>
  <TR>
    <TD>const int SIZE = 10;<BR>char a[SIZE]; /* 非法:编译阶段不能用到变量 
*/</TD></TR></TBODY></TABLE><BR>  <B>关键字volatile</B><BR><BR>  C语言编译器会对用户书写的代码进行优化,譬如如下代码:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
  <TBODY>
  <TR>
    <TD>int a,b,c;<BR>a = inWord(0x100); /*读取I/O空间0x100端口的内容存入a变量*/<BR>b = 
      a;<BR>a = inWord (0x100); /*再次读取I/O空间0x100端口的内容存入a变量*/<BR>c = 
  a;</TD></TR></TBODY></TABLE><BR>  很可能被编译器优化为:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
  <TBODY>
  <TR>
    <TD>int a,b,c;<BR>a = inWord(0x100); /*读取I/O空间0x100端口的内容存入a变量*/<BR>b = 
      a;<BR>c = 
a;</TD></TR></TBODY></TABLE><BR>  但是这样的优化结果可能导致错误,如果I/O空间0x100端口的内容在执行第一次读操作后被其它程序写入新值,则其实第2次读操作读出的内容与第一次不同,b和c的值应该不同。在变量a的定义前加上volatile关键字可以防止编译器的类似优化,正确的做法是:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
  <TBODY>
  <TR>
    <TD>volatile int 
a;</TD></TR></TBODY></TABLE><BR>  volatile变量可能用于如下几种情况:<BR><BR>  (1) 并行设备的<A 
class=bluekey href="http://diy.yesky.com/" 
target=_blank>硬件</A>寄存器(如:状态寄存器,例中的代码属于此类);<BR><BR>  (2) 
一个中断服务子程序中会访问到的非自动变量(也就是全局变量);<BR><BR>  (3) 
多线程应用中被几个任务共享的变量。<BR><BR>  <B>CPU字长与存储器位宽不一致处理</B><BR><BR>  在背景篇中提到,本文特意选择了一个与CPU字长不一致的存储<A 
class=bluekey href="http://diy.yesky.com/cpu/" 
target=_blank>芯片</A>,就是为了进行本节的讨论,解决CPU字长与存储器位宽不一致的情况。80186的字长为16,而NVRAM的位宽为8,在这种情况下,我们需要为NVRAM提供读写字节、字的接口,如下: 
<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
  <TBODY>
  <TR>
    <TD>typedef unsigned char BYTE;<BR>typedef unsigned int WORD; <BR>/* 
      函数功能:读NVRAM中字节 <BR>* 参数:wOffset,读取位置相对NVRAM基地址的偏移<BR>* 
      返回:读取到的字节值<BR>*/<BR>extern BYTE ReadByteNVRAM(WORD 
      wOffset)<BR>{<BR> LPBYTE lpAddr = (BYTE*)(NVRAM + wOffset * 2); /* 
      为什么偏移要×2? */<BR><BR> return *lpAddr;<BR>}<BR><BR>/* 函数功能:读NVRAM中字<BR>* 
      参数:wOffset,读取位置相对NVRAM基地址的偏移<BR>* 返回:读取到的字<BR>*/<BR>extern WORD 
      ReadWordNVRAM(WORD wOffset)<BR>{<BR> WORD wTmp = 0;<BR> LPBYTE 
      lpAddr;<BR> /* 读取高位字节 */<BR> lpAddr = (BYTE*)(NVRAM + wOffset * 2); /* 
      为什么偏移要×2? */ <BR> wTmp += (*lpAddr)*256;<BR> /* 读取低位字节 */<BR> lpAddr = 
      (BYTE*)(NVRAM + (wOffset +1) * 2); /* 为什么偏移要×2? */<BR> wTmp += 
      *lpAddr;<BR> return wTmp;<BR>}<BR><BR>/* 函数功能:向NVRAM中写一个字节 
      <BR>*参数:wOffset,写入位置相对NVRAM基地址的偏移<BR>* byData,欲写入的字节<BR>*/<BR>extern void 
      WriteByteNVRAM(WORD wOffset, BYTE byData)<BR>{<BR> …<BR>}<BR><BR>/* 
      函数功能:向NVRAM中写一个字 */<BR>*参数:wOffset,写入位置相对NVRAM基地址的偏移<BR>* 
      wData,欲写入的字<BR>*/<BR>extern void WriteWordNVRAM(WORD wOffset, WORD 
      wData)<BR>{<BR> …<BR>}</TD></TR></TBODY></TABLE><BR>  子贡问曰:Why偏移要乘以2?<BR><BR>  子曰:请看图1,16位80186与8位NVRAM之间互连只能以地址线A1对其A0,CPU本身的A0与NVRAM不连接。因此,NVRAM的地址只能是偶数地址,故每次以0x10为单位前进!<BR><BR>
<TABLE width="90%" align=center border=0>
  <TBODY>
  <TR>
    <TD>
      <DIV align=center><IMG 
      src="C语言嵌入式系统编程修炼之内存操作-软件频道-C-天极网2.files/97jik0sj92yu.jpg" border=0><BR>图1 
      CPU与NVRAM地址线连接</DIV></TD></TR></TBODY></TABLE><BR>  子贡再问:So why 
80186的地址线A0不与NVRAM的A0连接?<BR><BR>  子曰:请看《IT论语》之《微机原理篇》,那里面讲述了关于计算机组成的圣人之道。<BR><BR>  <B>总结</B><BR><BR>  本篇主要讲述了嵌入式系统C编程中内存操作的相关技巧。掌握并深入理解关于数据指针、函数指针、动态申请内存、const及volatile关键字等的相关知识,是一个优秀的C语言程序<A 
class=bluekey href="http://design.yesky.com/" 
target=_blank>设计</A>师的基本要求。当我们已经牢固掌握了上述技巧后,我们就已经学会了C语言的99%,因为C语言最精华的内涵皆在内存操作中体现。<BR><BR>  我们之所以在嵌入式系统中使用C语言进行程序设计,99%是因为其强大的内存操作能力!<BR><BR>  如果你爱编程,请你爱C语言;<BR><BR>  如果你爱C语言,请你爱指针;<BR><BR>  如果你爱指针,请你爱指针的指针!
<DIV id=numpage>共2页。 <A href="http://soft.yesky.com/426/2020426.shtml" 
target=_self><FONT face=Webdings>9</FONT></A> <A 
href="http://soft.yesky.com/426/2020426.shtml" target=_self>1</A> <A 
href="http://soft.yesky.com/426/2020426_1.shtml" 
target=_self><SPAN>2</SPAN></A></DIV></DIV><!--网校合作代码-->
<STYLE>.cpcw {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; OVERFLOW: hidden; WIDTH: 400px; PADDING-TOP: 10px; WHITE-SPACE: nowrap; HEIGHT: 12px; TEXT-ALIGN: center
}
.cpcw A:link {
	FONT-WEIGHT: bold; FONT-SIZE: 12px
}
.cpcw A:visited {
	FONT-WEIGHT: bold; FONT-SIZE: 12px
}
.cpcw A:hover {
	FONT-WEIGHT: bold; FONT-SIZE: 12px
}
.cpcw A:active {
	FONT-WEIGHT: bold; FONT-SIZE: 12px
}
</STYLE>

<DIV class=cpcw>
<SCRIPT language=JavaScript 
src="C语言嵌入式系统编程修炼之内存操作-软件频道-C-天极网2.files/cpcwedu.js"></SCRIPT>
</DIV>
<DIV class=clear></DIV>
<SCRIPT>
var key="C";
</SCRIPT>

<SCRIPT src="C语言嵌入式系统编程修炼之内存操作-软件频道-C-天极网2.files/product_search.js"></SCRIPT>

<DIV class=clear style="MARGIN-BOTTOM: 8px"></DIV><!--广告代码开始-->
<SCRIPT>
var ad_cid;
if (window.location.search.substring(1) != "")
{
ad_cid = window.location.search.substring(1);
} else {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -