2014-11-21 2 views
1

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

  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, написать драйвер, SYS, и т.д.)?

ответ

1

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

1

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

+0

Спасибо за ваш ответ. Возможно, мне придется это сделать, чтобы проверить сторожевого таймера при загрузке. – Phil