【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
目前为止的内容,大部分都是和驱动相关的。就算有部分上层代码,也只是为了测试驱动是否ok而编写的。事实上,作为嵌入式设备,它本身其实就是为了实现某个专有功能而设计的。而这些上层应用中,有很大一部分,我们是希望做成开机启动、长期运行的。
当然,所有这些开机启动的程序最好有一个脚本管理起来,比如我们之前说的auto.sh。今天,我们就来看看,通常这个开机脚本里面一般都有哪些内容,大家来一起分析下。
1、示例脚本
#echo "begin to run script"
#run server
/usr/sbin/vsftpd &
/home/ftp/busybox telnetd -l /bin/sh &
#mount sd
mount /dev/mmcblk0p1 /mnt
# run lcd backlight
echo 34 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio34/direction
echo 1 > /sys/class/gpio/gpio34/value
#sleep for a while
sleep 1
# add some variable definition
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
#run demo programe
/bin/ts_test &
#end of script
#echo "finish script executing"
这个脚本虽然内容不多,但是很具有代表性,实际开发中遇到的情形,在脚本中都有体现。下面来一起看下。
2、脚本分析
首先第一行和最后一行都是一个echo语句,虽然我们暂时已经注释掉了,但是还是很有用的,特别是分析调试的时候。它的作用主要有两个,第一,就是确认脚本有没有被执行;第二,确认脚本有没有执行结束。如果希望查找中间的某一段内容有没有被执行到,还可以添加新的echo语句。
run server这个部分,主要是启动相关的服务器程序。这里主要启动了两个server,一个是ftp,一个是telnet。实际生产当中,还有可能会开启一个http程序,这个根据自己的需求而定。
接着就是mount sd。这句脚本也是很典型的。实际产品中,有一部分软件或者称之为固件是烧入在spi norflash或者spi nandflash,而客户在使用的时候还需要插入自己的sd卡,这个时候就可以把sd卡mount到指定的目录上面,方便继续读取里面的文件和数据。
run lcd backlight。这几句作用是为了打开lcd的背光,配合后面的demo程序使用。在我们自己实际的产品中,很多时候,每完成一个步骤,就需要点亮一盏灯,或者更换灯的颜色,这都是很普遍的。等所有的初始化流程都结束了,就需要把所有的灯点亮,或者变换成某一种安全的颜色,比如绿色。
sleep,也就是等待。有些程序初始化话比较慢,特别是和其他设备沟通,或者自身有一部分机械装置的时候,这个sleep是少不了的。因为和电子、软件比起来,机械部分要慢得多。
export语句,这里主要是增加环境变量。有一些程序会需要设置一些额外的环境变量,比如LD_LIBRARY_PATH、PATH这样的,不然程序无法运行。所以用export添加必要的环境变量也是十分有必要的。
run demo program,此时就是添加产品需要启动的服务器程序了。需要长时间运行的程序,就在最后添加一个&,只运行一次的程序,就不需要添加这个&,稍微注意一下。如果需要运行的程序比较多,相互之间存在依赖关系,可以适当地添加sleep,不过这样比较影响系统启动地速度,有利有弊。这里的服务器程序或应用程序,和之前的ftp、telnet还是不同的,上面那部分一般都是通用的开源代码,而现在这部分就是和产品、业务相关的私有代码了。
最后一个echo之前已经说过了,就是告知当前脚本全部执行完毕,通常在串口调试的时候会比较注意。时间长了,这一行和开头的那一行基本就被注释掉了,看多了也觉得麻烦。
3、其他
实际启动的时候,为了加快运行,还会去掉uboot的等待时间,不过这部分因人而异。上面这部分脚本看着简单,其实东西还挺多的,属于小而全的那种。大家可以把它放在自己的产品中,就可以慢慢打造自己的嵌入式应用作品了。