c - 在 SRAM 中为 SRAM 衰减实验保留空间 (C ; AVR atmega644p ; Atmel Studio 7)
问题描述
我希望在 atmega644p 上进行一些实验,以评估电源周期之间 SRAM 的衰减量。我的方法是将SRAM中的字节数设置为0xFF,然后当MCU重新上电时,计算这些字节中剩余1的数量。
为此,我需要从 SRAM 中的已知内存地址读取和写入 1 的数组。到目前为止,我的代码使用设置为 0x1000 的指针将值写入特定地址,然后在加电时开始从该地址读取数组。但是,我需要一种方法来保证这部分 SRAM 内存(例如,0x100 + 64 字节)在读取之前不会分配给其他变量/被覆盖。
我在网上查看了分配内存段的可能性——我不知道在这种情况下这是否是一个好的解决方案,甚至不太确定如何去做。任何人都可以提出一种巧妙的方法来解决这个问题吗?
请提出任何问题以进行澄清。
谢谢你的帮助。
解决方案
如果您使用的是 AVR/GNU,那么当 C 应用程序启动时,它会清除整个内存并根据需要初始化全局变量。
为避免这种情况,您可以将链接器配置为使用选项排除所有启动文件-nostartfiles -nodefaultlibs -nostdlib
如果您使用的是 Atmel Studio,您可以像这样配置它:
之后,您可以将其标记main
为初始化代码:
int main(void) __attribute__((naked, section(".init9")));
现在您将拥有不执行任何初始化的“裸”代码。这意味着您至少需要初始化堆栈指针并清除寄存器r1
(avr-gcc 假定它包含零):
int main(void) {
asm volatile (
"clr r1\n" // load zero into r1
"cli" // clear I flag
);
SPL = (uint8_t)RAMEND;
SPH = (uint8_t)(RAMEND >> 8);
... // here goes your code
for(;;); // do not leave main()!
}
在此之后,您将未初始化所有全局变量。例如,您可以声明一个全局数组并在启动时检查其内容。
推荐阅读
- tfs - TFS WIQL Query with like condition
- django - django-allauth google 回调 url 在生产中不起作用
- python-3.x - 如何对这个数据列表进行聚类?
- google-apps-script - 更改特定单元格时自动刷新过滤器
- javascript - 在Javascript中将json字符串转换为对象
- r - 在 r 中使用 kNN 估算缺失值的问题
- r - 如何连接多个 Boxplot?
- php - PHP 函数 strpos() 和 stristr()
- android - 在 CardView 中设置 TextView 而不调整视图大小
- json - 如何使用 JSON 数据对象在 Postman 中上传 Mltipart 文件