无忧商务网,免费信息发布推广平台,您可以 [登陆后台] 或 [免费注册] 无忧商务网 | 企业黄页 | 产品库存 | 供求信息 | 最新报价 | 企业资讯 | 展会信息
黄页信息| 库存信息| 技术服务| 供应信息| 求购信息| 二手信息| 加工信息| 供求库| 报价库| 展会库| 代理信息| 保健| 生活黄页| 食谱| 网络黄页| 水族休闲| 人力HR| 招聘
首页>>生活网>>生活保健>>3C小百科-消费性电子-其他
C语言嵌入式系统编程修炼之内存操作

<FONT face=宋体><STRONG>数据指针<BR><BR></STRONG>  在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的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>unsigned char *p = (unsigned char *)0xF000FF00;<BR>*p=11; <BR><BR>  以上程序的意义为在绝对地址0xF0000+0xFF00(80186使用16位段地址和16位偏移地址)写入11。<BR><BR>  在使用绝对地址指针时,要注意指针自增自减操作的结果取决于指针指向的数据类别。上例中p++后的结果是p= 0xF000FF01,若p指向int,即:<BR><BR>int *p = (int *)0xF000FF00; <BR><BR>  p++(或++p)的结果等同于:p = p+sizeof(int),而p-(或-p)的结果是p = p-sizeof(int)。<BR><BR>  同理,若执行:<BR><BR>long int *p = (long int *)0xF000FF00; <BR><BR>  则p++(或++p)的结果等同于:p = p+sizeof(long int) ,而p-(或-p)的结果是p = p-sizeof(long int)。<BR><BR>  记住:CPU以字节为单位编址,而C语言指针以指向的数据类型长度作自增和自减。理解这一点对于以指针直接操作内存是相当重要的。<BR><BR>  </FONT><FONT face=宋体><STRONG>函数指针<BR></STRONG><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>    typedef void (*lpFunction) ( ); /* 定义一个无参数、无返回类型的 */<BR>    /* 函数指针类型 */<BR>    lpFunction lpReset = (lpFunction)0xF000FFF0; /* 定义一个函数指针,指向*/<BR>    /* CPU启动后所执行第一条指令的位置 */<BR>    lpReset(); /* 调用函数 */ <BR><BR>  在以上的程序中,我们根本没有看到任何一个函数实体,但是我们却执行了这样的函数调用:lpReset(),它实际上起到了"软重启"的作用,跳转到CPU启动后第一条要执行的指令的位置。<BR><BR>  记住:函数无它,唯指令集合耳;你可以调用一个没有函数体的函数,本质上只是换一个地址开始执行指令!<BR><BR>  </FONT><FONT face=宋体><STRONG>数组vs.动态申请<BR></STRONG><BR>  在嵌入式系统中动态内存申请存在比一般系统编程时更严格的要求,这是因为嵌入式系统的内存空间往往是十分有限的,不经意的内存泄露会很快导致系统的崩溃。<BR><BR>  所以一定要保证你的malloc和free成对出现,如果你写出这样的一段程序:<BR><BR>    char * function(void)<BR>    {<BR>     char *p;<BR>     p = (char *)malloc(&#8230;);<BR>     if(p==NULL)<BR>      &#8230;;<BR>      &#8230; /* 一系列针对p的操作 */<BR>     return p; <BR>    } <BR><BR>  在某处调用function(),用完function中动态申请的内存后将其free,如下:<BR><BR>    char *q = function();<BR>    &#8230;<BR>    free(q); <BR><BR>  上述代码明显是不合理的,因为违反了malloc和free成对出现的原则,即"谁申请,就由谁释放"原则。不满足这个原则,会导致代码的耦合度增大,因为用户在调用function函数时需要知道其内部细节!<BR><BR>  正确的做法是在调用处申请内存,并传入function函数,如下:<BR><BR>    char *p=malloc(&#8230;);<BR>    if(p==NULL)</FONT>
相关资讯
类别浏览
安徽 北京 福建 甘肃 广东 广西 贵州 海南 河北 河南 黑龙江 湖北 湖南 吉林 江苏 宁夏 青海 山东 山西 陕西 上海 四川 天津 新疆 西藏 云南 浙江 重庆 辽宁 江西 内蒙古
无忧商务网 版权所有 Copyright © 2020.6 www.cn5135.com All Rights Reserved. 湘ICP备12008603号
本站所有产品都是会员自行发布,所有信息都有对方的企业名片和联系方式,如果您需要咨询产品具体参数和细节,请直接联系和咨询厂商,谢谢。
行业子站: 机械 库存 建材 物流 礼品 能源 农业 汽摩 食品 通讯 五金 玩具 矿产 印刷 休闲 服务 服装 化工 环保 电子 纺织 电工 电脑 电器 办公 安全 包装 仪器 家居