#include <stdio.h> #include <malloc.h> #include <memory.h> typedef struct gpio { int pr; int pl; }* GPIO_MemMapPtr; //注释为了避免内存出错 //GPIO_MemMapPtr GPIO_Ptr; //定义一个结构体指针变量,GCC会分配一个内存的。 #define PTA_BASE_PTR ((GPIO_MemMapPtr)0x0028ff10) #define PTD_BASE_PTR ((struct gpio*)0x0028ff50) #define GPIO_PR_REG(base) ((base)->pr) #define GPIO_PL_REG(base) ((base)->pl) typedef struct { int io_da; int io_db; }GPIO_TypeDef; #define GPIOB ((GPIO_TypeDef*)(0x0028ff30)) int main(int argc, char* argv[]) { int i = 0; //0x0028ff10开始的8各字节内存的内容清零 memset((int *)(0x0028ff10), 0, 8); GPIO_PR_REG(PTA_BASE_PTR) = 0x02; GPIO_PL_REG(PTA_BASE_PTR) = 0x02; GPIO_PR_REG(PTD_BASE_PTR) = 0x05; GPIO_PL_REG(PTD_BASE_PTR) = 0x06; //注释为了避免内存出错 //GPIO_Ptr->pl = 0x03; //GPIO_Ptr->pr = 0x04; //下面的语句是错误的,因为GPIO_MemMapPtr GPIO_Ptr;已经被GCC分配了一个内存, //因此该宏定义#define PTC_BASE_PTR ((GPIO_Ptr)0x0028ff20)是错误的,不成立的。 //GPIO_PR_REG(PTC_BASE_PTR) = 0x03; //GPIO_PL_REG(PTC_BASE_PTR) = 0x04; GPIOB->io_da = 0x01; GPIOB->io_db = 0x01; printf("data in ram 0x0028ff10 = %d ", (int)(*(int *)(0x0028ff10))); printf("data in ram 0x0028ff30 = %d ", (int)(*(int *)(0x0028ff30))); printf("data in ram 0x0028ff14 = %d ", (int)(*(int *)(0x0028ff14))); printf("data in ram 0x0028ff34 = %d ", (int)(*(int *)(0x0028ff34))); printf("data in ram 0x0028ff50 = %d ", (int)(*(int *)(0x0028ff50))); printf("data in ram 0x0028ff54 = %d ", (int)(*(int *)(0x0028ff54))); return 0; }
运行结果:
data in ram 0x0028ff10 = 2
data in ram 0x0028ff30 = 1
data in ram 0x0028ff14 = 2
data in ram 0x0028ff34 = 1
data in ram 0x0028ff50 = 5
data in ram 0x0028ff54 = 6
gdb的内存查看为:
预编译后gcc -E typedef_st.c -o typedef_st.i:
typedef struct gpio { int pr; int pl; }* GPIO_MemMapPtr; GPIO_MemMapPtr GPIO_Ptr; # 20 "typedef_st.c" typedef struct { int io_da; int io_db; }GPIO_TypeDef; int main(int argc, char* argv[]) { int i = 0; memset((int *)(0x0028ff10), 0, 8); ((((GPIO_MemMapPtr)0x0028ff10))->pr) = 0x02; ((((GPIO_MemMapPtr)0x0028ff10))->pl) = 0x02; ((((struct gpio*)0x0028ff20))->pr) = 0x05; ((((struct gpio*)0x0028ff20))->pl) = 0x06; GPIO_Ptr->pl = 0x03; GPIO_Ptr->pr = 0x04; ((GPIO_TypeDef*)(0x0028ff30))->io_da = 0x01; ((GPIO_TypeDef*)(0x0028ff30))->io_db = 0x01; printf("data in ram 0x0028ff10 = %d ", (int)(*(int *)(0x0028ff10))); printf("data in ram 0x0028ff30 = %d ", (int)(*(int *)(0x0028ff30))); printf("data in ram 0x0028ff14 = %d ", (int)(*(int *)(0x0028ff14))); printf("data in ram 0x0028ff34 = %d ", (int)(*(int *)(0x0028ff34))); return 0; }