嵌入式系统考点
文章目录
linux系统命令
1. Ctrl+Alt+T:进入terminal终端
2. cd命令
用于切换当前目录,它的参数是要切换的目标路径,可以是绝对路径,也可以是相对路径。如:
cd / #返回至根目录
cd .. #返回上一级目录
cd ../.. #返回上两级目录
cd /home/at91sam9g45 # 切换到目录 /home/at91sam9g45
cd path # 切换到当前目录下的path目录中,“.”表示当前目录(可省略)
cd ../path # 切换到上层目录中的path目录中,“..”表示上一层目录
3. ls:用于查看文件与目录
ls -l:列出文件详细信息l(list)
4. mkdir 目录名称:创建目录
5. rm 文件名称:删除该文件
6. rm -r (路径)目录名或文件名:递归删除,可删除子目录及文件
7. rm -rf (路径)目录名或文件名:递归强制删除目录或文件
8. mv:移动文件或者重命名
e.g. mv 4.4.3 4.4 #将4.4.3重命名为4.4
mv * ../ #移动当前目录下所有文件至上一级目录
mv /usr/local/arm/4.4 /usr/local/arm/4.4.3
9. pwd:显示当前目录
10. ifconfig:查看网络情况
11. ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up :配置网络IP地址
12. clear:清屏
13. reboot:重启
14. tar -xvf (文件路径)名称:解压压缩包到指定路径下
15. tar -cvf 压缩包名称 待压缩目录或文件 :压缩目录或者文件到当前目录下
16. cp:拷贝文件
e.g. cp at91sam9g45/* . -rf #将子目录at91sam9g45下所有文件拷贝至当前目录
cp /mnt/hgfs/share_vm/at91sam9g45.tar.gz . #拷贝源码包至当前路径
17. gedit (文件路径)名称:图形编辑该文件
18. source (文件路径)名称:让该文件生效
e.g. source /etc/profile #让更改后的profile文件生效
19. mount -t nfs -o nolock 192.168.1.8:/d/share_vm /mnt/nfs
用nfs文件系统将PC机的d:\share_vm(即nfs的共享目录)临时性地挂载到目标板的/mnt/nfs目录下
20. make menuconfig:菜单化定制
21. make clean:清除以前的编译结果及中间过程
22. arm-linux-gcc -v:查看交叉编译器版本信息
常用的u-boot命令
- 获取帮助
命令:help 或 ?
功能:查看当前U-boot版本中支持的所有命令。 - 环境变量(environment variables)与相关指令
环境变量 解释说明
bootargs 传递给Linux内核的启动参数(console=ttyS0,115200 root=/dev/mtdblock2)
serverip TFTP服务器端(即电脑host)的IP地址
ipaddr 板子(target)在u-boot下的IP地址,便于tftp下载文件使用
命令使用:
(1) printenv:打印当前系统环境变量
(2) setenv:设置环境变量
格式为:setenv name value
第1个参数是环境变量的名称。
第2个参数是要设置的值,如果没有第2个参数,表示删除这个环境变量。
e.g:setenv ipaddr 192.168.1.99
(3) saveenv:将环境变量保存在NandFlash中 - 网络命令
(1) ping:测试网络是否通了
格式为:ping 192.168.1.8 (对方IP),若显示host 192.168.1.8 is alive则表示网络已连通
(2) tftp
格式为:tftp 目标板DRAM地址 文件名
e.g. tftp 72000000 uImage2638
意义:将位于tftp服务器Base Directory下的uImage2638文件通过网线传到板子DRAM的72000000开始位置 - NandFlash操作指令
(1) nand read addr(DRAM) offset size
意义:NandFlash读取命令,从NandFlash的offset偏移地址处起读取size字节的数据到DRAM的addr开始地址
(2) nand erase offset size
意义:NandFlash擦除命令,擦除NandFlash的offset偏移地址处起的size字节数据
e.g. nand erase A0000 300000
解析:擦除NandFlash的自A0000起的3MB空间
(3) nand write addr(DRAM) offset size
意义:NandFlash烧写命令,将DRAM处自addr地址起的size字节数据烧写到NandFlash的offset偏移地址
e.g. nand write 72000000 A0000 300000
解析:将DRAM72000000地址开始的3MB数据写入NandFlash的A0000偏移地址
(4) nand info
意义:显示NandFlash信息 - re:重启板子
重要的定义
交叉编译器
交叉编译器(Cross-compiler)是进行交叉平台开发的主要软件工具。它是运行在一种处理器体系结构上,但是可以生成在另一种不同的处理器体系结构上运行的目标代码的编译器。
交叉编译
交叉编译是在一个平台上生成另一个平台(体系结构不同)上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
根文件系统
根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。
嵌入式系统的分层结构
嵌入式系统分为4层,硬件层、驱动层、操作系统层和应用层。
串口驱动开发的一般方法
-
保存原先串口配置,使用tcgetattr(fd,&oldtio)函数
struct termios newtio,oldtio;
tcgetattr( fd,&oldtio ); -
激活选项有CLOCAL和CREAD,用于本地连接和接收使能。
newtio.c_cflag | = CLOCAL | CREAD; -
设置波特率,使用函数
cfsetispeed、 cfsetospeed
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200); -
设置数据位,需使用掩码设置。
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8; -
设置奇偶校验位,使用c_cflag和c_iflag。
设置奇校验:
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
设置偶校验:
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
-
设置停止位
通过激活c_cflag中的CSTOPB实现。若停止位为1,则清除CSTOPB,若停止位为2,则激活CSTOPB。
newtio.c_cflag &= ~CSTOPB; //1位停止位 -
设置最少字符和等待时间,对于接收字符和等待时间没有特别要求时,可设为0。
newtio.c_cc[VTIME] = 0; //等待超时n*100ms
newtio.c_cc[VMIN] = 0; //最少接收字符数
① C_CC[VTIME]=0 && C_CC[VMIN]=0
read()立即返回。若有可读取的数据时,则读取数据并返回实际字节数,否则读取失败并返回0.(等同于非阻塞方式打开串口)
② C_CC[VTIME]=0 && C_CC[VMIN]>0
read()会等待到有C_CC[VMIN]个字节数可以被读取,否则一直处于阻塞状态。
③ C_CC[VTIME]>0 && C_CC[VMIN]=0
两种情况:a 有数据可读时,read()返回实际读到的字节数;
b 在C_CC[VTIME] *
100ms时间内,没有一个字节数据可读, read()返回0。
④ C_CC[VTIME]>0 && C_CC[VMIN]>0
收到第一个字符开始启动计时器,每收到一个字符,计时器清零,当计时器超过C_CC[VTIME] * 100ms后系统认为一包数据接收完毕, read()返回实际字节数;收到C_CC[VMIN]个字符,
read()返回C_CC[VMIN]
- 处理要写入的引用对象
tcflush函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)或输出缓存(用户程序已经写,但尚未发送)。
int tcflush(int filedes, int queue )
queue数应当是下列三个常数之一:
• TCIFLUSH 刷清输入队列。
• TCOFLUSH 刷清输出队列。
• TCIOFLUSH 刷清输入、输出队列。
如:tcflush(fd,TCIFLUSH); - 激活配置。在完成配置后,需激活配置使其生效。使用tsettattr()函数。原型:
int tcgetattr(int filedes, struct termios * termptr);
int tcsetattr(int filedes, int opt, const struct termios * termptr);
tcsetattr的参数opt使我们可以指定在什么时候新的终端属性才起作用。opt可以指定为下列常数中的一个:
• TCSANOW 更改立即发生。
• TCSADRAIN 发送了所有输出后更改才发生。若更改输出参数则应使用此选择项。
• TCSAFLUSH 发送了所有输出后更改才发生。更进一步,在更改发生时未读的所有输入数据都被删除(刷清)
使用如:tcsetattr(fd,TCSANOW,&newtio)
socket开发和三次握手
- 第一次握手:请求连接
- 第二次握手:接收连接
- 第三次握手:请求服务器服务,同时发送数据
APP(应用)的开发方法
man手册查找各种命令的使用方法及头文件,在ubantu->#man fread
- 1 -Commands available to users 一般普通的用户命令
- 2 - Unix and C system calls 系统调用命令,可查找需要的头文件
- 3 - C library routines for C programs C库函数命令,如printf fread (stdxxx.h)
- 4 - Special file names 特殊文件,指/dev下的设备文件
- 5 - File formats and conventions for files used by Unix 文件的格式
- 6 - Games 留给游戏用的
- 7 - Word processing packages 附件+全局环境变量
- 8 - System administration commands and procedures 只能由root使用的管理命令
注意:man手册只能查找用户空间的函数及命令,不能查找内核空间的。
交叉编译:arm-linux-gcc –o execfile file.c
查看依赖的库:arm-linux-readelf –a execfile |grep NEEDED
调试方法:nfs/tftp->target->printf 或 GDB
tftp –g –r led_app 202.204.100.1 (busybox里面的tftp)
设备驱动的Hello World模块
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");//软件驱动开发的许可证,不写则显示内核被污染限定变量或函数作用域,该函数只能在这个.C文件可见
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello world\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT " Hello world exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE()—模块许可证声明(必须):
模块许可证(LICENSE)声明描述内核模块的许可权限
如果不声明LICENSE,模块被加载时,将收到内核被污染(kernel tainted)的警告
许可证类型包括:“GPL”、 “GPL v2”、 “GPL and additional rights”、 “Dual BSD/GPL”、“Dual MPI/GPL”、 “Proprietary”
MODULE_LICENSE()—模块许可证声明(必须):
模块许可证(LICENSE)声明描述内核模块的许可权限
如果不声明LICENSE,模块被加载时,将收到内核被污染(kernel tainted)的警告
许可证类型包括:“GPL”、 “GPL v2”、 “GPL and additional rights”、 “Dual BSD/GPL”、“Dual MPI/GPL”、 “Proprietary”