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

2021-08-27 15:39 来源:电子说

在嵌入式系统中,内存地址的操作是一个重要的方面。广义来说,嵌入式系统的地址空间可以分为以下三种类型:

系统内存

处理器内的寄存器映射

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

从编程的角度来看,嵌入式系统和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函数来谈论内存释放。

免费(p);

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

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

无符号char *p=(无符号char *)0x 0040;

* p=0xf0

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

上述程序相当于:

*(无符号字符*)0x 0040=0xf 0;

因此,您可以在不使用指针变量的情况下对实际地址进行操作。类似于读取内存的程序,可以使用指针变量或者直接使用地址来获取内存中的数据。

2.指针类型

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

*(无符号短*)0x 0040=0x0f 0f;

在此语句中,使用无符号短字符代替无符号字符,短字符在c语言中代表16位整数。

如果写入4字节(32位)的数据,则需要使用以下步骤:

*(无符号长*)0x 0040=0xf0f 0f 0;

在这个语句中,使用了无符号长整型,它在C语言中表示一个32位整数。

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

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

3.指针增量

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

无符号char *p=(无符号char *)0x 0040;

p;

* p=0xf0

该程序的含义是将数据0xf0写入地址0x0041的字节。

指针加减表示指针的单位增量(或减量)等于指针类型占用的内存量。

指针的增量单位是指针类型的大小:char类型的增量表示增加1字节内存,short表示增加2字节内存,long和int表示增加4字节内存。这些任务由编译器根据指针的类型自动完成。

总结:加减指针时,其变化与指针的类型有关。

4.指针的类型转换

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

在嵌入式系统中,处理器的片上设备通常被映射到处理器的地址空间。这些寄存器可能是32位,也可能只有8位,所以在C语言中需要使用不同类型的指针。

总结:指针的本质是无符号整数,各种指针可以相互转换。

延伸 · 阅读