Встроенный в Linux демон мигания светодиодов: существует ли он?

Раньше я видел встроенные платы со светодиодом, который мигает, как сердцебиение, чтобы показать, что плата все еще выполняет код. Я хотел бы сделать что-то подобное на встроенной плате Linux, над которой я работаю. Учитывая, что это довольно тривиальный фрагмент кода, мне кажется вероятным, что кто-то уже написал демон для Linux, который делает это, но я не смог найти никаких доказательств.

Обратите внимание, что сердцебиение OS X Server и демон сердцебиения — это не то, что я ищу для... они оба координируют доступность системы по IP-сетям или что-то в этом роде.

Предполагая, что то, что я ищу, не существует, меня также интересует совет о том, как написать демон, который переключает контакт, сводя к минимуму использование ресурсов. При какой частоте обновления cron становится глупой идеей?

(Я также не хотел бы слышать восторженные отзывы о светодиоде на спящем MacBook Pro, если это по какой-то причине кажется актуальным.)

Спасибо.


person pingswept    schedule 16.10.2010    source источник


Ответы (2)


Пульс светодиода — это встроенная функция ядра. Предполагая, что у вас есть драйвер устройства для вашего светодиода, включение сердцебиения выполняется следующим образом:

$ echo "heartbeat" > /sys/class/leds/MyLed/trigger

Чтобы увидеть список триггеров (активность MMC, сердцебиение и т. д.)

$ cat /sys/class/leds/MyLed/trigger

См. drivers/leds/ledtrig-heartbeat.c и http://www.avrfreaks.net/wiki/index.php/Documentation:Linux/LEDs

Что интересно в отношении сердцебиения, так это то, что этот паттерн динамичен. Базовый паттерн — тум-тук-пауза, точно так же, как человеческое сердцебиение. Но скорость сердцебиения контролируется средней нагрузкой! Легкие нагрузки бьют со скоростью около 50 ударов в минуту. Более тяжелые нагрузки вызывают более быстрое биение, пока оно не достигнет максимума около 180 ударов в минуту.

person Robᵩ    schedule 10.12.2010
comment
Спасибо, сэр! Это именно то, на что я надеялся. Немного смущает, что мне не удалось найти это через Google, но это перерывы. - person pingswept; 11.12.2010

Я бы не стал использовать cron. Это просто не тот инструмент. Очень простое решение — просто запустить сценарий оболочки из вашего inittab.

Пример:

#!/bin/sh

while [ true ];
do
    logger "blink!" # to be replaced
    sleep 1
done

Сохраните это в /bin/blink.sh, добавьте следующую строку в ваш inittab и пусть init перечитает вкладку, чтобы запустить init q.

bl:2345:respawn:/bin/blink.sh

Конечно, вы должны настроить скрипт blink.sh под свою среду. От конкретной платы сильно зависит, как можно переключать светодиод из пользовательского пространства (файл драйвера устройства, запись sysfs, ....).

Если вам нужно что-то более эффективное, вы можете переделать while в C, но это может не стоить усилий.

Одна вещь, о которой следует подумать, это то, что вы хотите сигнализировать с помощью пульсирующего светодиода. С описанным выше подходом мы можем только показать, что плата все еще жива (ядро работает, процесс, выполняющий blink.sh, запланирован, и blink.sh делает то, что должен делать). Для некоторых случаев использования это может быть хорошо, но чаще вы действительно хотите сигнализировать о том, что приложение, работающее на встроенной плате, все еще в порядке (не зависает, не падает и т. д.). Чтобы реализовать такую ​​функциональность, вам необходимо интегрировать код, который переключает светодиод, в основной цикл вашего приложения.

person Frank Meerkötter    schedule 06.11.2010