如何在AVR Studio 7中为ATmega16定义共享RAM区域的变量?
解决ATmega16互斥模块共享RAM数组的实用方案
方法1:用C原生union联合类型
这是最省心的方式,完全靠C语言本身特性实现,不需要折腾编译器或链接脚本。
定义一个联合类型,把两个模块需要的数组放进同一个联合里,它们会自动共享同一块内存空间:
// 定义联合,两个数组共用500字节RAM union SharedRAM { uint8_t module1_buf[500]; uint8_t module2_buf[500]; }; // 全局声明联合变量,两个模块都能访问 union SharedRAM shared_buf;
用的时候,模块1操作shared_buf.module1_buf,模块2操作shared_buf.module2_buf就行——反正两个模块互斥执行,不会出现内存冲突。
方法2:GCC自定义段+修改链接脚本
如果之前试自定义段没成,大概率是没给链接脚本加配置。
- 给两个数组指定同一个自定义段:
// 模块1的数组,指定到.shared_ram段 uint8_t module1_buf[500] __attribute__((section(".shared_ram"))); // 模块2的数组,同样指定到.shared_ram段 uint8_t module2_buf[500] __attribute__((section(".shared_ram")));
- 修改链接脚本:
找到ATmega16对应架构(avr5)的默认链接脚本(一般在avr-gcc安装目录的avr/lib/ldscripts/avr5.x),在RAM段定义区域添加如下内容,告诉链接器不对这个段做重叠检查:
.shared_ram : { *(.shared_ram) } NOLOAD AT > RAM
最后在AVR Studio7的项目链接器设置里,添加-T 你修改后的链接脚本路径参数,指定使用这个自定义脚本。
方法3:GCC别名属性__attribute__((alias))
直接让其中一个变量成为另一个的别名,二者指向同一块RAM,零额外配置:
// 先定义第一个数组 uint8_t module1_buf[500]; // 让module2_buf成为module1_buf的别名,完全共享内存 uint8_t module2_buf[500] __attribute__((alias("module1_buf")));
注意:别名变量不能加初始化值,否则编译器会报错。
内容的提问来源于stack exchange,提问作者Enrique Perelis
相关产品推荐
相关产品推荐

