树莓派Linux启动过程简介

树莓派Linux启动过程简介,第1张

    昨天在写关于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 部分高级应用技巧等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10142419.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存