阶段总结一:Part1-Part7知识梳理、总结

Part 1~7要求掌握的知识/能力
① 掌握ubuntu常用操作
② 掌握在ubuntu下开发单片机程序,跟STM32的开发有一个对比
③ 掌握u-boot的使用(无需了解代码,但是要会编译、烧写u-boot)
④ 掌握Linux内核的配置、编译、烧写
⑤ 掌握文件系统的结构,会烧写我们构建好的文件系统(不要求会自己编译)
⑥ 编写LED驱动、编写按键驱动
来源自下面链接

http://wiki.100ask.org/Jz2440VideoStudyGuide

①② 对应文章:Part1~Part3
③④⑤ 对应文章:Part5~Part7
下面按①~⑤顺序梳理总结知识点
第一部分:①②
1. 掌握Ubuntu常用操作
换句话说,是要求能在Linux环境掌握一些基本操作
这些基本操作有:
1)环境安装与配置
VMWare
2)基本Shell命令
2.1)入门命令:pwd ls file mkdir rmdir rm touch cat/less/more/tail,即文件和目录的增删改查CURD
2.2)  进阶命令:find  grep  gzip  bzip2 tar which  whereis  即高级的查找/搜索及压缩解压缩
2.3)Vi基本操作:
	0)修改配置文件:cp /etc/vim/vimrc  ~/.vimrc
		可在.vimrc末尾添加一些配置:如 set number 永久显示行号(临时的,可在命令行模式:set nu)
		set ignorecase 搜索时不区分大小写 set hlsearch 搜索时高亮显示等
	1)三种模式:一般模式、命令行模式、编辑模式
	2)进入编辑模式:i  o O 等
	      一般模式下: 复制nyy  粘贴:p  撤销:u  删除:ndd
	      			    定位某行:xgg(最后一行:shift+g,即G)
	      			    定位某列:fx(向前查找字符x)  0(行首字符) $(行尾字符)
	      			    光标移动:hjkl
	      命令行模式:查找/pattern ?pattern, 可用n/N重复向下/向上查找 
	      			    替换::%s/源字符/替换字符/g,字符可用通配符%
	      				(s:是替换的缩写,g是global缩写,全局替换,此外还要c:confirm替换前需确认)
	      			    保存并退出::wq   q! q  w 
2. 掌握在ubuntu下开发单片机程序,跟STM32的开发有一个对比
Ubuntu下开发单片机要求:
1)使用GNU编译工具及ARM的交叉编译工具
gcc、Makefile、arm-linux-gcc/ld   arm-linux-objcopy   arm-linux-objdump
2)Makfile文件编写
核心三要素: 
	目标文件:依赖文件 
	  [Tab]命令
变量:普通变量(= += := ?=)   伪变量(如.PHONY: clean)
通配符: $@(目标文件)  $<(第一个依赖文件) @^(所有依赖文件)  %(匹配任意一个或多个字符)
函数: wildcard  foreach filter  patsubst

重要的问题:如何自动生成依赖文件并包含进Makefile

3)window下的工具
查看/编写源码: Source Insight 、 Notepad++
阅读二进制:UltraEdit
文件传输:FileZilla
烧写工具:烧写器:oflash    USB:DNW
终端工具:MobaXterm
在S3c2440点亮一个LED实际跟单片机程序没啥区别,区别在于不同平台使用的工具不同
硬件操作:1)看原理图  2)看手册  3)编程
平台工具:单片机:Keil等其它封装了很多细节,不推荐
	  S3C2440: GNU工具(解开window下工具封装的细节)、make工具(Makefile编写)
第二部分:③④⑤
2.1 掌握u-boot的使用(无需了解代码,但是要会编译、烧写u-boot)
u-boot使用:
1)使用u-boot烧写根文件系统、内核等bin程序
2)掌握u-boot的打补丁、编译、烧写
	打补丁 patch  -px < 补丁文件
	编译:make  s3c24x0_config -->make menuconfig --->make
2.2 掌握Linux内核的配置、编译、烧写
1) 配置:三种方法
	1)make menuconfig  从头到尾配置
	2)在默认配置基础上再修改,即 make s3c24x0_defconfig --> make menuconfig
	3) 使用厂家提供的配置文件 : cp  config_ok  .config  覆盖.config文件即可
2)编译:make (备注:如果想生成内核头部,可执行make uImage)
3)  烧写:使用u-boot + DNW
2.3 掌握文件系统的结构,会烧写我们构建好的文件系统(不要求会自己编译)
最小文件系统的五大组成:
1)编译busybox, 查看busybox的INSTALL文件的三步走安装
2)/dev/console  /dev/null   通过mknod /dev/console  c 5 1   mknod /dev/null c 1 3创建
3)/etc/inittab  里面内容为: console::askfirst:-bin/sh
4) 复制glibc的动态库到/lib    mkdir  lib   cp *.so* /first_drv/lib -d (记得-d)
5)配置文件中指定的程序。 没用到,可先忽略
最后,通过制作yaffs工具以制作yaffs2类型的文件系统映像文件

在最小根文件系基础上的几点完善:
1)(手动/自动)挂载文件系统(proc  sysfs等)
	手动: mount -t proc none /proc (前提:mkdir /proc)
	自动:
	方法一:
		1)在 /etc/inittab文件新增
			::sysinit:/etc/init.d/rcS
		2)创建/etc/init.d/rcs, rcS内容如下
			mount -t proc none /proc
		3) sudo chmod +x /etc/init.d/rcS
	方法二:
		1)在方法1创建的init.d/rcS文件内容修改为:
			mount -a      # 将挂载/etc/fstab下的文件系统
		2)创建/etc/fstab,内容为
			proc  /proc  proc defaults 0  0
2)自动创建设备节点(mdev机制)
	1) 创建sys目录,且修改/etc/fstab配置文件,如下
		proc  /proc proc defaults 0 0
		sysfs /sys  sysfs defaults 0 0
		tmpfs /dev tmpfs defaults 0 0
	2) 修改/etc/init.d/rcS 内容如下
		mount -a
		mkdir /dev/pts
		mount -t devpts devpts /dev/pts
		echo /sbin/mdev > /proc/sys/kernel/hotplug
		mdev -s
3)使用NFS
	两种方法:
	方法一: 修改u-boot的参数bootargs(会传给内核), 可参考内核的Documents下的nfsroot.txt
	方法二:1)开启服务器段的nfs服务,即修改/etc/exports文件,新增一个可被挂载的目录,
				再重启nfs服务(sudo /etc/init.d/nfs-kernel-service restart)
			2)单板去挂载:mount -t nfs -o nolock 服务器ip:要挂载的文件系统目录路径 /mnt(前提:mkdir /mnt)
以上几点完善更详细解释可参考《嵌入式Linux应用开发完全手册》	
2.3 编写LED驱动、编写按键驱动
驱动编写 = 软件框架  + 硬件操作
软件框架:
file_operations --->
入口函数(led_init)中注册register_chrdev---->modul_init(入口函数) 告诉内核驱动的入口函数
卸载函数(led_exit)中unregister_chrdev ---->module_exit(卸载函数) 告诉内核驱动的卸载函数

file_operations---->结构体里面有很多函数指针,执行驱动函数,如open、read、write
入口函数注册/卸载---->实际在内核维护的一个字符设备数组中插入/删除对应的file_operations结构体
另外:注意使用MODULE_LICENSE("GPL") 声明为GPL认证,避免报错出现udefined led_init  led_exit等。
		我的理解是GPL认证能够标识和允许自定义的驱动入口函数
硬件操作:
	1)看原理图,确定操作对象(如引脚、芯片等)
	2)看手册,确定如何操作(如硬件初始化、数据收发/读写)
	3)编程,一定要先理清编程思路及代码组织方式

备注一下:我在Part7文章并没实现按键驱动,它和LED只是硬件操作不同,按键驱动可用查询/中断

驱动编写涉及的命令:
	1)挂载一个设备节点: mknod /dev/xxx c 主设备号 次设备号
	2)插入驱动模块:insmod xxx.ko  
	3)  显示已插入的模块:lsmod
	4)删除已插入的模块:rmmod  模块名称  (可先lsmod查看)
	5)查看字符/块设备:cat /proc/devices
	6)挂载一个文件系统:mount -t  proc /proc 
	7)挂载NFS
驱动编写涉及的知识补充/拓展:

VFS:虚拟文件系统,概念引用下百科		
> VFS(virtual File System)的作用就是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统,
> 即为各类文件系统提供了一个统一的操作界面和应用编程接口
具体来说:FS是一个可以让open()、read()、write()等系统调用不用关心底层的存储介质和文件系统类型
就可以工作的粘合层。
对VFS的详解可参考:https://blog.youkuaiyun.com/jinking01/article/details/90669534

proc与 sysfs两个VFS:
proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据
的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,
如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。
如lsmod 实际 是 /proc/modules的别名

系统/sys为系统状态映射文件所在的目录。“sysfs"是一个虚拟文件系统(类似proc文件系统),用于将系统中的
设备组成层次结构,并向用户模式程序提供详细的内核数据结构信息
sysfs的详解请参考:https://www.cnblogs.com/guojun-junguo/p/9892129.html

xxx.ko  是啥?
.ko文件是kernel object文件(内核模块),该文件的意义就是把内核的一些功能移动到内核外边, 需要的时候
插入内核,不需要时卸载。即具有“热插拔”特性
解读下生成xxx.ko的Makefile文件,如下
  1 KERN_DIR = /work/system/linux-2.6.22.6
  2
  3 all:
  4     make -C $(KERN_DIR) M=`pwd` modules
  5
  6 clean:
  7     make -C $(KERN_DIR) M=`pwd` modules clean
  8     rm -rf modules.order
  9
 10 obj-m   += first_drv.o
当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;
M=$(PWD) 的M不是makefile的选项,是内核根目录下的Makefile中使用的变量。
在内核根目录的Makefile有这样一句话:# Use make M=dir to specify directory of external module to build
 表明执行M指定目录的Makefile文件以生成外部模块(这里是first_drv)
obj-m += xxx.o即表示xxx作为模块编译(这是内核根目录下的Makefile的定义,此外还有obj-y直接编译,obj-$(xxx)条件编译),
	即执行make modules时才会被编译。
总言之,这个Makfile文件指定了先去执行KERN_DIR目录下的Makefile文件,后返回当前目录以生成modules目标,最终生成的
	modules目标会指向first_drv.o
参考自:https://blog.youkuaiyun.com/qq_34743935/article/details/87183377
	      http://bbs.100ask.net/question/13993(讲解kconfig、Makefile、.config三种关系,很不错的教程)

总结来说,第一阶段重点在后面的构建根文件系统和编写第一个驱动程序。当然第一阶段也遗留了很多
问题,如u-boot如何启动内核?根文件系统的内部实现?等等,这些将在后面的文章进行讲解。
下一阶段目标

掌握Linux驱动基本技能
① 掌握裸机重定位(这有助于后续理解u-boot)
② 掌握裸机中断处理流程
③ 掌握Linux异常、中断处理体系
④ 编写Linux下的按键驱动程序
⑤ 掌握Linux中驱动和应用程序的交互方式:查询、中断-唤醒、poll、异步通知
我个人挺认同这种学习流程/顺序的。即先体验整个体系的开发,以明确学习大纲。其次再从各个模块入手。
这种方式能让嵌入式学习体系更具有框架性、可拓展性、完整性。因此我选择90%都会选择的学习顺序。

加油!不断总结 + 自检 + 温习。很喜欢的一句话==> "一天有一天的美好啊 : ) "
----------------------------------END---------------------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值