[从0到1搭嵌入式工程]重置的实现

     一般会有一个重置的按钮,用户在长按之后,设备执行重置操作。

    在某一个线程中,每隔一秒去检测硬件上重置按键是否被按下(由驱动提供接口),如果检测到两次或者以上次数被按下,就可以认为是长按,去执行重置的操作。注意判断时间也不能过长,如果硬件上也有重置,比如硬件自身在长按6S之后,硬件自身就会重置,也就是硬件的这个按键的信号也会被重置,如果在软件上我们判断7S才认为是长按,那么就会出现软件判断不到重置信号,因为还没到时间呢,硬件上已经重启了。对于硬件上有重置的情况,比如6S, 软件上2S认为有重置,那么重置操作的执行时间,一定要在4S之内完成,也就是硬件自身重置之前。

    重置操作可以有两种方式, 一种是在收到重置信号之后,立即做,然后重启;一种是收到重置信号之后,赋值一个标志位,写在flash中,在重启启动之后,根据这个标志位,知道是重置的重启,接着做重置的操作。 第一种适合重置操作耗时比较短或者重启时间软件可以控制的情况, 第二种适合重置操作耗时较长,要放在下一次启动的时候做。

    先说一种实现,接到确认重置命令以后, 把当前配置文件的fd flush一下,然后关掉, 删用户配置文件、删wifi配置文件、亮指示灯灯、播提示音, 创建一个短线程去停掉一些比如录像、卸载SD卡等操作, 等待短线程执行完成后, 执行reboot(RB_AUTOBOOT),重启设备。

    接下来就用到上一篇中的配置信息了, 因为重启之前,已经把用户配置给删了,在重新启动的时候,加载默认配置,里面server has reset标记位默认是0, 表示还没有把reset状态同步给后台,当设备重新连上网络后, 会把reset状态告诉后台,然后把has reset置成1, 保存在配置文件中, 这样,其他的正常重启,在加载配置时,得到是已经配置和后台reset过了,就不需要再给后台发送reset请求了。

    另外一种,确认重置以后,先把默认数据写入配置文件,重启以后,告诉系统,我是start with reset。播放提示音,然后执行 ifconfig wlan0 down,  rmmod xxx 和 reboot -f, 把wifi停了,卸载必要的模块,然后重启。

    启动时根据 start with reset配置信息,做需要第一次启动需要做的事情,等连接上网络以后, 和后台reset。

猜你喜欢

转载自blog.csdn.net/bingyu880101/article/details/80084203