嵌入式系统里的reboot命令的各种实现方式

来源:互联网 发布:沪深a股数据下载 编辑:程序博客网 时间:2024/05/16 05:29

   今天跟同事讨论一个跟Watchdog喂狗任务有关的问题,却引出另一个话题(过程比较零乱,暂时略过):在嵌入式系统里,reboot(这里指的reboot说的都是正常情况敲入命令,比如linux shell下输入reboot, vxworks shell里摁下ctrl+x,程序导致的reboot暂时不提)是否都是由watchdog来实现的?

  答案毫无疑问是否。可是要把各种实现方式梳理清楚并不是一件容易的事情。这里暂且把做过的几个项目随手总结了一下,抛砖引玉。欢迎朋友们补充。

1 Watchdog机制.这可能是最常见的一种方式了。(当然,也许有人会提到硬件狗和软件狗的区别,那个只是触发源是外部还是内部的问题,不是本文重点)总之呢就是在需要reboot时,将喂狗任务挂起或是delete或是强制让程序进入死循环,直到狗叫。另外有一个小细节,在很多采用这种方式的产品里,如果是因为程序问题(死循环等)导致的狗叫,也许需要程序死循环上十几秒甚至更长时间(这个时间就是watchdog等待喂狗的时间长度,linux的默认时间长达一分钟),但是,如果在命令行里输入reboot,用户必然是希望看见系统在最短的时间内重起,那这时怎么办呢?非常简单,在执行reboot命令时,将狗等待时间修改一下就可以了。一般来说,CPU都必然会有对应的寄存器可以修改这一配置。但是, linux并不是用的这个方法。

2 配置CPU寄存器。这个就必须看CPU是否支持这一功能了(本来想当然的以为所有CPU都会有,后来仔细看了datasheet发现arm7,arm9等都木有)。另比如freescale最新出的armv7内核的CPU(我开始也有些零乱,这家伙怎么投靠arm了)就可以支持。直接改变寄存器的值,就可以使CPU复位。但同时要指出的是,这种方式内存的内容是不会被清掉。 这应该算是最容易理解的一种方式。

3 程序调用。这是一个非常非常笼统的说法。做过linux或是vxworks的朋友应该都知道这两个操作系统都提供了接口函数(system("reboot") 以及 reboot( ) ). 可是具体到这两个函数是如何工作的呢? 关于这个方面的细节,能查到的现成资料比较有限,可能大家都被操作系统养“懒”了,习惯性调用一下就OK了,其实我也一样,呵。我会在随后再开一篇文章详细的分享一下分析的结果。


    本来觉得是理所当然的东西,细细想来竟然也有这么多道理。至于其中细节更是不胜枚举,有空了分析清楚再更新上来。

      

原创粉丝点击