嵌入式Linux中让应用程序自动启动

2019-07-13 00:58发布

嵌入式Linux中让应用程序自动启动

  在很多嵌入式系统中,由于可用资源较少,常常在系统启动后就直接让应用程序自动启动,以减少用户操作和节省资源。如何让自己的应用程序自动启动呢?    在Linux系统中,配置应用程序自动启动的方法有以下三种:
1.通过/Linuxrc脚本直接启动
Linux内核一旦开始执行,它将通过驱动程序来初始化所有硬件设备,这个初始化过程可以在启动时的PC显示器上看到,每个驱动程序都打印一些相关信息。初始化完成后,通常调用的是init,通过loader调用init内的init=/app_program语句(通过loader向核心传入init=/program可以定制首先运行的程序)
比如在桌面Linux系统中,init进程会读取/etc/inittab文件,来决定执行级别和哪些脚本和命令。嵌入式应用开发中,可以根据实际情况决定是否使用标准的init执行方式,也许这个init是个静态程序,它能够完成我们的嵌入应用的特定任务,那完全不用考虑inittab了,在这里可以采用比较灵活的措施。
2.在/etc/init.d下添加启动脚本
一般情况下,大多数的Linux操作系统使用/etc/init.d/(或/etc/rc.d/init.d)下的脚本来配置应用程序的自动启动。
例如,在某些Linux系统中,corn程序通过/etc/init.d/corn脚本启动,Apache通过/etc/init.d/httpd启动,syslogd通过/etc/init.d/syslogd启动,而sshd则通过/etc/init.d/sshd脚本启动。
通常这些脚本通过来自特定rc.d目录的符号链接运行。为了配置从哪个rc.d目录运行脚本,Linux系统提供了许多不同的工具,同时也可以手工进行配置。Linux系统有一个包含所有实际启动脚本文件的目录。它可能是/etc/init.d,也可能是/etc/rc.d/rc.d。同时对应每个运行级别(runlevel)又有一个另外的目录,它们可能是/etc/rc2.d,也可能是/etc/rc.d/rc2.d。这些目录中的文件通常是指向实际脚本文件的符号链接。
3.直接在/etc/rc.d/rc.local脚本中添加命令
在Linux系统中,有一个类似Windows系统中autoexec.bat的文件,它就是/etc/rc.d/rc.local,系统开机后自动运行用户的应用程序或启动系统服务的命令保存在开发板根文件系统的这个文件中。因此可以编辑rc.local文件,将要执行的程序(命令)添加到该文件夹中。Linux系统在启动后还未登录前,将自动执行该程序(命令),达到开机自动运行用户的应用程序的目的。
下面具体说明:
首先解压ramdisk.image.gz文件,然后挂载到系统中。接着创建自己的应用程序文件夹hello,将所要自动运行的应用程序hello复制到该文件夹。
然后打开/usr/etc/rc.local文件,在最后一行加入:/Myapp/hello/hello
再按上面的顺序将ramdisk.image打包下载到目标板,启动运行,则可以看到用户编写的应用程序一启动就运行起来了。
本文参考《基于ARM9的嵌入式Linux开发技术》,李新峰等编著。     二、Linux系统的启动过程
    让我们先了解一下Linux系统启动的过程。当引导程序(如LILO)加载Linux内核映象启动时,它先进行内核的初始化工作,主要是检测整个硬件环境。内核初始化完成后,系统就启动init进程,它是系统的第一个用户级进程。Linux系统具有许多运行级别,它由文件/etc/inittab文件决定,各级别的功能如下:
      0:终止或停止系统的运行
      1:单用户模式
      2:多用户模式,但无网络功能
      3:多用户模式且有网络功能
      4:保留,用户可以定义自己的启动模式
      5:图形界面登陆模式
      6:重新启动系统
    init进程运行后,它会访问/etc/inittab文件,该文件确定系统运行于上面的哪个级别。由于嵌入式系统的特性,我们要让系统运行于级别1上,即单用户模式,这只要在/etc/inittab文件的id:3:initdefault行,将3改为0即可。同时每个级别还对应了一个启动各种服务的脚本目录,一般在/etc/rc.d/下面。
     接着init进程又分别启动/etc/rc.d/rc.sysinit和与等级n相对应的/etc/rc.d/rcn.d目录里的初始化进程,最后init会运行用户登陆程序,这时在终端上就会显示login:的登录信息,用户登录成功后会启动shell程序,shell启动后,它会读取并执行文件/etc/profile,/etc/bashrc,和用户主目录下的文件.bashrc,这些文件负责建立用户自己的环境。

三、设置特定服务及开机启动程序
      如前所述,添加指定服务,定制特定的启动程序,就从配置文件/etc/rc.d/rcn.d和/etc/profile入手。
      1、添加指定的服务:是指在系统启动时进行一些用户所需要的操作,如初始化用户应用程序或用户开发的新硬件等等。可以增加自己的脚本程序来完成这些工作,主要步骤如下:
     (1) 仿照系统目录/etc/rc.d/init.d里的任何一个脚本文件的格式自己编写一个启动服务脚本文件。
     (2) 将写好的脚本文件拷贝到/etc/rc.d/init.d目录下。因为/etc/rc.d/rcn.d只是/etc/rc.d/init.d的一个链接,故要将真实的文件先拷到后者的目录下。
     (3) 在相应的运行级别n的/etc/rc.d/rcn.d下建立该脚本文件的链接。如运行级别为2,则n=2,目录即为/etc/rc.d/rc2.d。假如该脚本名为initform,链接名定为my_initform,则键入如下命令即可:ln –s /etc/rc.d/init.d/initform   /etc/rc.d/rc2.d/my_initform。
     完成以上几步后,系统开机后就会自动执行脚本initform里的服务。
      2、运行特定用户应用程序:这里主要是指GUI应用程序,如果原系统启动后直接进入桌面系统,则要将桌面程序在相应脚本中屏蔽,然后修改/etc/profile脚本定制用户自己的程序。步骤如下:
      (1) 在startx脚本中将运行相应的桌面系统程序屏蔽。例如桌面系统程序名为qvwm(红旗嵌入式Linux的桌面系统),则修改内容如下:
      ……
      # xinit /usr/bin/qvwm
      #加个“#”表示将这行脚本屏蔽掉
      (2) 修改/etc/profile,启动用户应用程序。如用户应用程序名为start_initform,且在目录/root/ 下,则在它的末尾加上如下几行内容:
      ……
      export LC_ALL=zh_CN.GB2312
      #设置中文化环境
      cd /root/
      #切换到应用程序当前目录
      xinit ./start_initform
      #运行指定的用户应用程序  
      修改完成后,重新启动系统,则当系统初始化完后,会执行用户指定的服务,且最后运行用户应用程序,达到嵌入式系统的要求。   如何让自己的linux程序开机自启动? 很多开发者都想知道,怎么样在系统启动的时候就直接启动自己编写的应用程序,以2410F开发板为例,分享开发经验:
假设你编译出的应用程序名字是“write”,这个就是你想开机后自动运行的程序。想要实现的系统的启动顺序为:①vivi,②kernel,③root文件系统,④你的程序“write”,只需要重新做文件系统即可。
需对现有文件系统进行两处修改:
  1)将你的程序“write ”拷贝到系统根目录下,更改文件属性(输入命令:chmod 777 write)
    2)修改文件 rootfs/usr/etc 下的 rc.local 文件(该文件里指定了文件系统启动完后,要启动的一些程序)
    在其倒数第三行添加 /write 如下
     /write
      cd /Qtopia/bin
     ./qpe -qws
   3) 重新制作文件系统./mkcramfs rootfs 2410f.cramfs
   4) 重新烧写文件系统2410f.cramfs
当新的系统启动了以后,就会看到我们的程序“write”启动了!  开机后自动运行用户的应用程序或启动系统服务的命令保存在开发板根文件系统的/usr/etc/rc.local文件中。有的开发板开机后自动运行图形界面程序,需要按住ctrl+c让开发板进入到linux的SHELL提示符界面。其实可通过注释掉rc.local文件中调用图形界面的命令,增加运行用户应用程序的命令,达到开机自动运行用户应用程序的目的。下面以我做的实验为例,描述具体的实现步骤。该方法源于网络,我加以验证,稍做修改,此文相当于转载。 1.进入pc机的Linux 操作系统,在/nfs/usr/下通过mkdir lz 命令新建一个名为lz的文件夹,进入lz文件夹,通过mkdir hello新建一个hello文件夹用来存放我们将要编写的hello.c文件和编译生成的可执行文件。 2.在/nfs/usr/lz/hello下通过vi hello.c命令新建hello.c文件,编辑如下测试程序:#include int main(){ printf("Hello,test arm-linux! "); return 0;}完成编辑后通过:wq保存后退出。 3.主机通过如下命令交叉编译环境编译hello.c: #arm-linux-gcc –o hello hello.c 4.通过ls 命令可以看到在/nfs/usr/lz/hello/下已经生成了hello可执行文件,我们可以在开发板上通过./hello来测试自己编写的hello.c执行情况 5.修改rc.local文件,在文件的最后通过‘#’释掉启动图形界面的指令,增加执行用户应用程序hello的指令,具体实现如下: #export PATH=$QPEDIR/bin:$PATH#qtopia#/usr/qtopia/bin/qtopia /usr/lz/hello/./hello注:前三行是注释掉启动图形界面,最后一行是添加的执行用户的hello测试程序。 6.重启开发板,通过vivi参数配置让开发板通过nfs挂载主机上的文件系统,这时我们就可以通过超级终端看到开发板已经运行了我们编写的hello程序