**定义变量到固定地址的方法 **
在嵌入式编程中,经常需要定义一些特殊的变量(如:控制类寄存器,或者为了某个目的,要“强霸“某处内存),因此,熟练掌握将变量定义到固定的地址,是嵌入式编程的基本技能之一。
一、 通用方法1:
通用方法是指任何编译器均支持,支持任意数据类型,但不支持数组,示例:
#define VarA (*(uint32 )0x12345678) // uint32类型变量VarA强行分配在内存地址0x12345678处
// 如果在此地址再定义一个变量,就是:union
#define StructVarB ((volatile struct MyStruct *)0x12345678)
volatile:指示编译器此变量的值不固定,每次必须重读,不能采用先前读过的值(编译优化的结果)
变通方法:
将数组放到一个 struct 里,也可以将相关的连续分配内存的变量按顺充打包在一起
typedef struct
{
uint16 arrA[64];
} NewDataType;
#define VarA (*(volatile NewDataType *)0x12345678)
唯一的缺点就是,数组的访问只能这样: VarA.arrA[x]
如果你还想象常规那样使用,再:
#define arrB[a] VarA.arrA[(a)]
二、 通用方法2:指针法
为了将数组定义到一个固定的地址,可采用指针定义,数组的管理就有能再使用下标了,只能采用指针管理;