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

    文章

    20325

    浏览量

    254694
  • 嵌入式
    +关注

    关注

    5209

    文章

    20625

    浏览量

    336759
  • 内存
    +关注

    关注

    9

    文章

    3231

    浏览量

    76497

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何成为一名高薪嵌入式工程师?

    精通指针内存管理、结构体、位操作等,理解底层硬件交互原理。 C++(可选):面向对象编程在嵌入式Linux或复杂系统中应用广泛,如驱动开
    发表于 04-09 09:03

    嵌入式单片机开发学习路径

    学习C语言 C语言是嵌入式开发的基础。掌握C语言的基本语法、指针、结构体、内存管理等内容是进入嵌入式开发的前提。 2. 硬件知识 2.1 认识单片机 单片机是
    发表于 02-09 15:42

    什么是嵌入式应用开发?

    概述 所谓的嵌入式应用开发就是在嵌入式操作系统下进行开发、软硬件综合开发 ‌嵌入式应用开发‌是指在嵌入式
    发表于 01-12 16:13

    C语言嵌入式系统编程注意事项-内存操作

    C语言嵌入式系统编程注意事项之内存操作嵌入式系统的编程中,常常要求在特定的
    发表于 01-04 07:31

    嵌入式系统中,动态分配内存可能发生的问题是什么?

    尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。 那么嵌入式
    发表于 12-22 09:42

    什么是嵌入式操作系统

    要理解嵌入式操作系统(Embedded Operating System,简称 RTOS/EOS),我们可以从本质定义→核心区别→实际作用→典型特征→嵌入式开发场景适配,五个维度来拆解, 一
    发表于 12-09 10:33

    嵌入式系统的定义和应用领域

    。尽管有些嵌入式系统可能包含操作系统,但大多数情况下,它们仅由一个程序来控制整个逻辑。 从更专业的角度来看,嵌入式系统可以被定义为:以应用
    发表于 11-17 06:49

    嵌入式实时操作系统的特点

    操作系统具备高效的中断处理机制,能够快速响应和处理系统的中断事件。 资源管理:实时嵌入式操作系统提供有效的资源管理机制,包括内存管理、设备驱
    发表于 11-13 06:30

    RusT-Thread:基于Rust面向资源受限嵌入式设备的操作系统的实践 | 技术集结

    摘要随着物联网和嵌入式系统的发展,实时操作系统(RTOS)的安全性和性能需求日益提高。传统基于C语言的RTOS在内存安全和并发控制方面存在局限,容易导致缓冲区溢出、数据竞争等问题。本项
    的头像 发表于 11-07 17:37 7035次阅读
    RusT-Thread:基于Rust面向资源受限<b class='flag-5'>嵌入式</b>设备的<b class='flag-5'>操作系统</b>的实践 | 技术集结

    嵌入式需要掌握哪些核心技能?

    : 1)C语言与底层编程 核心地位:C语言是嵌入式开发的基石,需精通指针操作内存管理、位运算,直接操控硬件资源。 延伸技能:C++用于复杂项目架构设计,汇编语言优化底层性能(如启动代
    发表于 10-21 16:25

    嵌入式达到什么水平才能就业?

    、LoRa、NB-IoT,能实现嵌入式设备与云端平台的数据交互了解 RTOS 实时操作系统:如 FreeRTOS、RT-Thread,能进行任务创建、信号量管理、内存分配
    发表于 09-15 10:20

    入行嵌入式应该怎么准备?

    知识: 一、C/C++编程C/C++是嵌入式系统开发中最常用的编程语言。熟练掌握C/C++语言将使你能够理解和编写底层驱动程序、操作系统以及与硬件交互的代码。对于嵌入式
    发表于 08-06 10:34

    Linux嵌入式和单片机嵌入式的区别?

    :使用Linux操作系统,可以运行各种复杂的应用程序和驱动程序。 4. 资源需求 : 单片机嵌入式 :对硬件资源的需求较低,通常只需要一个单片机芯片,内存和存储空间较小。 Linux嵌入
    发表于 06-20 09:46

    嵌入式开发,如何选择适合的系统

    嵌入式ARM开发中,面对多种操作系统的选择,如何做出最适合项目的决策?本文将为您梳理常见系统的特性,帮助您快速了解它们的优缺点,以便更好地选择适合的系统。引言在
    的头像 发表于 05-20 11:32 1289次阅读
    <b class='flag-5'>嵌入式</b>开发,如何选择适合的<b class='flag-5'>系统</b>?

    嵌入式开发入门指南:从零开始学习嵌入式

    特定功能的计算机系统,广泛应用于智能家居、工业控制、医疗设备、车载系统等领域。 2. 学习嵌入式开发的前置知识熟悉C语言编程掌握基本的数据结构与算法了解数字电路与微控制器原理熟悉Linux操作
    发表于 05-15 09:29