2010-10-16 4 views
2

J'ai déjà vu des cartes embarquées avec une LED qui clignote comme un battement de cœur pour montrer que la carte est encore en train d'exécuter du code. J'aimerais faire quelque chose de similaire sur une carte Linux embarquée sur laquelle je travaille. Étant donné que c'est un morceau de code assez trivial, il me semble probable que quelqu'un a déjà écrit un démon pour Linux qui le fait, mais je n'ai pas réussi à trouver de preuves. Notez que le heartbeatd d'OS X Server et la haute disponibilité Linux heartbeat daemon ne sont pas ce que je cherche - ils coordonnent la disponibilité du système sur les réseaux IP, ou quelque chose comme ça.Démon Linux à DEL embarqué: existe-t-il?

En supposant que ce que je cherche n'existe pas, je suis également intéressé par des conseils sur la façon d'écrire un démon qui bascule une broche tout en minimisant l'utilisation des ressources. À quel taux de mise à jour cron devient-il une idée stupide?

(Je voudrais aussi plutôt pas entendu jaillissant au sujet de la LED sur le sommeil MacBook Pro, si cela semble pertinent pour une raison quelconque.)

Merci.

Répondre

3

La pulsation LED est une fonction intégrée du noyau. En supposant que vous avez un pilote de périphérique pour votre LED, se tournant sur le rythme cardiaque se fait ainsi:

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

Pour voir la liste des déclencheurs (activité MMC, rythme cardiaque, etc.)

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

Voir drivers/leds/ledtrig-heartbeat.c et La chose intéressante à propos de la pulsation est que le motif est dynamique. Le motif de base est la coupure de force, comme un battement de cœur humain. Mais le taux du rythme cardiaque est contrôlé par la moyenne de charge! Les charges légères battent à environ 50 battements par minute. Des charges plus lourdes provoquent des battements plus rapides jusqu'à atteindre un maximum de 180 bpm.

+0

Merci, monsieur! C'est exactement ce que j'espérais exister. C'est assez embarrassant que je n'ai pas réussi à le trouver via Google, mais ce sont les pauses. – pingswept

0

Je n'utiliserais pas le cron. Ce n'est tout simplement pas le bon outil. Une solution très simple consiste simplement à exécuter un script shell à partir de votre inittab.

Exemple:

#!/bin/sh 

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

Enregistrer ce à /bin/blink.sh, ajoutez la ligne suivante à votre inittab et ont relisez l'onglet initialisation en cours d'exécution q init.

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

Bien sûr, vous devez ajuster le script blink.sh dans votre environnement. Il dépend fortement de la carte particulière comment une LED peut être basculée de l'espace utilisateur (fichier de pilote de périphérique, entrée Sysfs, ....).

Si vous avez besoin de quelque chose de plus efficace, vous pouvez refaire le tout en C mais cela ne vaudrait pas la peine.

Une chose à penser est ce que vous voulez signaler avec une LED à impulsions. Avec l'approche décrite ci-dessus, nous pouvons seulement montrer que la carte est toujours en vie (le noyau est en cours d'exécution, le processus exécutant blink.sh est planifié et blink.sh fait ce qu'il est censé faire). Pour certains cas d'utilisation, cela peut être bien, mais plus souvent vous voulez signaler que l'application s'exécutant sur une carte embarquée est toujours OK (ne se bloque pas, n'a pas planté, ...). Pour implémenter une telle fonctionnalité, vous devez intégrer le code qui fait basculer la LED dans la boucle principale de votre application.

Questions connexes