(5)NUC980先来点个灯如何设置开启自启动

2023-11-06 06:21

本文主要是介绍(5)NUC980先来点个灯如何设置开启自启动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

嵌入式Linux开机启动过程:

    可以分为以下几个步骤:

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

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

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

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

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

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

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

启动脚本的执行过程:

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" ] && continuecase "$i" in*.sh)# Source shell script for speed.(trap - INT QUIT TSTPset 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" ] && continuecase "$i" in*.sh)# Source shell script for speed.(trap - INT QUIT TSTPset 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() {stopstart
}case "$1" instart)start;;stop)stop;;restart|reload)restart;;*)echo "Usage: $0 {start|stop|restart}"exit 1
esacexit $?

额!也跑起来了,就是是在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
doecho 1 > /sys/class/gpio/gpio32/valueecho "灭"sleep 1echo 0 > /sys/class/gpio/gpio32/valueecho "亮"sleep 1
done

这篇关于(5)NUC980先来点个灯如何设置开启自启动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/354949

相关文章

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

如何Python使用设置word的页边距

《如何Python使用设置word的页边距》在编写或处理Word文档的过程中,页边距是一个不可忽视的排版要素,本文将介绍如何使用Python设置Word文档中各个节的页边距,需要的可以参考下... 目录操作步骤代码示例页边距单位说明应用场景与高级用China编程途小结在编写或处理Word文档的过程中,页边距是一个