BSP及嵌入式驱动开发笔记
第一讲嵌入式系统基本概念
以应用为中心,以计算机技术为基础,其软硬件可配置,对功能、可靠性、成本、体积、功耗有严格约束的一种专用系统,所用的计算机称为嵌入式计算机。
Linux目录文件
/bin :显而易见,bin 就是二进制(binary)英文缩写。
/boot :在这个目录下存放的都是系统启动时要用到的程序。在使用grub或lilo引导linux的时候,会用到这里的一些信息。
/dev:dev 是设备(device)的英文缩写。这个目录对所有的用户都十分重要。因为在这个目录中包含了所有linux系统中使用的外部设备。但是这里并不是放的外部设备的驱动程序。
/etc :etc这个目录是linux系统中最重要的目录之一。在这个目录下存放了系统管理时要用到的各种配置文件和子目录。我们要用到的网络配置文件,文件系统,x系统配置文件,设备配置信息,设置用户信息等都在这个目录下。
/sbin :这个目录是用来存放系统管理员的系统管理程序。
/home :如果建立一个用户,用户名是“jl”,那么在/home目录下就有一个对应的/home/jl路径,用来存放用户的主目录。
/lib :lib是库(library)英文缩写。这个目录是用来存放系统动态连接共享库的。几乎所有的应用程序都会用到这个目录下的共享库。
/mnt :这个目录在一般情况下也是空的。可以临时将别的文件系统挂在这个目录下。
/proc :可以在这个目录下获取系统信息。这些信息是在内存中,由系统自己产生的。
/root :如果用户是以超级用户的身份登录的,这个就是超级用户的主目录。
/tmp :用来存放不同程序执行时产生的临时文件。
/usr :这是linux系统中占用硬盘空间最大的目录。
Linux命令
1、ls、mkdir、rmdir、date、who 相对路径和绝对路径
2、文件解压命令
gzip *.jpg压缩 gzip –d *.gz解压
打包命令
.gz
解压1:gunzip FileName.gz
解压2:gzip -dFileName.gz
压缩:gzip FileName
打包
.tar.gz 和 .tgz
解压:tar zxvfFileName.tar.gz ./DirName
压缩:tar zcvfFileName.tar.gz DirName
.tar.bz2
解压:tar xjf FileName.tar.bz2 ./DirName
压缩:tar cjf FileName.tar.bz2 DirName
fdisk –l查看磁盘设备信息 fdisk –l /dev/sdb 查看磁盘设备信息如u盘
mount 挂载u盘和nfs
mount -t nfs 主机ip:共享目录 挂载点 mount -t nfs 192.168.1.4:/arm2410s /mnt
–onolock加文件锁 mount –t nfs –onolock 192.168.1.4:/home/test /mnt
mount –t msdos /dev/sdb1 mnt/usb u盘设备是/dev/sdb1 挂载到 /mnt/usb
mount -t vfat /dev/sdb1 /mnt/sdcard 挂载u盘
msdos文件系统参数 如fat32用vfat fat16用msdos ext用ext2
redhat-config-users查看用户
第2讲 嵌入式交叉开发环境
嵌入式linux开发流程
1、 建立开发环境
2、 配置开发主机,配置MINICOM(相当于Windows下的超级终端)
3、 建立引导装载程序bootloader
4、 下载别人已经移植好的linux操作系统
5、 建立根文件系统
6、 建立应用程序的flash分区
7、 开发应用程序
8、 烧写内核、根文件系统、应用程序
9、 发布产品
开发模式 交叉编译
• 宿主机(Host)是用来开发嵌入式软件的系统。指要安装虚拟机软件的计算机。
• 目标机(Target)是被开发的目的嵌入式系统。指arm设备。
• 交叉编译器(Cross-compiler)是进行交叉平台开发的主要软件工具。它是运行在一种处理器体系结构上,但是可以生成在另一种不同的处理器体系结构上运行的目标代码的编译器。
串口、网线
虚拟机里面的Linux系统、arm、PC
ftp在三者中都可以通,nfs为linux和linux系统之间通信,samba服务器是在linux和Windows之间通信,NFS可以将远程文件系统载入在本地文件系统下。
Redhat远程登录Windows
Windows远程登录linux 开启Windows和linux里面的telnet服务
虚拟机和本机网络连同步骤
1.关闭防火墙
2.网卡激活和设置
3.开启服务
4.设置为桥接方式
5.关掉无线网络
注意事项
1、VMwareVirtual Ethernet Adapter for VMnet1和redhat的ip要处在同一网段。
2、redhat里面网络设置
3、虚拟机的网络设置host-only
1BRIDGE:相当于主机和虚拟机连接到同一个hub上,虚拟机要和主机配置到同一网段上
2 NAT:使用vmnet8,主机开启必要的VMware服务,如vmvaredhcp,虚拟机设置成dhcp方式即可,当然也可以手工设置成vmnet1同一网段,比较麻烦
3HOST-ONLY:使用vmnet1,直接和主机互联,可以使用ifconfig查看配置情况
Linux里面常见的编辑编程工具Vi geditkwrite emacs kdevelop
第3讲 Linux下的c语言开发
交叉编译工具的安装
先将目录sharefile\ 中的arm-linux-gcc-3.3.2.tgz 、arm-linux-gcc-2.95.3.tgz和
arm-linux-gcc-3.4.1.tgz 拷贝到某个目录下如tmp\,然后进入到该目录,执行解压命令:
#cd \tmp
#tar xvzf arm-linux-gcc-3.3.2.tgz –C /
#tar xvzf arm-linux-gcc-2.95.3.tgz –C /
#tar xvzf arm-linux-gcc-3.4.1.tgz –C /
#mkdir –p/opt/FriendlyARM/QQ2440 ; 建立工作目录,备用
然后运行命令
#gedit /root/.bashrc
编辑/root/.bashrc 文件,在最后一行 export PATH=$PATH:/usr/local/arm/3.4.1/bin
(arm上编译,pc上编译)
1、 编写代码
2、 编译(双平台)
3、 执行
gcc的执行过程
使用gcc由C语言源代码文件生成可执行文件的过程要经历四个相互关联的步骤∶
1、预处理(也称预编译,Preprocessing)
——对头文件(include)、预编译语句(如define等)进行分析[预处理器cpp]
2、编译(Compilation)
——将预处理后的文件转换成汇编语言,生成文件.s[编译器ccl]
3、汇编(Assembly)
——由汇编变为目标代码(机器代码),生成.o的文件[汇编器as]
4、连接(Linking)
——连接目标代码,生成可执行程序[链接器ld]
-I用来指定头文件目录.
/usr/include目录一般是不用指定的,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上
- I myinclude参数了,如果不加你会得到一个“xxxx.h:No such file or directory”的错误。
eg.
-includefile
功能相当于在代码中使用#include
例子用法:
gcc -oexample example.c -include /usr/include/stdio.h
Makefile基本结构
target: prerequisites 依赖关系
Make工具及makefile文件概述
1、config 生成make文件
2、make 生成可执行文件
3、make install (文件先拷贝至系统路径)将文件安装至指定位置
4、make clean 清楚make产生的安装文件
Makefile实例:
#makefile开始
myprog:foo.obar.o
gccfoo.obar.o-omyprog
foo.o:foo.cfoo.hbar.h
gcc-cfoo.c-ofoo.o
bar.o:bar.cbar.h
gcc-cbar.c-obar.o
clean:
-rm *.o myprog
#makefile结束
环境变量:
a)存储文件名列表。
b)存储可执行文件名。
c)存储编译器标识。
d)存储参数列表。
使用环境变量后的makefile实例
=======makefile开始======
OBJS=foo.o bar.o
CC=gcc
CFLAGS=-Wall–O –g#-WALL开启警告信息–O优化–g可调试
EXEC=myprog
$(EXEC):$(OBJS)
$(CC) $(OBJS) –o $(EXEC)
foo.o:foo.c foo.hbar.h
$(CC) $(CFLAGS) –c foo.c –o foo.o
bar.o:bar.cbar.h
$(CC) $(CFLAGS)bar.c –o bar.o
========makefile结束=======
内部变量:
$@---扩展成当前规则的目的文件名
$<---扩展成依靠列表中的第一个依靠文件
$^ ---扩展成整个依靠的列表
Makefile变量
=====makefile开始======
OBJS =foo.o bar.o
CC = gcc
CFLAG=-Wall –O –g
myprog:$(OBJS)
$(CC) $^ -o $@
foo.o:foo.cfoo.h bar.h
$(CC) $(CFLAG) –c $< -o $@
bar.o:bar.cbar.h
$(CC) $(CFLAG) –c $< -o $@
======makefile结束=======
第4讲 bootloader与内核
Bootloader概念:就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
Bootloader的功能
1.硬件设备初始化(CPU的主频、SDRAM、中断、串口等)
2.内核启动参数
3.启动内核
4.与主机进行交互,从串口、USB口或者网络口下载映象文件,并可以对FLASH等存储设备进行管理
嵌入式系统最先执行的是bootloader
Bootloader的烧写方式
1.通过JTAG口
2.通过以太网口
3.通过串口
4.其中前两种方式比后一种快得多
Bootloader的操作模式
1.启动加载模式(产品发布)
2.下载模式(烧写系统)
Vivi一个bootloader,编译配置,常见的bootloader有vivi和uboot。
内核的裁减make menuconfig内核编译的结果是生成zImage文件
arch/arm/boot/zImage,可自解压的压缩内核的映像文件
构建根文件系统 ./mkyaffsimage root_nfs root.img
第5讲 驱动与QT
目前Linux 支持的设备驱动大体可分为三种:
字符设备(character device);如串口、触摸屏、并口、虚拟控制台、AD等。
块设备(block deivce);诸如磁盘,内存,Flash等。
网络接口设备(network interface)。eth0等。
块设设备与字符设备类似,块设备也是通过文件系统来进行访问,它们之间的区别仅仅在于内核内部管理数据的方式不同。
传统方式中的设备管理中,除了设备类型外,内核还需要一对称作主次设备号的参数, 才能唯一标识一个设备。
主设备号相同的设备使用相同的驱动程序,次设备号用于区分具体设备的实例。
为该模块建立一个设备节点。主设备号指某一类设备次设备号指某一个设备。
命令: mknod /dev/tsc 254 0
其中/dev/ts表示我们的设备名是ts,“c” 说明它是字符设备,“254” 是主设备号,“0” 是次设备号。
一旦通过mknod 创建了设备文件,它就一直保留下来,除非我们手工删除它。
Linux驱动编译和加载方式
一种是直接编译到内核,当内核启动之后,新的驱动程序随之运行;
二是编译为模块,动态加载运行。
对模块操作需要使用module-utiles:
insmod将编译的模块直接插入内核
rmmod从内核中卸载模块
lsmod显示已安装的模块
驱动程序与应用程序的区别
应用程序一般有一个main 函数,从头到尾执行一个任务;
驱动程序却不同,它没有main 函数,通过使用宏module_init(初始化函数名),将初始化函应用程序可以和GLIBC库连接,因此可以包含标准的头文件,比如
在驱动程序中是不能使用标准C 库的,因此不能调用所有的C库函数, 只能调用内核的函数
Qt是挪威Trolltech公司出品的一个跨平台的C++图形用户界面库。
考试
选择 20
填空 20
指令操作 20
编程 20
分析 20