Обнаружение последней перезагрузки на PhyCORE-AM335x-PD13.1.2 Linux 3.2

Во встроенной системе, использующей BSP linux 3.2 на sitara AM3359, при запуске приложения я хочу определить, что вызвало последнюю перезагрузку, и сохранить этот статус в одном из двух счетчиков: сброс сторожевого таймера и сброс при включении питания.

  1. Обычно в MCU я тестирую сторожевой таймер, резервируя место в оперативной памяти и записывая специальный ключ при первой загрузке и сбрасывая его с помощью сторожевого таймера. Если его нет при перезагрузке, питание включается, если он есть, это сброс сторожевого таймера.

    Мой первый вопрос: как сохранить ключевые переменные в ОЗУ, чтобы они выдержали перезагрузку или сброс сторожевого таймера?

    Кажется, что-то очищает оперативную память при загрузке ... могу ли я отключить это?

  2. Там обычно реестр с этой информацией. На 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);
    }
    
  3. Есть ли другой способ получить эту информацию (mmap, write driver, sys и т. д.)?


person Phil    schedule 21.11.2014    source источник


Ответы (2)


Я бы предложил вам использовать ваш загрузчик, чтобы увидеть значения регистров процессора (для u-boot я полагаю, что команда reginfo). То же самое (но другая команда) для памяти, в которой хранятся ключи сторожевого таймера. После отладки вашего загрузчика вы можете подумать о передаче их ядру.

person tuppi-ovh    schedule 24.11.2014
comment
Спасибо за Ваш ответ. Возможно, мне придется сделать это, чтобы проверить сторожевой таймер при загрузке. - person Phil; 25.11.2014

Я начинаю с команды терминала devmem 0x44E00F08 (busybox), чтобы проверить, будет ли работать чтение физической памяти, затем я использую mmap(), чтобы прочитать регистр PRM_RSTST и узнать, был ли последний сброс сбросом сторожевого таймера.

person Phil    schedule 25.11.2014