2010-08-11 43 views
1

我需要为我的设备在200mhz MIPS cpu上运行embedde linux实现以下功能: 1)如果重置按钮被按下并保持少于一秒 - 继续重新启动 2)if重置按钮被按下并保持至少3秒。 - 使用NVRAM中的默认值恢复系统的配置,然后重新启动。轮询硬件按钮的状态

我正在考虑的方法有两种: 1)通过GPIO不断民调正确的时序按钮状态的IOCTL (可能太大开销,大量的上下文切换) 2)简单的字符设备驱动程序轮询守护进程?按钮,测量计时和报告状态,例如,通过/ proc到守护进程或shell脚本可以检查和执行所需操作的用户空间。

而对于这两种情况下,我不知道如何来衡量时间:( 你会怎么建议/建议?

回答

0

如果你想在软件中做到这一点,你需要把它放在内核(中断)代码中,而不是在shell脚本或守护进程中。更好的方法是将其放入硬件中。

根据我的经验,重置设备的可能原因将是坏的用户代码,它已经锁定或刷新处理器。如果问题是由于RF能量或此类性质导致的内存损坏,则可能需要硬件或外部(强化)处理器来重新刷新设备并解决问题。

在坏用户代码的情况下,处理器中断和内核代码应该继续运行,而用户代码可能会完全停滞。如果您可以通过中断来查询引脚,则您有更好的机会获得您期望的重置。此外,这使您可以执行事件驱动的编程,而不是不断地查询引脚。

另一种方法(不是你列出的规范,但实现相同目标的流行方法)将是让启动例程检查GPIO线,并且当你想重新初始化设备。在我见过的大多数嵌入式Linux设备上,“Reset”按钮连接到单片机的专用复位引脚,而不连接到GPIO引脚。除非你想开始切割痕迹,否则你可能不得不采用这条路线。

2

你必须执行这些硬件。的宗旨,在“从NVRAM还原为默认值”是以恢复所谓的“bricked”设备

例如,如果NVRAM seting被修改(宇宙射线?)以致设备无法启动会怎么样?在这种情况下,您建议的按钮轮询守护程序将永远不会执行

对于持续一秒的重启,使用RC(电阻+电容)电路“debounc e“按钮按下。选择适合1秒延迟的RC时间常数。使用一个比较器观察RC电压来发信号给MIPS cpu上的RESET引脚。

对于三秒钟的印刷功能(恢复NVRAM默认值),您可能必须做更复杂的事情。

一种可能性是将一个微小的PIC单片机放入复位电路,但只能使用带有熔丝(不可擦除)ROM而不是NVRAM的微控制器。

更简单的可能性是在同一条电路和总线上包含与NVRAM相同的默认ROM。 J/K触发器锁存器可以成为复位电路的一部分。你还需要一个三秒调谐的RC电路和比较器。在小于三秒钟的压力下,触发器应该锁存一个0输出,并且在三秒钟的按键上,第二个RC电路应该在3秒后触发比较器,并向J/K锁存器提供一个1,这将会切换其输出。

触发器输出Q将存储单个位,告诉您的电路这个复位周期是否在三秒钟推后。如果是这样,那么输出Q正在驱动芯片选择到NVRAM和Q*正在驱动芯片选择到ROM。 (我假设芯片选择在NVRAM和ROM芯片上都是负逻辑)。

然后,当CPU启动时,取决于芯片选择线,它将从NVRAM或ROM中读取设置。

您的启动代码可以检测到它是用ROM芯片选择启动的,并且可以稍后用GPIO线重置J/K触发器。然后,CPU将能够将良好的值写回到NVRAM中。希望能够解开设备。

您想使用不可擦除或可重复使用的ROM。这种ROM最能抵抗静电,电源故障和辐射。例如,辐射比我们通常意识到的要多得多,宇宙射线通量的数量乘以飞机上的设备。

1

我不熟悉MIPS处理器和您可以使用的引脚的GPIO /中断功能,但可能的方法如下。

  1. 将输入引脚配置为中断输入。
  2. 当中断触发禁止中断并启动一个短100ms ish计时器
  3. 当计时器触发检查按钮仍然按下(去抖动)。如果不是,则重新启用GPIO中断并重新启动,否则将该定时器设置为在3秒超时后重新触发。
  4. 当计时器触发此时,如果没有按下按钮,然后重新启动,否则重置系统配置并重新启动。

如果引脚无法提供中断,那么步骤1将是轮询任务以查看输入。

按下重置按钮和正在运行的完全重置过程之间的时间始终为3秒。在复位的情况下,这可能并不重要,特别是如果作为步骤3的一部分,使用户明白复位序列已经开始 - 例如使显示空白。