*((__far uint8_t*)
((__far uint8_t) 是C语言或某些汇编语言中的一个表达式形式,它表示对远处内存地址的数据进行间接访问,这里的 __far
指示地址可能是存储区的一部分,通常用于处理未初始化的、远离栈的内存或者外部设备的输入/输出操作。uint8_t
表示无符号8位整型,这是一种常见的数据类型,用来读取或修改单个字节。
这种表达式用于指针算术或数据通信场景,需要注意的是,由于涉及到未初始化的内存或非连续存储空间,直接使用可能会导致不可预测的结果,甚至安全漏洞。在编写代码时应谨慎处理并确保其合法性。
__attribute__((far))说明
__attribute__((far))
是 GCC 编译器的一个扩展,用于指示编译器将函数指针或数据指针指向内存空间较远的位置。在某些嵌入式系统中,内存空间被划分为多个区域,例如程序和数据可能存储在不同的内存区域,因此需要使用不同的指针类型来访问这些内存区域。__attribute__((far))
可以用于声明指向远程内存区域的函数指针或数据指针,以便编译器生成正确的指针访问代码。
例如,下面的代码声明了一个指向远程数据区域的指针:
uint8_t __attribute__((far)) *data_ptr;
这告诉编译器 data_ptr
指向内存空间较远的位置,并且编译器会使用正确的指针访问代码来访问该指针。
需要注意的是,__attribute__((far))
只有在特定的编译器和目标平台上才能使用,因此在编写可移植的代码时应该避免使用它。
单片机 near far
STM8单片机中 near
和 far
关键字的使用
在STM8单片机编程环境中,near
和 far
关键字主要用于指定指针所指向的数据或代码的位置范围。这些关键字影响编译器生成的目标代码以及访问方式。
Near 指针
Near指针是16位指针,仅包含地址的偏移量部分[^2]。这种类型的指针适用于位于同一段内的数据或代码访问,通常用于不超过64KB的空间范围内。由于其较小的尺寸和较快的速度,near指针被广泛应用于小型应用程序中。
// 定义一个near指针变量
int near *ptr_near;
Far 指针
Far指针则是一个更复杂的结构,由两部分组成——16位段地址加上16位偏移地址[^4]。这使得它可以跨越多个不同的内存段来寻址更大的地址空间(理论上可达1MB)。然而,相比于near指针而言,far指针会消耗更多的资源并可能带来性能上的损失。
// 定义一个far指针变量
char far *ptr_far;
编译模式的选择
不同版本的C编译器提供了多种编译模型供开发者选择,默认情况下通常是small model,在此模式下所有的指针都被视为near类型。但是当项目规模较大或者需要处理大量外部设备时,则可以选择large或其他支持更大地址空间的编译选项。
实际应用案例
考虑以下场景:在一个较大的嵌入式系统里存在多于64KB RAM的情况;此时就需要利用far指针来进行跨段操作:
#include <stdint.h>
uint16_t far memory_block[1024]; // 声明了一个位于远端存储区的大数组
void write_to_memory(uint16_t value){
int i;
for(i=0;i<1024;i++){
*(memory_block+i)=value; // 对大容量RAM进行写入操作
}
}
上述代码片段展示了如何声明和初始化一个far类型的数组,并对其进行读/写的简单实例。
相关推荐















