Во встроенной системе, использующей BSP linux 3.2 на sitara AM3359, при запуске приложения я хочу определить, что вызвало последнюю перезагрузку, и сохранить этот статус в одном из двух счетчиков: сброс сторожевого таймера и сброс при включении питания.
Обычно в MCU я тестирую сторожевой таймер, резервируя место в оперативной памяти и записывая специальный ключ при первой загрузке и сбрасывая его с помощью сторожевого таймера. Если его нет при перезагрузке, питание включается, если он есть, это сброс сторожевого таймера.
Мой первый вопрос: как сохранить ключевые переменные в ОЗУ, чтобы они выдержали перезагрузку или сброс сторожевого таймера?
Кажется, что-то очищает оперативную память при загрузке ... могу ли я отключить это?
Там обычно реестр с этой информацией. На AM335x есть регистр PRM_RSTST с битом (WDT1_RST), я использую ioctl() с WDIOC_GETBOOTSTATUS, чтобы проверить, вызвана ли последняя загрузка сторожевым таймером или сбросом питания. Этот звонок не возвращает мне что-то, что я могу понять. Может кто-нибудь объяснить это? Как получить этот регистр...
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, write driver, sys и т. д.)?