4

我以前见过嵌入式板有一个像心跳一样闪烁的 LED,表明板仍在执行代码。我想在我正在研究的嵌入式 Linux 板上做类似的事情。鉴于这是一段相当琐碎的代码,在我看来,似乎有人已经为 Linux 编写了一个守护进程来执行此操作,但我无法找到任何证据。

请注意,OS X Server 的 heartbeatd 和 High-Availability Linux heartbeat 守护进程并不是我想要的——它们都通过 IP 网络或类似的方式协调系统可用性。

假设我正在寻找的东西不存在,我也对如何编写一个在最小化资源使用的同时切换 pin 的守护程序感兴趣。cron 以什么更新速率成为一个愚蠢的想法?

(如果出于某种原因这似乎相关,我也不想听到关于睡眠 MacBook Pro 上 LED 的滔滔不绝。)

谢谢。

4

2 回答 2

5

LED 心跳是一个内置的内核函数。假设您有 LED 的设备驱动程序,打开心跳是这样完成的:

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

查看触发器列表(MMC 活动、心跳等)

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

参见http://www.avrfreaks.net/wiki/index.php/Documentation:Linux/LEDsdrivers/leds/ledtrig-heartbeat.c _

心跳的有趣之处在于模式是动态的。基本模式是 thump-thump-pause,就像人类的心跳一样。但是心跳的速率是由平均负载控制的!轻负荷以每分钟约 50 次的速度跳动。较重的负载会导致更快的跳动,直到达到大约 180 bpm。

于 2010-12-10T23:23:31.500 回答
0

我不会使用cron。它只是不是正确的工具。一个非常简单的解决方案是从您的 inittab 中运行一个 shell 脚本。

例子:

#!/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 脚本。它高度依赖于特定板如何从用户空间切换 LED(设备驱动程序文件、sysfs 条目......)。

如果您需要更高效的东西,您可以在 C 中重做 while 的事情,但这可能不值得付出努力。

要考虑的一件事是您想用脉冲 LED 发出信号。使用上面概述的方法,我们只能显示板仍然处于活动状态(内核正在运行,执行 blink.sh 的进程已安排好,而 blink.sh 正在做它应该做的事情)。对于某些用例,这可能没问题,但更多时候您实际上想要表示在嵌入式板上运行的应用程序仍然可以(不挂起,没有崩溃,...)。要实现此类功能,您需要将切换 LED 的代码集成到应用程序的主循环中。

于 2010-11-06T14:14:38.797 回答