内存操作分析和总结.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

数据指针

在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力。在嵌入式系统的实际调试中,多借助C语言指针所具有的对绝对地址单元内容的读写能力。以指针直接操作内存多发生在如下几种情况:

某I/O芯片被定位在CPU的存储空间而非I/O空间,而且寄存器对应于某特定地址;

两个CPU之间以双端口RAM通信,CPU需要在双端口RAM的特定单元(称为mailbox)书写内容以在对方CPU产生中断;

读取在ROM或FLASH的特定单元所烧录的汉字和英文字模。

譬如:

unsignedchar*p=(unsignedchar*)0xF000FF00;

unsignedchar*p=(unsignedchar*)0xF000FF00;

*p=11;

以上程序的意义为在绝对地址0xF0000+0xFF00(80186使用16位段地址和16位偏移地址)写入11。

int*p=(int*)0xF000FF00;在使用绝对地址指针时,要注意指针自增自减操作的结果取决于指针指向的数据类别。上例中p++后的结果是p=0xF000FF01,若p指向int,即:

int*p=(int*)0xF000FF00;

p++(或++p)的结果等同于:p=p+sizeof(int),而p-(或-p)的结果是p=p-sizeof(int)。

同理,若执行:

longint*p=(longint*)0xF000FF00;

longint*p=(longint*)0xF000FF00;

则p++(或++p)的结果等同于:p=p+sizeof(longint),而p-(或-p)的结果是p=p-sizeof(longint)。

记住:CPU以字节为单位编址,而C语言指针以指向的数据类型长度作自增和自减。理解这一点对于以指针直接操作内存是相当重要的。

函数指针

首先要理解以下三个问题:

(1)C语言中函数名直接对应于函数生成的指令代码在内存中的地址,因此函数名可以直接赋给指向函数的指针;

调用函数实际上等同于调转指令+参数传递处理+回归位置入栈,本质上最核心的操作是将函数生成的目标代码的首地址赋给CPU的PC寄存器;

因为函数调用的本质是跳转到某一个地址单元的code去执行,所以可以调用一个根本就不存在的函数实体,晕?请往下看:

typedefvoid(*lpFunction)();/*定义一个无参数、无返回类型的*//*函数指针类型*/lpFunctionlpReset=(lpFunction)0xF000FFF0;/*定义一个函数指针,指向*//*CPU启动后所执行第一条指令的位置*/lpReset();/*调用函数*/请拿出你可以获得的任何一本大学《微型计算机原理》教材,书中讲到,186CPU

typedefvoid(*lpFunction)();/*定义一个无参数、无返回类型的*/

/*函数指针类型*/

lpFunctionlpReset=(lpFunction)0xF000FFF0;/*定义一个函数指针,指向*/

/*CPU启动后所执行第一条指令的位置*/lpReset();/*调用函数*/

在以上的程序中,我们根本没有看到任何一个函数实体,但是我们却执行了这样的函数调用:lpReset(),它实际上起到了软重启的作用,跳转到CPU启动后第一条要执行的指令的位置。

记住:函数无它,唯指令集合耳;你可以调用一个没有函数体的函数,本质上只是换一个地址开始执行指令!

数组vs.动态申请

在嵌入式系统中动态内存申请存在比一般系统编程时更严格的要求,这是因为嵌入式系统的内存空间往往是十分有限的,不经意的内存泄露会很快导致系统的崩溃。

所以一定要保证你的malloc和free成对出现,如果你写出这样的一段程序:

char*function(void)

char*function(void)

{

char*p;

p=(char*)malloc(…);

if(p==NULL)

…;

…/*一系列针对p的操作*/returnp;

}

在某处调用function(),用完function中动态申请的内存后将其free,如下:

char*q=function();

char*q=function();

free(q);

上述代码明显是不合理的,因为违反了mal

文档评论(0)

tianya189 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档