在sitara AM3359上使用BSP linux 3.2的嵌入式系统中,在应用程序启动时,我想检测导致上次重启的原因并将此状态保存在两个计数器之一:看门狗复位和上电复位。 / p>
通常在MCU中,我通过在ram中保留spot并在第一次启动时写入特殊键并使用看门狗复位来测试看门狗。如果不是那里重新启动它的电源打开,如果它在那里它是一个看门狗复位。
我的第一个问题是,如何将关键变量保存在RAM上,以便在重启或看门狗复位后继续存在?
启动时ram看起来很干净......我可以禁用吗?
通常会有一个包含该信息的注册表。在AM335x上有PRM_RSTST寄存器的位(WDT1_RST),我正在使用带有WDIOC_GETBOOTSTATUS的ioctl()来检查上次启动是由看门狗引起还是上电复位。这个电话不会给我一些我能理解的东西。有人可以解释一下吗?我怎样才能获得这个注册......
Power ON:
test1: 1076092848
test2: 1076113328
test3: 1075589040
test4: 1076203440
watchdog:
test5: 1076481968
test6: 1075732400
test7: 1075965872
代码使用:
/* Check if last boot is caused by watchdog */
if (ioctl(fd, WDIOC_GETBOOTSTATUS, &bootstatus) == 0) {
fprintf(stdout, "Last boot is caused by : %s, bootstatus= %d\n",
(bootstatus != 0) ? "Watchdog" : "Power-On-Reset", bootstatus);
} else {
fprintf(stderr, "Error: Cannot read watchdog status\n");
exit(EXIT_FAILURE);
}
有没有其他方法可以获取此信息(mmap,写入驱动程序,sys等)?
答案 0 :(得分:1)
我建议您使用引导加载程序查看处理器寄存器值(对于u-boot,我相信命令是 reginfo )。您存储看门狗密钥的内存的方式相同(但另一个命令)。使用引导加载程序调试后,您可以考虑将它们传递给内核。
答案 1 :(得分:1)
我首先使用终端命令devmem 0x44E00F08(busybox)来查看读取物理内存是否有效然后我使用mmap()读取PRM_RSTST寄存器并知道上次复位是否为看门狗复位。