0
点赞
收藏
分享

微信扫一扫

Linux嵌入式系统如何做到应用程序开机自启

穿裙子的程序员 2022-02-11 阅读 39

这里写自定义目录标题


连接转载来自以下连接
https://blog.csdn.net/mybelief321/article/details/9972279

下面以我做的实验为例,描述具体的实现步骤。该方法源于网络,我加以验证,稍做修改,此文相当于转载。

1.进入pc机的Linux操作系统,在/nfs/usr/下通过mkdir lz命令新建一个名为lz的文件夹,进入lz文件夹,通过mkdir hello新建一个hello文件夹用来存放我们将要编写的hello.c文件和编译生成的可执行文件。

2.在/nfs/usr/lz/hello下通过vi hello.c命令新建hello.c文件,编辑如下测试程序:#includeint main(){ printf(“Hello,test arm-linux!\n”); 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= Q P E D I R / b i n : QPEDIR/bin: QPEDIR/bin:PATH#qtopia#/usr/qtopia/bin/qtopia/usr/lz/hello/./hello注:前三行是注释掉启动图形界面,最后一行是添加的执行用户的hello测试程序。

6.重启开发板,通过vivi参数配置让开发板通过nfs挂载主机上的文件系统,这时我们就可以通过超级终端看到开发板已经运行了我们编写的hello程序。

这个给了我很大启发,我就顺着rc.local结合自己的板子来试验哈,我的是GT2440的板子,里面没有rc.local,但是发现有个rcS,原来这就是启动脚本,打开我的rcS如下: [root@GTStudio init.d]# cat /etc/init.d/rcS

#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:

runlevel=S

prevlevel=N

umask 022

export PATH runlevel prevlevel ## Trap CTRL-C &c only in this shell so we can interrupt subprocesses.#

trap “:” INT QUIT TSTP/bin/hostname GTStudio

/bin/mount -n -t proc none /proc

/bin/mount -n -t sysfs none /sys

/bin/mount -n -t usbfs none /proc/bus/usb

/bin/mount -t ramfs none /dev

echo /sbin/mdev > /proc/sys/kernel/hotplug/

sbin/mdev -s # mounting file system specified in /etc/fstab

mkdir -p /dev/pts

mkdir -p /dev/shm/bin/

mount -n -t devpts none /dev/pts -o mode=0622

/bin/mount -n -t tmpfs tmpfs /dev/shm

/bin/mount -n -t ramfs none /tmp

/bin/mount -n -t ramfs none /var

mkdir -p /var/empty

mkdir -p /var/log

mkdir -p /var/lock

mkdir -p /var/run

mkdir -p /var/tmp

/sbin/hwclock -s syslogd/etc/rc.d/init.d/netd start

echo " " > /dev/tty1

echo “Starting networking…” > /dev/tty1

sleep 1

etc/rc.d/init.d/httpd start

echo " " > /dev/tty1echo “Starting web server…” > /dev/tty1

sleep 1

/etc/rc.d/init.d/leds start

echo " " > /dev/tty1

echo “Starting leds service…” > /dev/tty1

echo " "

sleep 1

/sbin/ifconfig lo 127.0.0.1/etc/init.d/ifconfig-eth0 /

bin/qtopia &echo " " > /dev/tty1

echo “Starting Qtopia, please waiting…” > /dev/tty1

在这基础上我做了二个实验,第一个就是在usr/sbin下复制写好的openclose程序,在bin/etc/rc.d/init.d下编译脚本如下:#!/bin/sh

base=openclose# See how we were called.

case " 1 " i n s t a r t ) / u s r / b i n / 1" in start) /usr/bin/ 1"instart)/usr/bin/base & ;; stop)

pid=/bin/pidof $base

if [ -n “$pid” ];

then kill -9 $pid

fi ;;

esacexit 0

刚开始以为这样就可以了,重启板子后,发现没有运行,研究了哈/etc/init.d和/etc/rc.d/init.d的区别和联系,发现还得再/etc/init.d/rcS的脚本里写进echo “Starting openclose” >/dev/tty1/etc/rc.d/init.d/openclose start 这样才能运行,同样如果输入/etc/rc.d/init.d/openclose stop 则不能运行程序,我的理解是这etc/inir.d需要有指向etc/rc.d/init.d/openclose的语句,才能决定是否执行(start or stop)openclose里的指向程序(本实验室中base=openclose). 第二个实验就是尝试在etc/inir.d/rcS里直接运行我的程序,刚开始通过直接入 ./mns/nfs/writeread/arm-linux-gcc-4.3.3/writeread(我这里是通过nfs服务来运行我的程序的),发现不能运行,后来还是把writeread拷贝到usr/sbin里,这样通过./usr/sbin/writeread 开机就能直接运行 了。

举报

相关推荐

0 条评论