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

news/2024/9/8 5:24:21/

嵌入式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


http://www.ppmy.cn/news/170555.html

相关文章

4、6word

英语四级+六级词汇大全(全部带“音标”) 第一部分:四级词汇大全 A abandon/ ə’bndən/ vt.丢弃;放弃,抛弃 aboard/ ə’bɔ:d/ ad.在船(车)上;上船 absolute/ ‘bsəlu:t/ a.绝对的;纯粹的 absolutely/ ‘bsəlu:tli/ ad.完全地;绝对地 absorb/ əb’sɔ:b…

国产上新!芯驰D9多核Cortex-A55核心板,国产车规级平台

随着信息技术的快速发展&#xff0c;市场对芯片的需求越来越大&#xff0c;中国芯片行业自20世纪80年代开始起步&#xff0c;经过近40年的努力&#xff0c;也进入了一个新的时代&#xff0c;芯片国产化乃未来发展的大势所趋。米尔电子作为行业领先的嵌入式模组厂商&#xff0c;…

用低代码打造高效餐厅管理系统

当代社会&#xff0c;餐饮业有着非常广阔的市场前景&#xff0c;也承担着相应的管理力。随着人工智能、物联网等新技术的快速发展&#xff0c;低代码能化为了许多餐饮门店管理的新革命。在这篇文章中&#xff0c;我们将会探讨低代码智能化带来的餐门店管理新使命。 一、低代码…

【Difussion Model】理解和编程

目录 理论框架text-to-imgaedecodergeneration modelclip的原理 FID指标&#xff1a;评估图像生成的好坏数学原理 理论 框架 不断的进行去噪&#xff0c;并且在这个过程中&#xff0c;step也作为“去噪模型&#xff08;其实就是扩散模型&#xff09;”的输入&#xff1a; de…

C++子类实现父类纯虚函数实现父类获取子类信息

C子类实现父类纯虚函数实现父类获取子类信息 在C中&#xff0c;我们可以通过继承和多态来实现代码的复用和扩展。其中&#xff0c;纯虚函数是实现多态的重要机制之一。在父类中声明一个纯虚函数&#xff0c;在子类中实现该纯虚函数&#xff0c;可以实现子类对父类的扩展和改进…

2019年苹果iPad领先华为平板,双方在中国市场激烈争夺

市调机构IDC公布的2019年中国平板电脑市场的数据显示&#xff0c;苹果iPad以不到120万部的领先优势继续在中国市场位居第一名&#xff0c;华为则惜败&#xff0c;不过2019年三季度华为平板曾一度取得对苹果的领先优势。 数据显示&#xff0c;2019年中国平板电脑市场形成了苹果i…

ipad mini2显示无服务器,iPad Mini 2维修成本剖析 _苹果 iPad mini 2_平板电脑评测-中关村在线...

iPad mini 2随iPad Air一起发售&#xff0c;本次发布会可以说是苹果最受关注也是最为成功的一次发布会。无论是从吸引眼球的方面&#xff0c;还是从技术配置提升的方面&#xff0c;苹果做的都十分漂亮。iPad mini 2众望所归的搭载了Retina技术屏&#xff0c;而且在硬件方面也与…

昂贵的iPadPro难救苹果,廉价平板是王道

苹果昨晚发布了新款的iPadPro&#xff0c;试图通过采用性能更强的A12X处理器以及更轻薄的设计吸引消费者&#xff0c;推动iPad这款产品换发青春&#xff0c;不过从这两年的情况来看&#xff0c;平板电脑市场更受欢迎的是廉价的平板&#xff0c;iPadPro恐怕难以承担起拯救iPad的…

《模板的进阶》

本文主要介绍C模板知识&#xff0c;包括模板的参数类型&#xff0c;模板的特化&#xff0c;模板的分离编译 文章目录 思维导图一、非类型模板参数二、模板的特化2.1模板特化的概念2.2函数模板特化2.3类模板的特化2.3.1全特化2.3.2偏特化 2.4非类型模板参数也是可以特化的 三、模…

iPadMini将继续打压平板价格

摩根分析师Mark Moskowitz表示&#xff0c;第二代iPad Mini将迫使平板电脑厂商的价格继续下降。分析师根据Mini和其他低成平板电脑的价格情况分析和预测了2013年平板电脑的销售情况。分析师预计&#xff0c;2013年平板电脑的销售量将增长65&#xff05;。 苹果公司将是那些高端…

平板电脑的桌面计算机图标,苹果平板电脑桌面图标删除不了怎么办

1. ipad灰色图标删除不了怎么办 删除iPhone或iPad正在等待的程序灰色图标的方法如下&#xff1a;方法一&#xff1a;把“正在等待。” 的灰色图标往右移&#xff0c;开一个全新的页面&#xff0c;保证这个页面里只有这一个图标。然后随便打开一个程序&#xff0c;再按Home键返回…

OpenMMLab AI实战营第二期(2)MMPose初体验

根据MMPose的官方文档学习一下 MMPose文档地址&#xff1a;https://mmpose.readthedocs.io/zh_CN/latest/index.html 文章目录 1. 概述2. 安装2.1 创建conda环境并激活2.2 安装pytorch2.3 使用 MIM 安装 MMEngine 和 MMCV2.4 安装MMPose 3. 20 分钟了解 MMPose 架构设计3.1 总…

NumPy 数值计算基础

NumPy 数值计算基础 Numpy简介Numpy创建数组对象第一种:利用array函数创建ndarray数组第二种:利用arange函数:创建等差一维数组第三种:利用linspace函数:创建等差一维数组&#xff0c;接收元素数量作为参数。第三种:利用linspace函数:创建等差━维数组&#xff0c;接收元素数量…

Redis7实战加面试题-高阶篇(Redis为什么快?高性能设计之epoll和IO多路复用深度解析)

多路复用要解决的问题 并发多客户端连接&#xff0c;在多路复用之前最简单和典型的方案&#xff1a;同步阻塞网络IO模型 这种模式的特点就是用一个进程来处理一个网络连接(一个用户请求)&#xff0c;比如一段典型的示例代码如下。 直接调用 recv 函数从一个 socket 上读取数据…

组装电脑时,散热器高度要与机箱适配

比如附图&#xff0c;散热器高度太高&#xff0c;机箱已经被热管顶出了&#xff1a; 散热器个头真不小&#xff0c;因为涉嫌广告&#xff0c;所以删除了。

计算机主板4针风扇插座,电脑的散热风扇2针、3针、4针接口有什么不同吗?

一台电脑如果没有散热器&#xff0c;那么它内部的温度会无限高&#xff0c;最后直接烧坏硬件。而作为现在最主流的散热方式风冷&#xff0c;就是用散热风扇辅助散热。水冷今天暂时不提。这个散热风扇&#xff0c;和我们普通家用的风扇可是有差别的。今天给大家讲的是不同散热风…

计算机散热方式有哪几种,电脑的最佳散热方式

电脑的最佳散热方式 不知道大家注意到没有&#xff0c;早在2006年就出现了一款全球首创的抽风式散热器&#xff0c;其原理就是主动将笔记本出风口的热量迅速抽出&#xff0c;从原理上来说&#xff0c;应该是对内部散热比较好的一种方式&#xff0c;至于散热底座式的散热主要是对…

Dell 电脑的重装系统以及关键散热驱动建议

说明&#xff1a;本文内容来自dell技术支持的经验总结&#xff0c;文章介绍的系统重装仅适用于dell电脑&#xff0c;主要目标是如何利用dell官方的工具制作u盘启动以及重装dell机器。本人已经实践&#xff0c;效果不错。一方面用作个人经验总结&#xff0c;一方面用作经验分享。…

台式计算机操作系统的安装方法,台式电脑显卡散热器的更换及安装方法教程[多图]...

怎么给显卡安装散热器?由用户想给自己的显卡更换一个散热器,但是不清楚该如何安装,下面给大家介绍下显卡散热器的主要安装步骤。 安装步骤: 注:本教程中使用的散热器是:超频三(PCCOOLER) 加勒比海冷静版K120E。 1、最近是不是感觉到显卡的散热器明显散热不良或者散热效果…

电脑散热,夏天来了 电脑散热风扇太吵怎么办?

时间转眼就进入了五一&#xff0c;在这短短几天中&#xff0c;天气有了很大的变化。 这几天北京的最高气温已经升至36℃&#xff0c;相信国内大部分地区的朋友都开始感受到了夏天的气息。 除了脱下外套&#xff0c;打开空调之外&#xff0c;气温升高对我们还有另一个影响&#…