嵌入式系统的内存指针操作
在嵌入式系统中,内存地址的操作是一个重要的方面。广义来说,嵌入式系统的地址空间可以分为以下三种类型:
系统内存
处理器内的寄存器映射
处理器外部组件的内存映射
从编程的角度来看,嵌入式系统和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语言中需要使用不同类型的指针。
总结:指针的本质是无符号整数,各种指针可以相互转换。
延伸 · 阅读
- 2021-08-27 15:39基于经典滤波算法的图像恢复技术研究
- 2021-08-27 15:39保伦电子国贸音视频系统助力商州区高级中学保百余弦
- 2021-08-27 15:39AMD RX 6700 XT显卡出道 定价479美元
- 2021-08-27 15:39全球电动化程度最高的国家是哪个国家?
- 2021-08-27 15:39TBAC的组成结构及在图书馆管理系统中的应用研究
- 2021-08-27 15:39特斯拉加州厂通知部分员工29日报到 准备下月复工