嵌入式C内存地址两数相加程序编写及代码正确性、内存访问咨询
嵌入式C指定内存地址访问与代码正确性分析
代码正确性判断
你给出的代码存在语法错误:最后一行int sum=(*p)+(*q)末尾缺少分号,这会直接导致编译失败。
抛开语法问题,从逻辑层面来看:
- 如果0x30610000和0x30610004是你的嵌入式系统中合法且可访问的内存地址(比如预留RAM、外设寄存器地址),且地址对齐符合int类型的要求(两个地址都是4字节对齐,多数嵌入式系统中int占4字节,满足对齐规则),那么修正语法错误后的代码逻辑是可行的,能实现两个指定地址内容的相加。
- 必须注意:如果这两个地址属于系统禁止访问的区域,执行代码时会触发硬件异常,直接导致程序崩溃。
嵌入式C中访问内存地址内容的常用方法
指针强制转换法(最常用)
声明对应数据类型的指针,将目标内存地址强制转换为该类型指针,通过解引用操作读写内容:// 读取地址0x30610000的内容 int read_val = *(int*)0x30610000; // 往地址0x30610000写入数据 *(int*)0x30610000 = 0x12345678;注意匹配数据类型:访问8位数据用
char*,16位用short*,避免因类型不匹配导致的访问错误。宏定义简化访问
对于频繁访问的固定地址,可以用宏封装,同时建议加上volatile关键字(尤其是访问外设寄存器时),防止编译器优化掉读写操作:#define REG_ADDR (*(volatile int*)0x30610000) // 直接读写 int val = REG_ADDR; REG_ADDR = 0x123;数组下标访问法
将目标地址当作数组的起始地址,通过下标访问对应偏移的内存内容,本质和指针法一致:// 把0x30610000作为int数组的起始地址 int* mem_arr = (int*)0x30610000; // 下标0对应0x30610000,下标1对应0x30610004 int sum = mem_arr[0] + mem_arr[1];
内容的提问来源于stack exchange,提问作者NeerajKDLR
相关产品推荐
相关产品推荐

