ARM-Linux 完全入門

1.準備部分

1.1 虛擬機安裝

  1. 準備VMware軟件、ubuntu系統鏡像
  2. 安裝過程
  • VMware安裝
    破解(自己百度破解碼,多試幾個網址,會有能用的)
  • Ubuntu安裝
  1. 配置聯網
    橋接
    虛擬機Ubuntu系統必須能連接到外網,不然不能更新軟件安裝包

配置虛擬機網絡
第一步
1.重啟虛擬機網絡編輯器(還原配置)
在這里插入圖片描述

第二步
2.重啟虛擬機網絡適配器(移除再添加)()

第三步
3.重啟虛擬機網絡服務器
sudo service network-manager stop
sudo rm /var/lib/NetworkManager/NetworkManager.state
sudo service network-manager start

1.2 板子獲取

2.Linux基礎命令

2.1.操作方式

2.1.1界面

2.1.2命令行

  1. 打開終端 Ctrl+Alt+t
    • 一個窗口打開第二個 Ctrl+Shift+t
    • 新窗口打開第二個 Ctrl+Alt+t
  2. 字體放大 Ctrl+(+)
  3. 字體縮小 Ctrl+(-)

2.2 文件和目錄操作

ls -l -a lsusb lsmod
cd ~ …
pwd
mkdir
touch
rm
mv
cat

2.3 管理員

2.3.1 管理員權限

sudo

2.3.1 管理員用戶

創建root用戶 sudo passwd root
切換用戶 su + 用戶名

2.4 安裝應用

2.4.1 apt

  • sudo apt install (package name)
  • sudo apt update 使用 apt 更新包數據庫
  • sudo apt upgrade 使用 apt 升級已安裝的軟件包

2.4.2 換源

2.4.2.1 界面方式
  1. 點Ubuntu左下角菜單,選紫色的SoftWare&Updates 軟件
  2. 點Download from 選擇other
  3. 再選擇C開頭的china,然后點mirrors.aliyun.com,最后點Choose Server
  4. 進行密碼驗證 最后點close
  5. 然后點reload
  6. sudo apt update
  7. sudo apt upgrade

在這里插入圖片描述

2.4.2.1 命令方式

一切皆文件

2.5 文本處理

2.5.1 vim

2.5.1.1安裝方式
sudo apt install vim
2.5.1.2使用方法
2.5.1.2.1命令模式

默認,此模式下,可使用方向鍵(上、下、左、右鍵)或 k、j、h、i 移動光標的位置,還可以對文件內容進行復制、粘貼、替換、刪除等操作

2.5.1.2.2輸入模式

使 Vim 進行輸入模式的方式是在命令模式狀態下輸入 i、I、a、A、o、O 等插入命令,當編輯文件完成后按 Esc 鍵即可返回命令模式
快捷鍵
小寫i/a :在當前光標所在位置插入輸入的文本,光標后的文本相應向右移動
小寫x:刪除光標所在位置的字符(命令模式下)
小寫dd:刪除光標所在(命令模式下)

2.5.1.2.3編輯模式

編輯模式用于對文件中的指定內容執行保存、查找或替換等操作。在命令模式狀態下按“:”鍵,此時 Vim 窗口的左下方出現一個“:”符號,這是就可以輸入相關指令進行操作了
相關命令

  • Esc +:wq
  • Esc +:wq!
  • Esc+:q
  • Esc+:!
  • 顯示行 Esc + :set nu
  • 搜索文本 :Esc+:/文本
    查看上一個: N 查看下一個 :n

2.5.2 gedit

2.5.3 nano

2.6 縮和解壓縮

tar
打包示例 tar -cvf test.tar*.c
解壓示例 tar -xvf test.tar

2.7 查找

2.7.1 find

查找文件

sudo find /home/ling -name "*.c'

2.7.2 grep

查找文件中的字符

grep "d" a.c

dmesg

dmesg  | grep usb

2.8 基礎編輯測試

  • gcc
    sudo apt install gcc
    編譯 gcc
  • file
  • chmod
    文件所有者(Owner)
    用戶組(Group)
    其它用戶(Other Users)
    sudo chmod 777 test.c

2.9 misc

  • ifconfig
  • echo
  • ping
  • ps axu 查看系統中所有運行進程
  • top
  • kill
  • uname -a
  • shutdown 60秒延時關閉系統
    shutdown now 立即關閉
  • reboot
  • ctrl+c 終止進程 SIGINT
  • ctrl+z 掛起程序
    -jobs 查看當前終端的后臺任務
    fg 將掛起的任務恢復到前臺運行
    bg 將掛起的任務放到后臺繼續運行
    kill %1 終止編號為1的后臺任務

3.環境搭建

3.1 注意

串口: windows要選擇到底連接哪里(windows/linux)
Windows關機之前,虛擬機要關閉

3.2 ssh(方便切換)

3.2.1Ubuntu

sudo apt-get install openssh-server

ifconfig

3.2.2Windows

MobaXterm

3.3 傳文件

3.3.1 FTP

3.3.1.1Ubuntu
  1. sudo apt-get install vsftpd
  2. sudo vim /etc/vsftpd.conf
    找到 #write_enable=YES
    把#刪掉,然后保存
    在這里插入圖片描述
  3. sudo /etc/init.d/vsftpd restart
3.3.1.2 Windows

安裝 FileZilla

3.3.2.3 注意:

如果連接不上,關閉Linux(sudo ufw disable)和Windows防火墻

3.3.2 samba

3.3.2.1Ubuntu
1.sudo apt-get upgrade
2.sudo apt-get update
3.sudo apt-get dist-upgrade
4.sudo apt-get install samba samba-common
5.samba -V #如果出現下面版本號說明已經安裝了samba服務器
6.sudo mkdir /home/share
7.sudo chmod 777 /home/share
8.sudo smbpasswd -a ling#需要確認輸入兩個相同的密碼確認
9.sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak #備份 smb.conf 配置文件
10.sudo vim /etc/samba/smb.conf #在配置文件smb.conf的最后添加下面的內容(里面的信息要改成自己的)
11.sudo service smbd restart(或者/etc/init.d/samba restart) #重啟samba服務器
[global]; 創建工作組 設定 Samba Server 所要加入的工作組或者域  workgroup = WORKGROUP ; 為了防止出現中文目錄亂碼的情況。其中根據你的local,UTF-8 有可能需要改成 cp936; display charset = UTF-8unix charset = UTF-8dos charset = cp936 ; 是否允許guest用戶訪問guest ok = no; 注:如果 #security 存在就直接修改,不存在就創建; security = user ; 安全模式  我們設置用戶安全級別security = user ; 說明:用來定義用戶名映射,比如可以將root換成administrator、admin等。不過要事先在smbusers文件中定義好。; 比如:root = administrator admin,這樣就可以用administrator或admin這兩個用戶來代替root登陸Samba Server,更貼近windows用戶的習慣。username map = /etc/Samba/smbusers ; 共享名,該共享標簽,該名字為在電腦上看到的共享名 注意網絡映射的路徑是這標簽名字不是共享路徑的名字
[share]; 該共享描述comment = Shared Folder with username and password ; 共享文件夾路徑path = /home/ling/; 表示是否允許匿名訪問該共享目錄public = no; 配置的Samba訪問賬號 指明可以訪問的用戶valid users = ling; 表示是否可以在 Window Explorer中顯示該目錄browsable = no; 指明新建立的文件的屬性create mask = 777 ; 指明新建立的目錄的屬性directory mask = 777; force group 和force user 規定創建的文件或文件夾的擁有者和組擁有者是誰 ; 一般這兩個值來空,則表示擁有者和組擁有者為創建文件者。 如設定值,如force group=ling; Force user=yhq,則不管是誰創建的文件和文件夾,擁有者都為yhq和yhq組。; force user強制把建立文件的屬主是誰。如果我有一個目錄,讓guest可以寫,那么guest就可以刪除,; 如果我用force user=yhq強制建立文件的屬主是yhq,同時限制create mask = 0755,; 這樣guest就不能刪除了。force user = lingforce group = ling; available用來指定該共享資源是否可用available = yes ; 共享路徑讀權限 設置共享是否可瀏覽,如果no則表示隱藏,需要通過"//ip/共享目錄"進行訪問browseable = yes; 共享路徑寫權限writable = yes
3.3.2.2 Windows
  1. 打開文件管理器
    點擊此電腦

  2. 選擇映射網絡驅動器
    在這里插入圖片描述

  3. 添加
    \虛擬機IP地址\share
    eg:\192.168.31.169\share

  4. 輸入用戶名&密碼

3.3.2.3 注意

如果連接不上,關閉Linux(sudo ufw disable)和Windows防火墻

3.3.3 scp

3.3.4 共享文件夾

4.系統編譯

4.1 交叉編譯器安裝

  1. cd /usr/local
    sudo mkdir arm
    cd arm
  2. 把交叉編譯工具鏈拷貝到/usr/local/arm文件夾(FTP)
    sudo chmod 777 arm
  3. 解壓 sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
  4. 環境變量修改
  • 查看環境變量
    env
    printenv
    echo $PATH
  • 修改環境變量
    sudo vim /etc/profile
    最后面新一行添加
 export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
  1. 重啟sudo reboot
  2. 測試 arm-linux-gnueabihf-gcc -v
  3. 編譯

4.2 Uboot

4.2.1綜述

是一套裸機程序,可以理解為板子上電的初始化
Uboot的源代碼,啟動流程,都值得分析,面試會問

4.2.2 編譯

  1. 安裝編譯必用工具
sudo apt-get install lzop  libncurses5-dev u-boot-tools
  1. 拷貝迅為Uboot源代碼
cd ~
mkdir Linux
mkdir uboot
cd uboot

拷貝FTP

  1. 解壓
tar -xvf uboot-imx-rel_imx_4.1.15_2.1.0_ga_20200512.tar.gz 
cd uboot-imx-rel_imx_4.1.15_2.1.0_ga/
  1. 編譯
    ./create.sh
sudo apt install make 

Makefile

  • .config
  • make menuconfig
  • Kconfig
  1. 生成文件
  • uboot.imx
  • uboot.bin

4.2.3流程

4.2.3.1匯編部分
  • 中斷
  • 看門狗
  • cache
  • mmu
  1. 進入SVC模式
  2. 基本硬件初始化
  • 時鐘
  • 串口
  • flash
  • 閃存
  1. 初始化堆棧
  2. 自搬移
  • 重定位
  • 內存運行塊
    在這里插入圖片描述
4.2.3.1C語言部分
  1. 初始化大部分硬件
  • 網卡
  • 屏幕
  • usb
  1. 把內核搬到內存

4.2.4Uboot源碼簡要分析

4.2.4.1匯編部分
  1. 跳轉到reset
    arch/arm/lib/vectors.S
    在這里插入圖片描述
  2. arch/arm/cpu/armv7/start.S
  • reset
    在這里插入圖片描述

  • cpu_init_cp15 在這里插入圖片描述

  • cpu_init_crit
    在這里插入圖片描述

  1. arch/arm/cpu/armv7/lowlevel_init.S
    在這里插入圖片描述

  2. arch/arm/lib/crt0.S
    在這里插入圖片描述

4.2.4.1C語言部分
  1. common/board_f.c
    board_init_f
    在這里插入圖片描述

  2. common/board_r.c
    board_init_r
    在這里插入圖片描述
    run_main_loop
    在這里插入圖片描述

  3. common/main.c
    在這里插入圖片描述

4.2.5 create.sh

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make distclean
make mx6ul_topeet_emmc_defconfig #.config
make #Makefile
怎么修改.config? make menuconfig
menuconfig界面怎么生成的? Kconfig

4.3 內核

4.3.1 編譯過程

  1. 拷貝迅為kernel源代碼
cd ~
cd Linux
mkdir kernel
cd kernel

拷貝 FTP

  1. 解壓
tar -xvf linux-imx-rel_imx_4.1.15_2.1.0_ga_20200903.tar.gz
cd linux-imx-rel_imx_4.1.15_2.1.0_ga
  1. 編譯
    ./create.sh
  2. 編譯后自動生成的文件
  • arch/arm/boot
    image 非壓縮文件
    zimage
    uimage
  • arch/arm/boot/dts 設備樹

4.3.2 內核源碼

  1. 各個文件都是什么意思
  2. 源碼查看軟件 Source Insight 4.0
  • 把解壓完的內核源碼從虛擬機拷貝到Windows
  • 新建Source Insight工程

4.3.3 編譯腳本

  1. #!/bin/bash
    bash腳本
  2. make imx_v7_defconfig
  • arch\arm\configs
  • .config
  1. make uImage LOADADDR=0x10008000 -j16
  2. make modules
  3. 驅動編譯的兩種方式
  • 將驅動編譯進內核:obj-y:yes內建
  • 將驅動編譯進ko文件:obj-m:module模塊
  1. make *.dtb

4.1 設備樹

4.1.1功能

包含芯片&板子 外設信息
系統驅動會匹配設備樹,匹配成功后加載驅動
驅動代碼怎么讀取設備樹信息?

4.1.2 路徑

arch/arm/boot/dts

4.1.3dts

  1. dtsi soc級
  2. dts 板級
  3. topeet_emmc_hdmi.dts
    imx6ull-14x14-evk-emmc.dts
    imx6ull-14x14-evk.dts
    imx6ull.dtsi

4.1.4 dtc(device-tree-compiler 編譯器)

  • 編譯
  • 反編譯
dtc -I dtb -O dts -o test001.dts topeet_emmc_hdmi.dtb

4.1.4dtb :Blob

4.2 根文件系統proc

根文件系統制作rcs

5.燒錄調試

5.1調試模式V1

5.1.1原理

Uboot從板子emmc啟動
內核、設備樹、根文件系統從服務端(遠程)

  1. tftp:遠程下載內核、網絡、設備樹
  2. nfs:掛載網絡根文件系統network file system

5.1.2 網絡搭建

5.1.2.1硬件環境要求
  1. 板子網口2通過網線直接連接電腦
    在這里插入圖片描述
  2. 電腦沒有網口 可以買一個網卡轉usb
    在這里插入圖片描述
  3. 電腦有網口,但是用來連接網絡了(不是WIFI上網)
    也可以買一個網口轉USB
5.1.2.2 tftp搭建

虛擬機Linux作為服務端

  1. cd ~
  2. mkdir tftpfile
  3. sudo chmod 777 tftpfile
  4. sudo apt-get install tftp-hpa tftpd-hpa
  5. sudo vim /etc/default/tftpd-hpa
    修改為如下內容,具體路徑根據自己實際情況
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/wfeng/tftpfile"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l-c-s"
  1. sudo service tftpd-hpa restart
5.1.2.3 nfs搭建

1.下載

 sudo apt-get install nfs-kernel-server rpcbind

2.創建文件夾

cd ~ 
mkdir nfs
  1. 修改文件
 sudo vim /etc/exports

最后面添加

/home/ling/nfs  *(rw,sync,no_root_squash)

具體添加內容 路徑 根據自己的實際情況
wq保存退出
5. 重啟nfs服務:

sudo /etc/init.d/nfs-kernel-server restart
5.1.2.4雙網卡模式設置
5.1.2.4.1 Windows端

將與板子網線連接的電腦網口的網卡設置成靜態IP
網線分別插在電腦網口和開發板網口上,開發板上電

  1. 找到網卡在這里插入圖片描述

  2. 雙擊點開設置IP地址在這里插入圖片描述

  3. 可以按照如圖設置,設置完記得點確定在這里插入圖片描述

5.1.2.4.2 VMware虛擬機設置
  1. 虛擬機點編輯,然后點虛擬網絡編輯器在這里插入圖片描述

  2. 點更改設置在這里插入圖片描述

  3. 點添加網絡(我添加的是VMnet1,名字不重要)在這里插入圖片描述

  4. 把主機模式改為橋接模式在這里插入圖片描述

  5. 選擇那會改為靜態IP的網卡

5.1.2.4.3 Ubuntu設置
  1. 虛擬機名字處點右鍵,然后點設置在這里插入圖片描述

  2. 點添加在這里插入圖片描述

  3. 選擇網絡適配器
    在這里插入圖片描述

  4. 此時會出現一個新的網絡適配器,選中,改為自定義,然后選擇那會的虛擬網卡,我的是VMnet1在這里插入圖片描述

  5. 打開虛擬機終端,輸入ifconfig,會看到兩個網卡,如果沒有就重啟一下Ubuntu(和圖片網卡名字不一致無所謂,第二個網卡沒有IP地址)在這里插入圖片描述

  6. 打開設置在這里插入圖片描述

  7. 選擇網絡,找到第二個沒有IP的網卡,點開開關,然后點設置(齒輪)

  • 如果兩個網卡的紫色開關不能同時打開,需要按照下圖給兩個網卡添加不同的Profile,具體添加方式見下一步
    在這里插入圖片描述

  • 兩個紫色開關可以同時打開的話,就忽略下圖
    在這里插入圖片描述

  1. 選IPV4,再選manual,再添加IP信息
    在這里插入圖片描述

  2. 輸入ifconfig
    如圖顯示兩張網卡
    在這里插入圖片描述

  • 一個是DHCP動態獲取,用于上網
  • 一個是靜態IP,用于與板子通信
    ping
5.1.2.5板子uboot網絡設置
  1. 板子連接串口,打開MobaXterm串口,115200
  2. 板子上電,在截圖中數字歸零之前按鍵盤任意按鍵,進入uboot設置
  3. 輸入 printenv 可以查看uboot當前環境變量
  4. 修改網絡相關環境變量
  • 服務器IP,linux的IP
setenv serverip 192.168.31.200
  • 網關
setenv gatewayip 192.168.31.1
  • 開發板uboot的IP地址
setenv ipaddr 192.168.2.120
  • 子網掩碼
setenv netmask 255.255.255.0
  • 設置網卡地址
setenv ethaddr 42:03:07:3B:15:5F
  1. 保存環境變量
saveenv

這一步一定要做,要保存,保存到了emmc中
6. 重啟

reset
  1. 測試
    互相ping
  • 重啟板子,重新進入uboot
  • 插上網線,打開虛擬機
  • ping 虛擬機和windows的IP,如圖所示能ping通即可
    顯示 alive就是ping通了,,活著,,,
    在這里插入圖片描述
  • 注意:用虛擬機和windows ping uboot 是不通的
    也不是ping不通,是uboot代碼里面沒有ping回復機制,或者說沒有相關代碼
  • 如果想恢復uboot默認環境變量
env default -a
saveenv

5.1.3 修改uboot引導方式

5.1.3.1 把kernel、設備樹、根文件系統放在對應的文件夾
  1. tftffile 放內核和設備樹
  • zImage:linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/boot/zlmage
  • topeet_emmc_hdmi.dtb:/arch/arm/boot/dts/topeet_emmc_hdmi.dtb
  1. nfs 放根文件系統
  • filezila傳輸 :網盤文件rootfs.tar.bz2
  • samba傳輸 :網盤文件rootfs.tar.bz2
    解壓 :tar -xvf rootfs.tar.bz2
5.1.3.2 進入uboot設置環境變量界面
  1. uboot前3秒內按任意鍵,進入uboot
  2. 修改bootcmd
setenv bootcmd 'tftp 80800000 zImage; tftp 83800000 topeet_emmc_hdmi.dtb; bootz 80800000 - 83800000'

下載內核 下載設備樹 加載內核和設備樹
3. 修改bootargs

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.31.200:/home/ling/nfs ip=192.168.31.120:192.168.31.200:192.168.31.1:255.255.255.0::eth0:off'

!!!上面的 /home/ling/nfs 不要復制啊!!!!!!,改成你自己的nfs路徑哦
可以pwd看看自己的路徑名
4, 保存到emmc

saveenv
  1. 重啟
reset
5.1.3.3 出現nfs掛載失敗問題(nfs版本問題)

在這里插入圖片描述
解決方法

  1. Ubuntu打開文件
sudo vim /etc/default/nfs-kernel-server
  1. 末尾添加
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"

前面不要有#
3. 保存

wq!
  1. 重啟nfs
sudo /etc/init.d/nfs-kernel-server restart
5.1.3.4 掛載成功后
  • 用戶名 root
  • 密碼 topeet

5.2燒寫到emmc

5.2.1燒寫軟件的使用

5.2.1.1燒寫要準備的

把要燒寫的固件放在這個路徑里,這個是必須的
下面這個路徑是Windows的燒寫工具路徑,別搞錯了
mfgtools_for_6ULL\Profiles\Linux\OS Firmware\files\linux
在這里插入圖片描述

5.2.1.1固件包括
  1. Uboot文件
    Uboot源碼編譯生成 uboot.imx
  2. 內核文件
    內核源碼編譯生成 zImage
    路徑arch/arm/boot
  3. 設備樹
    內核源碼編譯生成 路徑arch/arm/boot/dts
  • topeet_emmc_4_3.dtb
  • topeet_emmc_5_0.dtb
  • topeet_emmc_7_0.dtb
  • topeet_emmc_9_7.dtb
  • topeet_emmc_10_1.dtb
  • topeet_emmc_1024x600.dtb
  • topeet_emmc_hdmi.dtb
  1. 根文件系統

5.2.2進入USB燒錄模式

5.2.2.1把imx6ul板子撥碼開關撥到USB燒錄模式

在這里插入圖片描述

5.2.2.2數據線連接到板子上標有OTG的USB口

另一端直接連接電腦USB口

5.2.2.3打開燒錄軟件mfgtools_for_6ULL

注意事項

  • mfgtools_for_6ULL\Profiles\Linux\OS Firmware\files\linux里面的固件必須全
  • 用右鍵管理員權限打開MfgTool2.exe
  • 盡量關掉虛擬機
  • 如果打不開,或者報錯,去任務管理器關閉殘余進程
    在這里插入圖片描述
5.2.2.4開發板上電
5.2.2.5看到燒錄軟件顯示 符合 HID 標準的供應商定義設備后

點擊start 開始燒錄
在這里插入圖片描述

5.2.2.6看到顯示右圖,代表燒錄完成

在這里插入圖片描述

5.2.2.7關閉軟件先點Stop,再點Exit

5.2.3進入emmc啟動模式

  1. 燒錄完成后,開發板斷電
  2. 撥碼開關撥到 EMMC啟動方式
    在這里插入圖片描述
  3. 數據線插到板子上標有 UART的USB口上
  4. 打開MobaXterm,選擇對應串口,波特率115200
  5. 開發板上電
  6. 系統啟動
    用戶名:root
    密碼:topeet

6.應用入門

6.1oled&mpu6050使用

  1. 硬件購買
  • 0.96OLED屏幕
  • 2.00mm轉2.54mm母對母杜邦線
  1. 硬件接法 在這里插入圖片描述
    在這里插入圖片描述
  2. 應用編譯
arm-linux-gnueabihf-gcc app.c -o app -lm
  1. 驅動編譯
    內核模塊
    ko文件
  • 單獨編譯
  • 單獨加載
insmod
rmmod
lsmod
  • 放在網絡文件系統里就可以

設備樹的修改

iic地址

  • 七位
  • 八位
Z:\Linux\kernel\linux-imx-rel_imx_4.1.15_2.1.0_ga\arch\arm\boot\dts\imx6ull-14x14-evk.dts  
mpu6050@68 {compatible = "mpu6050,INV_MPU6050";//interrupt-parent = <&gpio5>;//interrupts = <0 0>;reg = <0x68>;status = "okay";//position = <1>;};oled@3c {compatible = "i2c_oled";reg = <0x3c>;status = "okay";};

在這里插入圖片描述

6.2應用源碼分析

文件描述符
dmesg查看內核打印的相關信息
dmesg | grep 6050

6.3一切皆文件

6.3.1. 虛擬文件系統

虛擬文件系統提供了一種統一的接口,使得用戶空間程序可以通過文件系統的方式來訪問各種設備和資源

  • 文件描述符
  • open、close、read、write
    在這里插入圖片描述

6.3.2 簡單文件讀寫測試

/*************************************************************************> File Name: test.c> Author: csgec> Mail: 12345678@qq.com > Created Time: 2025年04月10日 星期四 14時51分38秒************************************************************************/#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include<stdio.h>
int main(){int fd;char buff[]="iamlpy777\n";fd=open("./a.txt",O_RDWR|O_CREAT);if(fd<0){printf("can not open file");return fd;}write(fd,buff,sizeof(buff));memset(buff,'\0',sizeof(buff));lseek(fd,0,SEEK_SET);read(fd,buff,sizeof(buff));printf("buff:%s\n",buff);close(fd);return 0;
}

6.4自啟動

6.4.1自啟動修改文件

  • /etc/init.d/rcS
  • /etc/rc.local
  • systemd
    編寫服務配置步驟
新建sh
創建服務
編輯服務
sudo gedit /etc/systemd/system/my_script.service

6.4.2絕對路徑

相對路徑

6.4.3后臺執行

&

6.4.4異步通知

ctrl + c
kill -9 pid

-1SIGHUP 掛起信號  通常用于重新加載配置
-2SIGINT 中斷信號(Ctrl+C)  終止前臺進程
-9SIGKILL強制終止  立即終止,不可攔截
-15  SIGTERM默認終止信號(kill 的默認行為)  允許進程清理資源后退出
-19  SIGSTOP暫停進程(Ctrl+Z)  進程進入暫停狀態,可恢復

7.驅動入門

7.1什么是驅動

7.1.1物理驅動

電機驅動

7.1.2軟件驅動

框架在這里插入圖片描述

7.1.2.1應用層
7.1.2.2內核層
  1. 系統調用
  • open
  • read
  • write
  • ioctrl
  • close
  1. 虛擬文件系統
  2. 驅動代碼
  • 字符設備驅動
  • 網絡設備驅動
  • 塊設備驅動
  1. 設備接口
7.1.2.3硬件層

各種硬件設備

7.2驅動的分類

7.2.1字符設備驅動

按字節流順序訪問

  1. 串口
  2. 鼠標鍵盤
  3. 攝像頭

7.2.2網絡設備驅動

  1. 基于TCP/IP協議
  • 有線網卡(百兆、千兆、萬兆)
  • 無線網卡
  1. socket

7.2.3塊設備驅動

按塊隨機訪問

  • 硬盤
  • 存儲卡
    多個自己一塊

7.3學驅動學的是什么

代碼框架
內核模塊三要素

  1. 入口
    module_init:insmod
  2. 出口
    module_exit:rmmod
  3. 許可證
    MODULE_LICENSE(“GPL”);
    開源協議
    在這里插入圖片描述

7.4MPU6050驅動流程

在這里插入圖片描述

7.4.1 module_init(mpu6050_driver_init);

7.4.2 mpu6050_driver_init

7.4.3 i2c_add_driver(&mpu6050_driver);

i2c_register_driver(THIS_MODULE, driver)
在這里插入圖片描述

7.4.4 mpu6050_driver

  1. .probe = mpu6050_probe
  2. .remove = mpu6050_remove
  3. .id_table = gtp_device_id
  4. .driver
  • .name = “mpu6050”
  • .owner = THIS_MODULE
  • .of_match_table = mpu6050_of_match_table
    {.compatible = “mpu6050,INV_MPU6050”},

7.4.5 mpu6050_probe

7.4.5.1分配設備號 alloc_chrdev_region(&mpu6050_devno, 0, DEV_CNT, DEV_NAME);
  1. 設備號
  • 主設備號
  • 次設備號
  • 查看主次設備號
cd /dev/
ls -l
  • 動態創建
  • 靜態創建
  1. /proc
  • 內核數據的映射
  • 系統信息查詢接口:cat /proc/cpuinfo
    -驗證你注冊的主設備號是否已經生效 cat /proc/devices
  • 查看中斷號是否被注冊 :cat /proc/interrupts
  • 系統信息查詢接口:cat /proc/meminfo
  1. /sys
7.4.5.2 初始化字符設備結構體cdev_init(&mpu6050_chr_dev, &mpu6050_chr_dev_fops);
7.4.5.2.1. mpu6050_chr_dev_fops
  1. .open = mpu6050_open 函數作用:打開設備時調用。
mpu6050_init # 進行MPU6050初始化

內部會調用:

i2c_write_mpu6050(mpu6050_client, PWR_MGMT_1, 0X00)
i2c_transfer(mpu6050_client->adapter, &send_msg, 1);

即:通過 I2C 向 MPU6050 寫控制寄存器,通常是喚醒 MPU6050(PWR_MGMT_1 = 0x00)
在這里插入圖片描述

  1. .read = mpu6050_read
    函數作用:用戶調用 read() 讀取數據時執行。
    流程如下
i2c_read_mpu6050(); // 發起 I2C 讀取動作
i2c_transfer(mpu6050_client->adapter, mpu6050_msg, 2); // I2C 收發
copy_to_user(buf, mpu6050_result, cnt); // 將讀取到的數據復制到用戶空間

在這里插入圖片描述

  1. mpu6050_release
    釋放設備,一般在 close() 時調用。
printk("\n mpu6050_release \n");
7.4.5.2.2綁定設備和fops結構體

fops:file_operations 的縮寫,是 Linux 內核中字符設備驅動的一個核心結構體,用于定義用戶空間調用設備文件時,內核該如何響應。
fops 是一個“函數指針表”,決定了 open()、read()、write() 等操作對應調用驅動中的哪個函數
在這里插入圖片描述

7.4.5.3 添加設備cdev_add(&mpu6050_chr_dev, mpu6050_devno, DEV_CNT);

在這里插入圖片描述

7.4.5.4創建設備類 class_create(THIS_MODULE, DEV_NAME);
7.4.5.5 創建設備節點device_create(class_mpu6050, NULL, mpu6050_devno, NULL, DEV_NAME)

7.4.6 module_exit(mpu6050_driver_exit)

i2c_del_driver(&mpu6050_driver)

7.5IOLED驅動流程

7.5.1模塊載入入口module_init(oled_init)

7.5.2oled_init函數中的核心操作

i2c_add_driver(&oled_driver);

將 oled_driver 注冊到 I2C 總線,系統會根據設備樹或板級信息自動調用 .probe = oled_probe。

7.5.3 oled_driver結構體定義

.name  = "oled",
.owner = THIS_MODULE,
.probe = oled_probe,
.remove = oled_remove,
.id_table = oled_id,
.of_match_table = oled_of_match_table,

這部分表明該驅動支持的設備匹配方式,包括設備樹或設備 ID。

7.5.4oled_probe 函數中是驅動的核心邏輯:

字符設備注冊流程

alloc_chrdev_region(&devid, 0, 1, "oled");           // 1. 分配設備號
cdev_init(&i2c_cdev, &oled_fops);                   // 2. 初始化字符設備,并綁定 fops
cdev_add(&i2c_cdev, devid, 1);                      // 3. 添加到內核
class_create(THIS_MODULE, "oled_class");            // 4. 創建類
device_create(...);                                 // 5. 創建設備節點

oled_fops 是 file_operations 函數指針表:

struct file_operations oled_fops = {.open           = oled_open,.write          = oled_write,.release        = oled_release,.unlocked_ioctl = oled_ioctl,
};

各個函數含義:

函數作用
oled_open初始化硬件,調用 oled_hw_init(),內部通過 oled_write_cmd() 進行 I2C 配置 ,oled_clear():oled_write_cmd/oled_write_data;oled_pos(0,0):oled_write_cmd
oled_write向設備寫入數據,使用 copy_from_user() 獲取用戶數據,調用 OLED_ShowString() 顯示字符串(內部調用 OLED_ShowChar()oled_write_data()i2c_transfer()
oled_ioctl控制命令,調用 switch-case 來控制顯示等功能
oled_release關閉設備,釋放資源(或者打印日志)

7.6模塊卸載:

module_exit(oled_exit)

在卸載函數中調用:

i2c_del_driver(&oled_driver); // 卸載驅動

8.存儲器分類

8.1寄存器

8.2RAM

斷電之后,數據消失

  1. DRAM
  • 電腦的內存條
  • 靠電容存儲信息
  • 特點:容量大、成本低、需不斷刷新(動態)
  1. SRAM
  • CPU的多級緩存,cache
  • 靠門電路來存儲
  • 特點:速度快、功耗低、但價格貴、容量小,不需要刷新

8.3ROM

斷電之后,數據長久保存,主要用于固化程序,如 BIOS、啟動程序等。

  1. RAM
    最早期,不能寫 只能讀

  2. PROM
    可編程只讀存儲器(Programmable ROM)
    只能寫入一次數據

  3. EPROM
    可編程可擦除只讀存儲器(Erasable Programmable Read Only Memory)
    紫外線擦除
    需整塊擦除、再重新編程

  4. EEPROM
    帶電可擦可編程只讀存儲器(EEPROM)
    支持電擦除、反復寫入,但速率較慢

  • NorFlash
    一次可以讀取一個字,每個bit都可以被尋址
    優點:可直接執行代碼(XIP),讀速度快
    缺點:寫入速度慢、成本高

  • NandFlash
    優點:容量大、價格便宜,廣泛用于數據存儲
    應用:SSD、U盤、SD卡、eMMC
    eMMC:= NandFlash + 控制器 + 標準封裝接口(用于嵌入式系統)

分類子類特點或用途
RAMDRAM內存條,動態刷新,便宜
SRAMCPU緩存,不刷新,貴但快
ROMPROM只能編程一次
EPROM紫外線擦除
EEPROM電擦除,重復寫入,廣泛用于閃存
NorFlashXIP,讀取快
NandFlash寫入快、便宜、容量大(SSD、U盤等)
eMMC嵌入式存儲解決方案(手機、MCU等)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/906440.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906440.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906440.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習驅動下的目標檢測技術:原理、算法與應用創新(三)

五、基于深度學習的目標檢測代碼實現 5.1 開發環境搭建 開發基于深度學習的目標檢測項目&#xff0c;首先需要搭建合適的開發環境&#xff0c;確保所需的工具和庫能夠正常運行。以下將詳細介紹 Python、PyTorch 等關鍵開發工具和庫的安裝與配置過程。 Python 是一種廣泛應用于…

致敬經典 << KR C >> 之打印輸入單詞水平直方圖和以每行一個單詞打印輸入 (練習1-12和練習1-13)

1. 前言 不知道有多少同學正在自學C/C, 無論你是一個在校學生, 還是已經是上班族. 如果你想從事或即將從事軟件開發這個行業, C/C都是一個幾乎必須要接觸的系統級程序開發語言. 雖然現在有Rust更安全的系統級編程語言作為C/C的替代, 但作為入門, C應該還是要好好學的. C最早由B…

【Leetcode 每日一題】3355. 零數組變換 I

問題背景 給定一個長度為 n n n 的整數數組 n u m s nums nums 和一個二維數組 q u e r i e s queries queries&#xff0c;其中 q u e r i e s [ i ] [ l i , r i ] queries[i] [l_i, r_i] queries[i][li?,ri?]。 對于每個查詢 q u e r i e s [ i ] queries[i] quer…

[java八股文][Java虛擬機面試篇]垃圾回收

什么是Java里的垃圾回收&#xff1f;如何觸發垃圾回收&#xff1f; 垃圾回收&#xff08;Garbage Collection, GC&#xff09;是自動管理內存的一種機制&#xff0c;它負責自動釋放不再被程序引用的對象所占用的內存&#xff0c;這種機制減少了內存泄漏和內存管理錯誤的可能性…

ubuntu服務器版啟動卡在start job is running for wait for...to be Configured

目錄 前言 一、原因分析 二、解決方法 總結 前言 當 Ubuntu 服務器啟動時&#xff0c;系統會顯示類似 “start job is running for wait for Network to be Configured” 或 “start job is running for wait for Plymouth Boot Screen Service” 等提示信息&#xff0c;并且…

Android 手寫簽名功能詳解:從原理到實踐

Android 手寫簽名功能詳解 1. 引言2. 手寫簽名核心實現&#xff1a;SignatureView 類3. 交互層實現&#xff1a;MainActivity 類4. 布局與配置5. 性能優化與擴展方向 1. 引言 在電子政務、金融服務等移動應用場景中&#xff0c;手寫簽名功能已成為提升用戶體驗與業務合規性的關…

【nRF9160 常用prj.conf配置與AT指令介紹】

參考資料&#xff1a; 技術討論&#xff1a;Q群&#xff1a;542294007 nRF91 NCS SDK安裝工具與SDK安裝包等常用軟件下載地址 云盤下載&#xff1a;pan.olib.cn 一、nRF9160 常用prj.conf配置介紹 nRF9160通過prj.conf配置網絡模式為&#xff1a;CAT-M模式 CONFIG_LTE_NETWOR…

小型化邊緣計算設備

以下是關于小型化邊緣計算設備的核心技術與應用特點的綜合分析&#xff1a; 一、核心硬件平臺與算力表現? NVIDIA Jetson Orin系列? Jetson Orin Nano?&#xff1a;配備1024個CUDA核心和32個Tensor核心&#xff0c;支持高達100 TOPS的AI算力&#xff0c;適用于機器人、無…

css使用clip-path屬性切割顯示可見內容

1. 需求 想要實現一個漸變的箭頭Dom&#xff0c;不想使用svg、canvas去畫&#xff0c;可以考慮使用css的clip-path屬性切割顯示內容。 2. 實現 <div class"arrow">箭頭 </div>.arrow{width: 200px;height: 60px;background-image: linear-gradient(45…

Kotlin與物聯網(IoT):Android Things開發探索

在物聯網&#xff08;IoT&#xff09;領域&#xff0c;Kotlin 憑借其簡潔性、安全性和與 Java 生態的無縫兼容性&#xff0c;逐漸成為 Android Things 開發的有力工具。盡管 Google 已于 2022 年宣布停止對 Android Things 的官方支持&#xff0c;但其技術思想仍值得探索&#…

2025年AI搜索引擎發展洞察:技術革新與市場變革

引言&#xff1a;AI搜索的崛起與市場格局重塑 2024-2025年&#xff0c;AI搜索市場迎來了前所未有的變革期。隨著DeepSeek-R1等先進大語言模型的推出&#xff0c;傳統搜索引擎、AI原生搜索平臺以及各類內容平臺紛紛加速智能化轉型&#xff0c;推動搜索技術從基礎信息檢索向深度…

基于 ESP32 與 AWS 全托管服務的 IoT 架構:MQTT + WebSocket 實現設備-云-APP 高效互聯

目錄 一、總體架構圖 二、設備端(ESP32)低功耗設計(適配 AWS IoT) 1.MQTT 設置(ESP32 連接 AWS IoT Core) 2.低功耗策略總結(ESP32) 三、云端架構(基于 AWS Serverless + IoT Core) 1.AWS IoT Core 接入 2.云端 → APP:WebSocket 推送方案 流程: 3.數據存…

【LeetCode 熱題 100】有效的括號 / 最小棧 / 字符串解碼 / 柱狀圖中最大的矩形

??個人主頁&#xff1a;小羊 ??所屬專欄&#xff1a;LeetCode 熱題 100 很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~ 目錄 棧有效的括號最小棧字符串解碼每日溫度柱狀圖中最大的矩形 堆數組中的第K個最大元素 棧 有效的括號 有效的括號 cl…

Petalinux

Petalinux 命令 參考《UG 1157 PetaLinux Command Line Reference Guide》 //創建petalinux工程 petalinux-create -t project --template zynq -n <name> //配置工程 cd 上一步的工程 petalinux-config --get-hw-description ../xsa_folder///配置Linux內核 petalinux-…

【Qt】在OrinNX上,使用命令安裝qtmultimedia5-dev時報錯

1、問題描述 在OrinNX+Ubuntu20.04上,使用命令安裝qtmultimedia5-dev時報錯 sudo apt install qtmultimedia5-devThe following packages have unmet dependencies: qtmultimedia5-dev : Depends: libpulse-dev but it is not going to be installed E: Unable to correct p…

上肢康復機器人設計與臨床應用研究

引言 腦卒中、脊髓損傷等神經系統疾病導致的上肢運動功能障礙&#xff0c;嚴重影響了患者的生活質量。傳統康復治療依賴治療師手動輔助訓練&#xff0c;存在效率低、量化難、人力成本高等問題。上肢康復機器人通過精準的運動控制與生物反饋機制&#xff0c;為實現高效、標準化…

mysql不能聚合之數據清洗逗號

有時候因為數據庫不嚴謹導致了出現有些數字很奇怪例如這樣是varchar類型的字符串&#xff0c; 這種數據不能用來運算聚合&#xff0c;那么要怎么辦呢&#xff1f; 這樣就搞定 REPLACE(your_column, ,, )??&#xff1a;將字段中的逗號移除&#xff0c;例如將3,553,850.28轉換…

chrome 瀏覽器插件 myTools, 日常小工具。

1. 起因&#xff0c; 目的: 比如&#xff0c;chatgpt, google&#xff0c; 打開網頁&#xff0c;就能直接輸入文字&#xff0c;然后 grok 就不行&#xff0c;必須用鼠標點一下&#xff0c;才能輸入文字。 對我而言&#xff0c;是個痛點&#xff01;寫個插件&#xff0c;自動點…

outbox架構解說

Outbox 模式是一種用于實現數據一致性的架構模式&#xff0c;特別是在微服務架構中。 它確保在處理事務時&#xff0c;數據的原子性和最終一致性。 Outbox 模式的詳細解說&#xff1a; 1. 概念與背景 背景&#xff1a;在微服務架構中&#xff0c;一個操作可能涉及多個服務&…

噴涂噴漆機器人詳解

1. 定義 噴涂噴漆機器人是專為表面涂裝設計的自動化工業設備&#xff0c;通過精準控制實現高效、均勻的涂料噴涂。其核心價值在于提升生產效率、保障質量一致性&#xff0c;同時減少材料浪費及環境污染&#xff0c;廣泛應用于汽車、航空航天等領域。 2. 結構組成 機械臂&…