嵌入式Linux系统部署(构建中)
2018-01-03 21:18:35 15 举报
AI智能生成
如题,求赞
作者其他创作
大纲/内容
嵌入式Linux系统部署
面试题:谈谈对嵌入式Linux系统的认识
场景:开发板+电脑+一周的时间=开发板上跑linux系统
步骤
1.上位机搭建Linux开发环境
准备纯Linux系统或虚拟机
安装必要的软件
代码编辑
vim/vimplus/ctags/cscope/wine+sourceinsight
串口
kermit/minicom
网络烧录
tftpd-hpa
安装交叉编译器
交叉编译器的获得?
交叉编译器的获得?
从芯片厂家或开发板厂家获取
ARM相关交叉编译器的网站下载
利用自动化脚本工具crosstools-ng自己制作
自己下载gcc,linux内容源码,各种工具源码,自己编译制作
2.掌控下位机硬件信息
粗看
CPU
型号、厂家
内存
容量和内存的起始地址
可以问硬件工程师
闪存
容量和类型
可以问硬件工程师
类型
Norflash
Nandflash
emmc
外围接口
研发必须
UART
调试
网口
软件下载烧录
细看
法宝
原理图
芯片手册
首先看芯片原理图,明确芯片和CPU通信方式
然后看外设的芯片手册,关注读写操作时序和片内寄存器特性
最后看支持CPU和外设间通信的外设相关说明
先原理图
后芯片手册
3.下为佳不熟添加软件
明确下位机部署的软件是裸板程序还是基于操作系统的软件,本图是基于linux操作系统的
明确下位机运行linux系统所办喊的必要软件,至少三部分
bootloader
例如uboot,是一个裸板程序,类似于PC的BIOS
上电先运行,初始化CPU,关闭cache,初始化内存,关中断,关看门狗,初始化时钟,初始化闪存,初始化网卡
上电先运行,初始化CPU,关闭cache,初始化内存,关中断,关看门狗,初始化时钟,初始化闪存,初始化网卡
Linux启动后,生命周期结束
启动参数告诉Linux内核根文件系统位置
linux内核
操作系统内核,由bootloader启动,永远运行在内存
7大功能
内存管理子系统
内存映射分配销毁等
进程管理子系统
进程创建调度销毁
文件系统
系统调用
设备驱动
各种硬件驱动
网络协议栈
TCP/IP协议栈
平台相关代码
可以运行在不同的处理器架构的支持代码
根文件系统rootfs
/下的目录
系统软件启动流程
上电->CPU运行闪存上的uboot->uboot启动以后做硬件初始化,然后从闪存上读linux到内存,给linux内核传启动参数,用于找到根文件系统rootfs在哪->内核正式投入云行->uboot生命结束。
内核软硬件初始化,根据uboot传递参数,找rootfs,控制权交给rootfs,运行/sbin/init作为1号进程,创建子进程/bin/sh,启动shell。
4.向X6818部署嵌入式linux系统
获取部署软件
uboot.bin
uboot
uImage
内核的二进制镜像文件
rootfs_ext4.img
根文件系统的二进制文件
明确嵌入式开发模式
上位机通过网线和tftp烧写软件到下位机
将软件放到tftp目录
烧写3部分软件到闪存上前,先进行分区规划
例emmc
预留[0-512]B
隐藏分区
uboot[512-1024]B
mmcblk0p0
uImage[1-65]MB
mmcblk0p1
rootfs[66-819]MB
mmcblk0p2
剩余
mmcblk0p3
正式的下载烧写
emmc为例
emmc为例
烧写uImage
重启下位机进入uboot命令行
tftp 48000000 uImage
mmc write 48000000 0x800(起始扇区) 0x3000(扇区数)
mmc write 48000000 0x800(起始扇区) 0x3000(扇区数)
烧写rootfs_ext4.img
tftp 48000000 rootfs_ext4.img
mmc write 48000000 0x20800 0x32000
mmc write 48000000 0x20800 0x32000
烧写完毕,设置系统启动参数
在uboot命令行执行
设置内核位置,以便uboot加载内核到内存,然后启动内核
设置内核位置,以便uboot加载内核到内存,然后启动内核
setenv bootcmd mmc read 0x48000000 0x800 0x3000
saveenv
saveenv
了解
setenv bootcmd tftp 0x48000000 uImage \; bootm 0x48000000
在uboot命令行执行
设置启动参数
设置启动参数
setenv bootags root=/dev/mmcblk0p2 init=/linuxrc console=ttySAC0,115200 rootfstype=extra maxcpus=1 lcd=vs070cxn tp=gslx680-linux
saveenv
saveenv
root
根文件系统位置
init
启动的第一个脚本,脚本启动init,作为1号进程
console
调试串口设置
rootfstype
文件系统格式
maxcpus
只启动CPU0
lcd
LCD显示屏型号
tp
触摸屏型号
测试下位机linux是否正常启动
重启下位机
等待系统自行启动
屏上应看到正常的系统界面
非正常启动问题
下位机Linux无限重启
内核启动到最后找根文件系统失败
可能原因
rootfs_ext4.img没烧
再烧
分区无效
重新分区
解决
uboot下执行
fdisk 2 2 0x100000:0x4000000 0x4100000:0x2f20000
2
sd2
2
2个分区
a:b
起始地址:结束地址+1
重烧rootfs_external .img
5.案例:如何在下位机运行一个自己的应用程序?
利用NFS网络服务,下位机可以通过网络访问上位机目录
步骤
上位机安装NFS网络服务
上位机配置NFS网络服务器,添加共享目录
上位机创建共享目录,添加应用程序
上位机重启NFS网络服务
下位机的linux系统只需访问上位机的NFS网络服务
ifconfig检查网络配置
ifconfig eth0 ip地址
ping 上位机地址
mount -t nfs -o nolock 上位机地址:上位机共享目录 /mnt
-t
采用NFS网络服务
-o nolock
对共享目录访问无需锁定
/mnt
下位机对应目录
进入/mnt目录
运行程序
程序会被下载到内存运行
6.案例:让内核启动时到上位机找根文件系统
可以用NFS网络服务实现
步骤
上位机共享目录放置根文件系统
修改内核启动参数
bootargs
root=/dev/nfs nfsroot=上位机地址:上位机根文件系统路径 ip=下位机ip:上位机ip:网关ip:子网掩码 init=/linuxrc console=ttySAC0,115200
uboot
ubootpak.bin从何而来?
来自开源软件uboot
面试题:谈谈uboot的认识
uboot特点
德国denx开发小组维护的支持主流嵌入式架构
原名ppc,只支持powerpc
原名ppc,只支持powerpc
支持多种开发板
支持多种操作系统
支持多种文件格式
支持多种硬件外设
一个复杂的裸板程序
uboot三大功能
硬件初始化
初始化CPU的Cache
初始化时钟
初始化内存
初始化闪存
初始化UART
初始化网卡
关闭中断
避免中断打断启动过程
关闭看门狗
可选
LCD等
加载内核,并启动
传递启动参数给内核
uboot源码操作
从厂家获取
源码
交叉编译器
验证源码
编译
make distclean
make {chip}_config
make
可以-j
cat /proc/cpuinfo,看proccessor个数确定cpu核数
修改uboot
明确uboot编译链接脚本
make加上V=1
make加上V=1
运行入口函数
运行的第一个文件
内存起始地址
代码导读
起始文件start.s
从编译信息找到
reset
board_init_f
设备初始化
board_early_init_f
可以添加自定义初始化硬件的代码
board_init_r
flash_init
for norflash
nand_init
for nand
mmc_initial
for emmc
board_late_init
可以添加自定义初始化硬件的代码
main_loop
cli_loop
cli_simple_loop
shell
硬件配置信息
include/configs/*.h
ENV
SERIAL
。。。
调试
打印
uart为基础
开关灯
led等为基础
子主题
示波器
uboot移植实践
添加logo显示功能
原理
内存划分出显存
图片放显存里
小图片直接做成数组
可用image2lcd等工具
LCD控制器读显存
LCD控制LCD显示
0 条评论
下一页