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

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

📁 最全的介绍C语言结构体的使用方法和使用技巧!
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<!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/">软件频道&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/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> &gt; <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>数据指针</B><BR><BR>  在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力。在嵌入式系统的实际调试中,多借助C语言指针所具有的对绝对地址单元内容的读写能力。以指针直接操作内存多发生在如下几种情况:<BR><BR>  (1) 某I/O芯片被定位在CPU的存储空间而非I/O空间,而且寄存器对应于某特定地址;<BR><BR>  (2) 两个CPU之间以双端口RAM通信,CPU需要在双端口RAM的特定单元(称为mail box)书写内容以在对方CPU产生中断;<BR><BR>  (3) 读取在ROM或FLASH的特定单元所烧录的汉字和英文字模。<BR><BR>  譬如: <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>unsigned char *p = (unsigned char *)0xF000FF00;<BR>*p=11;</TD></TR></TBODY></TABLE><BR>  以上程序的意义为在绝对地址0xF0000+0xFF00(80186使用16位段地址和16位偏移地址)写入11。<BR><BR>  在使用绝对地址指针时,要注意指针自增自减操作的结果取决于指针指向的数据类别。上例中p++后的结果是p= 0xF000FF01,若p指向int,即:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>int *p = (int *)0xF000FF00;</TD></TR></TBODY></TABLE><BR>  p++(或++p)的结果等同于:p = p+sizeof(int),而p-(或-p)的结果是p = p-sizeof(int)。<BR><BR>  同理,若执行:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>long int *p = (long int *)0xF000FF00;</TD></TR></TBODY></TABLE><BR>  则p++(或++p)的结果等同于:p = p+sizeof(long int) ,而p-(或-p)的结果是p = p-sizeof(long int)。<BR><BR>  记住:CPU以字节为单位编址,而C语言指针以指向的数据类型长度作自增和自减。理解这一点对于以指针直接操作内存是相当重要的。<BR><BR>  <B>函数指针</B><BR><BR>  首先要理解以下三个问题:<BR><BR>  (1)C语言中函数名直接对应于函数生成的指令代码在内存中的地址,因此函数名可以直接赋给指向函数的指针;<BR><BR>  (2)调用函数实际上等同于"调转指令+参数传递处理+回归位置入栈",本质上最核心的操作是将函数生成的目标代码的首地址赋给CPU的PC寄存器;<BR><BR>  (3)因为函数调用的本质是跳转到某一个地址单元的code去执行,所以可以"调用"一个根本就不存在的函数实体,晕?请往下看: <BR><BR>  请拿出你可以获得的任何一本大学《微型计算机原理》教材,书中讲到,186 CPU启动后跳转至绝对地址0xFFFF0(对应C语言指针是0xF000FFF0,0xF000为段地址,0xFFF0为段内偏移)执行,请看下面的代码:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>typedef void (*lpFunction) ( ); /* 定义一个无参数、无返回类型的 */<BR>/* 函数指针类型 */<BR>lpFunction lpReset = (lpFunction)0xF000FFF0; /* 定义一个函数指针,指向*/<BR>/* CPU启动后所执行第一条指令的位置 */<BR>lpReset(); /* 调用函数 */</TD></TR></TBODY></TABLE><BR>  在以上的程序中,我们根本没有看到任何一个函数实体,但是我们却执行了这样的函数调用:lpReset(),它实际上起到了"软重启"的作用,跳转到CPU启动后第一条要执行的指令的位置。<BR><BR>  记住:函数无它,唯指令集合耳;你可以调用一个没有函数体的函数,本质上只是换一个地址开始执行指令!<BR><BR>  <B>数组vs.动态申请</B><BR><BR>  在嵌入式系统中动态内存申请存在比一般系统编程时更严格的要求,这是因为嵌入式系统的内存空间往往是十分有限的,不经意的内存泄露会很快导致系统的崩溃。<BR><BR>  所以一定要保证你的malloc和free成对出现,如果你写出这样的一段程序:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>char * function(void)<BR>{<BR> char *p;<BR> p = (char *)malloc(…);<BR> if(p==NULL)<BR>  …;<BR>  … /* 一系列针对p的操作 */<BR> return p; <BR>}</TD></TR></TBODY></TABLE><BR>  在某处调用function(),用完function中动态申请的内存后将其free,如下:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>char *q = function();<BR>…<BR>free(q);</TD></TR></TBODY></TABLE><BR>  上述代码明显是不合理的,因为违反了malloc和free成对出现的原则,即"谁申请,就由谁释放"原则。不满足这个原则,会导致代码的耦合度增大,因为用户在调用function函数时需要知道其内部细节!<BR><BR>  正确的做法是在调用处申请内存,并传入function函数,如下:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>char *p=malloc(…);<BR>if(p==NULL)<BR>…;<BR>function(p);<BR>…<BR>free(p);<BR>p=NULL;</TD></TR></TBODY></TABLE><BR>  而函数function则接收参数p,如下:<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>void function(char *p)<BR>{<BR> … /* 一系列针对p的操作 */<BR>}</TD></TR></TBODY></TABLE><BR>  基本上,动态申请内存方式可以用较大的数组替换。对于编程新手,笔者推荐你尽量采用数组!嵌入式系统可以以博大的胸襟接收瑕疵,而无法"海纳"错误。毕竟,以最笨的方式苦练神功的郭靖胜过机智聪明却范政治错误走反革命道路的杨康。<BR><BR>  给出原则:<BR><BR>  (1)尽可能的选用数组,数组不能越界访问(真理越过一步就是谬误,数组越过界限就光荣地成全了一个混乱的嵌入式系统);<BR><BR>  (2)如果使用动态申请,则申请后一定要判断是否申请成功了,并且malloc和free应成对出现!<BR><BR><div class="right">共2页。 <a class="page" href="2020426.shtml" target="_self"><font color="#666666"><b>1</b></font></a> <a class="page" href="2020426_1.shtml" target="_self"><b>2</b></a> <a class="page" href="2020426_1.shtml" target="_self"><font face="Webdings">8</font></a> <a class="page" href="2020426_1.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 = 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>

⌨️ 快捷键说明

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