昨天在写关于linux设置脚本开机启动的文章时,有个疑问就是开机时怎么确认运行级别,然后遍历执行/etc/rcNd/目录下的所有服务程序。带着疑问, 在前人的基础上 学习总结一下linux系统初始化的工作的内容,现在树莓派4B上展示出来。
1、加载内核
当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。 *** 作系统接管硬件以后,首先读入 /boot 目录下的内核文件。树莓派4B的内核是Raspbian GNU/Linux 10 (buster),基于Debian。
2、初始化进程init
内核文件加载以后,运行第一个程序init,它的作用是初始化系统环境。init位于目录/sbin,进程号PID为1,即1号进程,其他所有进程都由init衍生,是init的子进程。
同时还有个0号进程,idle进程,在系统初始化时由内核kernel自身从无到有创建,通过调用kernel_thread创建一个内核线程去执行init函数,0号进程创建1号进程。
3、运行级别
具体介绍请参考笔者的文章-Linux运行级别简介 ,但是开机时是怎么确定运行级别的呢?
init进程首先读取文件 /etc/inittab,它是运行级别的设置文件。但是各个发行版不太一样,init的配置文件也不一样,有可能使用/etc/eventd里面的配置文件,最新版的改用为/etc/init目录。
4、开机启动程序
具体详情请参考文章-linux中/etc/initd设置开机启动 ,确定运行级别后,执行rcNd目录下的文件,这些链接文件是连接到initd目录下的程序。init进程逐一加载开机启动程序,其实就是运行这个目录里的启动脚本。
比如运行级别为5(图形化多用户)时启动的程序:
5、用户登录
开机启动程序加载完毕以后用户登录。用户的登录方式有三种:
命令行登录:init进程调用getty程序。
ssh登录:init进程调用sshd程序。
图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm。
6 、login shell
默认shell时bash,命令行界面,让用户可以直接与 *** 作系统对话。读取环境变量,具体请参考笔者文章-Linux环境变量的设置。
上一次学习了用树莓派控制一个led灯。
那么如何用按键来控制led灯呢?
就是说有一个按键,我们按下的时候led灯亮起,再按一次led灯关闭
如此往复呢?
首先我们在13号引脚那里连接一个上拉电阻,然后再连接开关,如下图。
在这种情况下,我们用11号引脚控制led灯。
程序如下。
import RPiGPIO as GPIO
import time
GPIOsetmode(GPIOBOARD)
GPIOsetup(11,GPIOOUT)
GPIOsetup(13,GPIOIN,pull_up_down=GPIOPUD_DOWN)
led=True
while True:
while (GPIOinput(13)==GPIOHIGH):
pass
else:
led= not led
pass
if led:
GPIOoutput(11,GPIOHIGH)
pass
else:
GPIOoutput(11,GPIOLOW)
pass
pass
在这里可以看到。但是程序不是很健壮,原因是我们没有消抖。
当我们按下的一瞬间,可能程序已经重复执行了好多遍。
因此,现在想办法消抖。
import RPiGPIO as GPIO
import time
GPIOsetmode(GPIOBOARD)
GPIOsetup(11,GPIOOUT)
GPIOsetup(13,GPIOIN,pull_up_down=GPIOPUD_DOWN)
led=True
while True:
while(GPIOinput(13)==GPIOHIGH):
pass
else:
timesleep(01)
if(GPIOinput(13)==GPIOLOW):
led=not led
pass
pass
if led:
GPIOoutput(11,GPIOHIGH)
timesleep(01)
pass
else:
GPIOoutput(11,GPIOLOW)
timesleep(01)
pass
pass
这样就非常准了
此篇为 《树莓派使用基础》 中,RPIGPIO Input功能高级应用技巧。GPIO的简单使用请参考博文 树莓派3B+ GPIO输入输出使用
目前有几种途径可以在程序中获得 GPIO 的输入信息。
如果在输入针脚上没有连接任何元件,那么它将是“浮动(float)”的。换句话说,因为没有连接任何元件,在按下按钮或开关之前,读取的值是没有意义的。由于电源的波动,获取到的值可能会有很大的变化。
为了解决这个问题,我们需要使用 上拉/下拉电阻 。这样,我们就可设定输入的默认值了。在这里,可以使用硬件或软件对电阻进行上拉/下拉。使用硬件方式,将一个 10K 的电阻连接在输入通道与 33V(上拉)或 0V(下拉)之间是常用的做法。而 RPiGPIO 也允许您通过软件的方式对配置 Broadcom SOC 来达到目的:
或者
通道编号是基于所使用的编号系统所指定的(BOARD 或 BCM)。
边缘的定义为电信号从 LOW 到 HIGH(上升临界值)或从 HIGH 到 LOW(下降临界值)状态的改变。正常情况下,对于输入的值来说,我们更关心的是输入的状态是否发生了改变。这种状态上的改变是很重要的。
为了避免程序在忙于处理其它的事物时而错过了按下按钮的 *** 作,这里有两种方法可以解决:
在检测到边缘时执行线程回调函数
注意,可以输入 GPIORISING、GPIOFALLING、GPIOBOTH 对边缘进行检测。这种方式的优点是占用 CPU 资源很少,因此系统可以有充裕的资源处理其它事物。
RPiGPIO 在第二条线程中执行回调函数。这意味着回调函数可以同您的主程序同时运行,并且可以立即对边缘进行响应。例如:
如果需要多个回调函数:
注意,在该示例中,回调函数为顺序运行而不是同时运行。这是因为当前只有一个进程供回调使用,而回调的运行顺序是依据它们被定义的顺序。
可能会注意到,每次按钮按下时,回调 *** 作被调用不止一次。这种现象被称作“开关抖动(switch bounce)”。这里有两种方法解决开关抖动问题:
或者
由于某种原因,若不希望程序检测边缘事件,可以将它停止:
原文链接
参考链接
cd (python所在路径)
python3 (python文件名)
chmod +x testsh
su
nano /etc/rc/local
在exit 0上面添加
(testsh所在绝对路径)/testsh
chmod +x rclocal
6终端输入systemctl status rclocal可查看运行成功状态,或得到相关错误提示
1 准备一个树莓派,以及一个计算机,还有一个SD卡,SD卡的容量要大于4G;
2 下载树莓派的 *** 作系统,比如Raspbian,并将其写入SD卡;
3 将SD卡插入树莓派,并将树莓派连接到计算机;
4 使用SSH连接树莓派,并在树莓派上安装必要的软件;
5 在树莓派上安装Python,并使用Python编写程序;
6 将编写的程序上传到树莓派,并运行程序;
7 根据程序的运行结果,对程序进行调试和优化,直到程序运行正常。
树莓派中sudo是不需要密码的。 所以原则上可以在脚本里切换成ROOT用户。
你这个脚本做什么用,如果只是切换完了,执行一个命令,直接用su就可以搞定,印象中是su -c。su -c USER CMD
如果你想执行完脚本后还保留在root状态中,直接用sudo -s就可以
如果希望在树莓派开机进入界面后,自动开始一个python的gui程序,按照如下方法,以my_programpy文件为例:
1给文件设置运行权限
chmod +x my_programpy
2在这个py文件最开始,加上python编译器的地址
比如 #!/usr/bin/env python
如果不清楚python编译器的地址是什么,可以用 which python命令查看。如果是用python3,是用 which python3
3打开自启动的文件(用户为pi的时候)
nano /home/pi/config/lxsession/LXDE-pi/autostart
增加一行
@/home/pi/folder/my_programpy
注意:如果py文件中存在地址,要写绝对地址。
以上就是关于树莓派Linux启动过程简介全部的内容,包括:树莓派Linux启动过程简介、树莓派按键控制LED灯、树莓派 GPIO Input 部分高级应用技巧等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)