0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式系统的内存指针操作

电子工程师 来源:张飞实战电子 作者:蔡琰老师 2021-08-27 11:33 次阅读

嵌入式系统中,对内存地址的操作是一个重要的方面,从广义上讲,嵌入式系统的地址空间可以分成以下三种类型:

系统的内存

处理器内部的寄存器映射

处理器外部部件的内存映射

无论哪种内存,一般都映射到处理器的内存空间中。在x86系统中,分为内存和I/O映射两种内存;在ARM体系中,全部的地址都在32位的内存空间中,所有的操作都是对32位地址空间内存的操作。

编程的角度看,嵌入式系统和PC系统的软件设计的一个重要的区别即在于嵌入式系统更重视对硬件的操作。而对硬件的操作需要通过操作内部寄存器和外围部件内存映射的地址实现,其实现方式都是通过对内存读、写两种操作。

汇编语言中,各种处理器都有对内存的不同的寻址方式读写内存。在高级语言中,C语言是唯一可以进行内存操作的语言,C语言对内存的操作主要需要通过指针来完成。

1、使用指针操作内存

在C语言中,指针是一种非常重要的数据类型。使用指针变量可以表示各种数据结构,能很方便地使用数组和字符串,并能像汇编一样处理内存地址。指针的本质就是一个地址,在32位的系统中,指针是一个32位的无符号整数。指针可以用一个变量来表示,变量的指针实际上就是变量的地址。存放变量地址的变量是指针变量。一个指针变量的值就是某个变量的地址或称为某变量的指针。

一个简单的指针应用如下所示:

int a;

int *p = &a;

这个例子表示,整型指针型变量p指向a的地址,此时对*p的操作等同于对a的操作。

使用指针可以指向一个变量,也可以指向一个由malloc函数分配的内存,例如:

void *p = malloc(1024);

系统分配1024字节的内存,然后让变量p指向这块内存,即p的值是这1024字节的连续内存的地址。在程序中就可以通过p来操作这块内存区域。在内存使用完成后,需要使用free函数讲内存释放。

free(p);

在嵌入式系统中的程序开发中,指针的值除了以上的两种形式(从系统内存分配或者指向变量)以外,还可以使用绝对的数值。这是由于在嵌入式系统中,外设寄存器和外部部件的内存映射的地址空间可能都是固定的,因此可以使用指针来处理他们。

例如,如果需要在地址0x0040处写入一个字节的数据0xf0,可以使用如下的程序:

unsigned char *p = (unsigned char *)0x0040;

*p = 0xf0;

这个程序定义了一个指向0x0040地址的字节型的指针,然后向该地址写入数据0xf0。

上面的程序等同于:

*(unsigned char *)0x0040 = 0xf0;

所以说不使用指针变量也可以对实际的地址操作。读内存的程序与之类似,可以使用指针变量或者直接使用地址得到内存中的数据。

2、指针的类型

前面的程序在内存的一个指定的地址处写入一个字节(8位)的数据。如果需要写入两个字节(16位)的数据,需要改变指针类型。例如:同样向地址0x0040处写入两个字节的数据0x0f0f,需要使用如下的语句:

*(unsigned short*)0x0040 = 0x0f0f;

在这个语句中,使用unsigned short而不使用unsigned char,short在C语言中代表16位的整数。

如果写入4个字节(32位)的数据,则需要使用一下的程序:

*(unsigned long*)0x0040 = 0xf0f0f0f0;

在这个语句中,使用unsigned long,long在C语言中代表32位的整数。

在32位的系统中,一般编译器认为int代表是32位的整数,等同于long,所以习惯使用int代替long作为内存操作的数据类型。

注意:指针的类型决定了使用指针进行读写操作时每次读写字节的数目。

3、指针的增量

在对指针变量的操作中,有时需要对指针变量进行加减运算。例如:

unsigned char *p = (unsigned char *)0x0040;

P++;

*p = 0xf0;

这段程序的含义是向地址0x0041的字节处写入数据0xf0。

指针加减运算的含义是:指针的单位增量(或减量)等于指针类型所占的内存量。

对指针进行增量操作的使用,增加的单位是以指针类型的大小:char类型的增量表示增加1字节的内存,short表示增加2字节的内存,long和int表示增加4字节的内存,这些工作是编译器根据指针的类型自动完成的。

总结:对指针进行加减运算的时候,它的变化量与指针的类型有关。

4、指针的类型转换

在C语言中,指针的类型可以在使用的时候进行转换。指针的本质是一个地址,在32位系统中,指针就是一个32位无符号的整数。因此,各种指针都可以相互转化,而且指针在转换过程并没有任何实质性的变化,只是告诉编译器,目前的指针指向何种的内存区域。

在嵌入式系统中,处理器的片内设备一般都会映射到处理器的地址空间中。这些寄存器有可能是32位的,有可能只有8位,这时就需要使用C语言中不同类型的指针。

总结:指针的本质是一个无符号的整数,各个类型的指针都可以进行相互转换。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18298

    浏览量

    222304
  • 嵌入式
    +关注

    关注

    4983

    文章

    18295

    浏览量

    288615
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72779

原文标题:聊一聊内存指针操作

文章出处:【微信号:CanaanTech,微信公众号:嘉楠科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    再谈嵌入式实时操作系统

    由于嵌入式处理器早期功能单一且运算能力不高,嵌入式应用已不能满足各个领域不断增长的需求。嵌入式操作系统应运而生,嵌入式
    的头像 发表于 04-09 17:27 217次阅读
    再谈<b class='flag-5'>嵌入式</b>实时<b class='flag-5'>操作系统</b>

    嵌入式系统发展前景?

    嵌入式系统发展前景? 嵌入式系统,从定义上来说,是一种专用的计算机系统,它被设计用来控制、监视或者帮助
    发表于 02-22 14:09

    嵌入式软件开发应该掌握哪些知识?

    的控制,如GPIO、串口、SPI、I2C 等。这使得嵌入式软件开发人员能够充分利用硬件资源,满足特定的需求。 1.2数据结构与算法 嵌入式系统通常具有有限的内存资源。通过使用合适的数据
    发表于 02-19 11:23

    嵌入式学习步骤

    语言编写。但是,有些嵌入式系统也使用其他编程语言,例如Python或Java。 (3).了解硬件:深入了解您要控制的硬件设备的功能和特性。您需要了解嵌入式系统的处理器、
    发表于 02-02 15:24

    什么是嵌入式系统嵌入式系统的具体应用

    嵌入式,一般是指嵌入式系统。用于控制、监视或者辅助操作机器和设备的装置。
    的头像 发表于 12-20 13:33 737次阅读

    嵌入式C语言高手炼成之内存操作

    嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力。在嵌入式
    的头像 发表于 12-11 17:20 255次阅读

    如何成为一名优秀的嵌入式工程师?

    来分配和释放内存。同时,也需要理解指针的概念及用法,以及指针内存管理中的作用。 2.掌握指针指针
    发表于 11-07 15:36

    什么是嵌入式Linux?

    Linux到底是什么呢? 嵌入式linux 是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。简单来说,是除了电脑之外可以运行程序的设备,将C
    发表于 10-11 13:47

    STM32嵌入式操作系统介绍

    嵌入式操作系统的特点• 嵌入式操作系统是一种用途广泛的系统软件,通常包括与硬件相关的底层驱动软件、系统
    发表于 09-28 06:59

    嵌入式编程和微控制器应用

    (嵌入式实时操作系统μC\\OS-Ⅱ(第2版附光盘)6前担任PROG-RESSIVERESOURCESLLC的软件开发主任,并开发了一些软件项目,包括消费品和工业品及测试设备
    发表于 09-20 07:52

    嵌入式操作系统IJLC/OS一Ⅱ在通信电源监控中应用

    的查询分析和统计等功能也必不可少。通信电源设备运行参数多,实时效果强,在设备当中选择功能强大的控制芯片.应用嵌入式操作系统.使其尽可能地发挥出强大的软件控制功能,满足用户对通信电源控制的各种要求。与传统
    发表于 09-20 06:46

    STM32嵌入式操作系统介绍

    嵌入式操作系统的特点• 嵌入式操作系统是一种用途广泛的系统软件,通常包括与硬件相关的底层驱动软件、系统
    发表于 09-11 07:24

    嵌入式学习路线你知道吗?

    学习嵌入式系统的构建 这一阶段主要学习带有操作系统嵌入式系统的构建,包括系统的启动流程、Boo
    发表于 06-14 16:00

    PX5的ARM TrustZone支持让嵌入式系统变得更加安全!

    。 PX5 RTOS支持IAR、Eclipse/GCC和ARM开发工具,支持ARM Cortex-M、Cortex-R和Cortex-A架构。麦克泰软件公司长期从事嵌入式与物联网操作系统、开发工具的销售以及服务培训工作,是PX5 RTOS的中国代理。
    发表于 05-18 13:44

    什么是ARM-Linux嵌入式操作系统移植呢?

    什么是ARM-Linux嵌入式操作系统移植呢?
    发表于 05-16 10:22