打印
[新唐博主]

NUC980先来点个灯&如何设置开启自启动

[复制链接]
1343|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
coshi|  楼主 | 2023-10-27 11:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
嵌入式Linux开机启动过程:
    可以分为以下几个步骤:

CPU复位:开机时,CPU会执行复位操作,将内存的内容清空,寄存器的初始值复位。

ROM启动:CPU会从ROM中读取启动程序,将其加载到内存中,开始启动内核。

Bootloader(启动管理程序)加载:启动管理程序是一段小程序,用于加载操作系统的内核和文件系统。这里使用的是U-boot。

内核加载:启动管理程序会加载内核文件,内核启动后会进行硬件初始化和设备驱动的加载。

根文件系统加载:内核会加载根文件系统,根据启动管理程序中设置的参数(如NFS、SD卡、EMMC等)加载根文件系统。

启动脚本执行:内核启动后会执行启动脚本(如/etc/rc.d/rc.local),对系统进行配置和初始化。

用户应用启动:系统配置和初始化完成后,用户应用程序会被启动,系统进入正常运行状态。。

启动脚本的执行过程:
BusyBox init 会在启动后读取 /etc/ 目录下的 inittab 文件,下面是其内容样式:

# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org>
#
# Note: BusyBox init doesn't support runlevels.  The runlevels field is
# completely ignored by BusyBox init. If you want runlevels, use
# sysvinit.
#
# Format for each entry: <id>:<runlevels>:<action>:<process>
#
# id        == tty to run on, or empty for /dev/console
# runlevels == ignored
# action    == one of sysinit, respawn, askfirst, wait, and once
# process   == program to run

# Startup the system
::sysinit:/bin/mount -t proc proc /proc
::sysinit:/bin/mount -o remount,rw /
::sysinit:/bin/mkdir -p /dev/pts /dev/shm
::sysinit:/bin/mount -a
::sysinit:/bin/mkdir -p /run/lock/subsys
::sysinit:/sbin/swapon -a
null::sysinit:/bin/ln -sf /proc/self/fd /dev/fd
null::sysinit:/bin/ln -sf /proc/self/fd/0 /dev/stdin
null::sysinit:/bin/ln -sf /proc/self/fd/1 /dev/stdout
null::sysinit:/bin/ln -sf /proc/self/fd/2 /dev/stderr
::sysinit:/bin/hostname -F /etc/hostname
# now run any rc scripts
::sysinit:/etc/init.d/rcS

# Put a getty on the serial port
console::respawn:/sbin/getty -L  console 0 vt100 # GENERIC_SERIAL

# Stuff to do for the 3-finger salute
#::ctrlaltdel:/sbin/reboot

# Stuff to do before rebooting
::shutdown:/etc/init.d/rcK
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r



BusyBox init 会在启动后执行第三个字段为 sysinit 的语句中的命令,会在关机时执行第三个字段为 shutdown 的语句中的命令。

其中:rcS 和 rcK可以来执行开关机。


可以看到 rcS 脚本会依据文件名排序依次读取 /etc/init.d/ 目录下名字为 S??* 格式的脚本文件,并执行其中的 start 方法。同用的 rcK 脚本会依据文件名逆排序读取 /etc/init.d/ 目录下名字为 S??* 格式的脚本文件,并执行其中的 stop 方法。

rcS:

#!/bin/sh


# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do

     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue

     case "$i" in
        *.sh)
            # Source shell script for speed.
            (
                trap - INT QUIT TSTP
                set start
                . $i
            )
            ;;
        *)
            # No sh extension, so fork subprocess.
            $i start
            ;;
    esac
done


rcK:

#!/bin/sh


# Stop all init scripts in /etc/init.d
# executing them in reversed numerical order.
#
for i in $(ls -r /etc/init.d/S??*) ;do

     # Ignore dangling symlinks (if any).
     [ ! -f "$i" ] && continue

     case "$i" in
        *.sh)
            # Source shell script for speed.
            (
                trap - INT QUIT TSTP
                set stop
                . $i
            )
            ;;
        *)
            # No sh extension, so fork subprocess.
            $i stop
            ;;
    esac
done

设置开机自动运行程序
对于我们需要设置开机运行程序而言,可以编写名字为 S??* 格式的脚本文件存放到 /etc/init.d/ 目录下,这样它就会在开机时被调用执行其中的 start 方法了。

编写了一个自己的脚本开机脚本:

#!/bin/sh
start() {
        echo "S99 iS start !"
        sh /sbin/helloworld
}
stop() {
        echo "S99 iS stop !"
}

restart() {
        stop
        start
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        restart
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit $?

额!也跑起来了,就是是在shell 里面操作点灯脚本,然后控制台不可以使用了。

如下是如何点灯!
关于点灯脚本:

LED灯的指示引脚:



所以可以通过读写 /sys/class/gpio/ 目录下指定GPIO口编号的文件来操作GPIO口。GPIO口编号换算如下:

PB13 = 32 x 1(PA) + 13 = 45
PE12 = 32 x 4(PA/PB/PC/PD) + 12 = 140
PF10 = 32 x 5(PA/PB/PC/PD/PE) + 10 = 170

所以连个LED灯分别是:

PB0 = 32 x 1(PA) + 10 = 32
PB1 = 32 x 1(PA) + 1 = 33

在终端写操作LED

# 导出以使用GPIO32
echo 32 > /sys/class/gpio/export
# 导出后将在 /sys/class/gpio/ 目录下出现 gpio32 目录,读写其中的文件即可操作该GPIO口

# 将GPIO32设置为输出模式
echo out > /sys/class/gpio/gpio32/direction
# 将GPIO32设置为输出高电平
echo 1 > /sys/class/gpio/gpio32/value
# 将GPIO32设置为输出低电平
echo 0 > /sys/class/gpio/gpio32/value

# ====================

# 导出以使用GPIO140
echo 140 > /sys/class/gpio/export
# 将GPIO140设置为输入模式
echo in > /sys/class/gpio/gpio140/direction
# 打印GPIO140端口电平
cat /sys/class/gpio/gpio140/value

# ====================

# 取消使用GPIO32
echo 32 > /sys/class/gpio/unexport
# 取消使用GPIO140
echo 140 > /sys/class/gpio/unexport


点灯脚本:

#!/bin/bash
echo 32 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio32/direction
while true
do
    echo 1 > /sys/class/gpio/gpio32/value
    echo "灭"
    sleep 1
    echo 0 > /sys/class/gpio/gpio32/value
    echo "亮"
    sleep 1
done



————————————————
版权声明:本文为CSDN博主「IOT-Power」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a15236617777/article/details/131009127

使用特权

评论回复
沙发
tpgf| | 2023-11-7 15:12 | 只看该作者
这里说的自启动就跟pc机说的上电开机似的吗

使用特权

评论回复
板凳
木木guainv| | 2023-11-7 15:47 | 只看该作者
cpu复位之后,所有的寄存器都会回复出厂设置吗?

使用特权

评论回复
地板
磨砂| | 2023-11-7 16:49 | 只看该作者
木木guainv 发表于 2023-11-7 15:47
cpu复位之后,所有的寄存器都会回复出厂设置吗?

应该是然后就开始走主程序进行各种初始化了

使用特权

评论回复
5
八层楼| | 2023-11-7 19:19 | 只看该作者
其他种类的系统跟这个的开机过程是差不多的吗

使用特权

评论回复
6
晓伍| | 2023-11-7 19:49 | 只看该作者
默认的都是从rom里边启动的是吗

使用特权

评论回复
7
xiaoqizi| | 2023-11-7 20:20 | 只看该作者
单片机不都是上电就运行的吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

96

主题

3309

帖子

4

粉丝