📄 c语言嵌入式系统编程修炼之内存操作-软件-c-天极pointer2yesky.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://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/office/">办公</A><A href="http://homepage.yesky.com/">陶吧</A><A href="http://soft.yesky.com/security/">安全</A><A href="http://edu.yesky.com/">IT教育</A><A href="http://vista.yesky.com/">Vista频道</A>|<A href="http://soft.yesky.com/lesson/">软件频道产品中心</A><A href="http://q.yesky.com/group/search.do?cid=661">群乐</A><A href="http://www.mydown.com/soft/">软件下载</A></DIV>
<!--导航条-->
<div id="location">
<div class="loleft">您现在的位置: <a href="http://www.yesky.com">天极Yesky</a> > <a href="http://soft.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-23 14:08
</span><span>作者:
宋宝华
</span><span>出处:
天极网
</span><span>责任编辑:<a href="http://comments.yesky.com/t/%B7%BD%D6%DB/6,324/2020426.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>关键字const</B><BR><BR> const意味着"只读"。区别如下代码的功能非常重要,也是老生长叹,如果你还不知道它们的区别,而且已经在程序界摸爬滚打多年,那只能说这是一个悲哀:<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) 并行设备的硬件寄存器(如:状态寄存器,例中的代码属于此类);<BR><BR> (2) 一个中断服务子程序中会访问到的非自动变量(也就是全局变量);<BR><BR> (3) 多线程应用中被几个任务共享的变量。<BR><BR> <B>CPU字长与存储器位宽不一致处理</B><BR><BR> 在背景篇中提到,本文特意选择了一个与CPU字长不一致的存储芯片,就是为了进行本节的讨论,解决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="/imagelist/05/06/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语言程序设计师的基本要求。当我们已经牢固掌握了上述技巧后,我们就已经学会了C语言的99%,因为C语言最精华的内涵皆在内存操作中体现。<BR><BR> 我们之所以在嵌入式系统中使用C语言进行程序设计,99%是因为其强大的内存操作能力!<BR><BR> 如果你爱编程,请你爱C语言;<BR><BR> 如果你爱C语言,请你爱指针;<BR><BR> 如果你爱指针,请你爱指针的指针!<div class="right">共2页。 <a class="page" href="2020426.shtml" target="_self"><font face="Webdings">9</font></a> <a class="page" href="2020426.shtml" target="_self"><font face="Webdings">7</font></a> <a class="page" href="2020426.shtml" target="_self"><b>1</b></a> <a class="page" href="2020426_1.shtml" target="_self"><font color="#666666"><b>2</b></font></a></div>
</div>
<!--广告代码开始-->
<script>
var ad_cid;
if (window.location.search.substring(1) != "")
{
ad_cid = window.location.search.substring(1);
} else {
ad_cid = 324;
}
</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">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -