嵌入式系统复习提纲1.docx
《嵌入式系统复习提纲1.docx》由会员分享,可在线阅读,更多相关《嵌入式系统复习提纲1.docx(24页珍藏版)》请在冰豆网上搜索。
嵌入式系统复习提纲1
嵌入式系统复习提纲
嵌入式系统的基本概念
嵌入式交叉编译平台及工具
嵌入式应用软件及程序设计
一、嵌入式基本概念:
●嵌入式系统定义:
嵌入式系统是以应用为中心,以计算机技术为基础,且软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
它一般由以下几部分组成:
嵌入式微处理器,外围硬件设备,嵌入式操作系统,特定的应用程序
特点:
应用的特定性和广泛性,技术、知识、资金的密集性,高效性,较长的生命周期,高可靠性,软硬一体,软件为主,无自举开发能力。
三要素:
嵌入、专用、计算机。
●ARM微处理器的类型
●嵌入式应用系统的硬件结构
●ARM9的流水线结构
●S3C2440的引脚分类
●S3C2410应用系统的AD处理器功能可以提供多达个引脚输入,AD转换精度可达位。
●S3C2410的中断控制寄存器类型以及工作模式
二、主要命令使用
Cp,mv,tar,cd,ls,mkdir,man,pwd,rm,mount,chmod,find,gzip,ifconfig,ping
三、Linux的目录结构
/bin:
存放系统所需要的那些命令,比如ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的、普通用户可以使用的命令。
/boot:
这是Linux的内核及引导系统程序所需要的文件目录,比如initrd.img等文件都位于这个目录中,grub系统引导管理器也位于这个目录。
/dev:
设备文件存储目录,比如声卡、磁盘。
/etc:
系统配置文件的所在,一些服务器的配置文件也在这里;比如用户帐号及密码配置文件。
/home:
普通用户目录默认存放目录。
/lib:
库文件存放目录
/lost+found:
当系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。
当系统启动的过程中fsck公交会检查这里,并修复已经损坏的文件系统。
/mnt:
这个目录是用于存放挂载储存设备的挂载目录的。
比如有cdrom等目录。
/etc/fatab
/opt:
表示的是可选择的意思,有些软件包也会被安装在这里,也就是自定义软件包。
/proc:
操作系统运行时,进程信息及内核信息存放在这里。
proc并不是真正的文件系统,它的定义可以参见/etc/fstab
/root:
linux超级权限用户root的目录。
/sbin:
大多是涉及系统管理的命令的存放,是超级权限用户root的可指向命令存放地,普通用户无权限执行这个目录下的命令,这个目录和/usr/sbin;/usr/local/sbin目录是相似的。
凡是目录sbin中包含的都是root权限才能执行的。
/tmp:
临时文件目录,有时用户运行程序的时候,会产生临时文件。
这个目录和/var/tmp目录相似。
/usr:
这个是系统存放程序的目录,比如命令、帮助文件等。
当我们安装一个linux发行版官方提供的软件包时,大多安装在这里。
如果有涉及服务器配置文件的,会把配置文件安装在/etc目录中。
/usr目录下包括设计字体目录/usr/share/fonts,帮助目录/usr/share/man或/usr/share/doc,普通用户可执行文件目录/usr/bin或/usr/local/bin;超级权限用户root可执行命令存放目录,比如/usr/sbin或/usr/local/sbin等,还有程序的头文件存放目录/usr/include
/var:
这个目录的内容是经常变动的,/var下有/var/log这是用来存放系统日志的目录。
/var/lib用来存放一些库文件,比如MySQL的。
/media:
本目录是空的,是用于挂载的。
/srv:
一些服务需要访问的文件存放在这
/sys:
系统的核心文件
/cdrom:
光驱
一些重要的子目录
/etc/init.d:
这个目录是用来存放系统或服务器以SystemV模式启动的脚本。
/etc/X11:
这是X-Window相关的配置文件存放地。
/usr/bin:
这个目录是可执行程序的目录,普通用户就有权限执行;当我们从系统自带的软件包安装一个程序时,他的可执行文件大多会放在这个目录。
/usr/sbin:
这个目录也是可执行程序的目录,但大多存放设计系统管理的命令,只有root权限才能执行。
/usr/local:
这个目录一般是用来存放用户自编译安装软件的存放目录;一般是通过源码包安装的软件,如果没有特别指定安装目录的话,一般是安装在这个目录中。
/usr/share:
系统共用的东西存放地。
/usr/src:
内核源码存放的目录。
●五、
●Linux操作系统设备驱动的分类分为:
字符类设备、块设备、网络设备;1)字符设备char:
按键,LED等,通常是顺序读写可以像文件一样被访问不需缓存BUFFER,数据由应用程序直接传递给对应的驱动程序管理方式是为操作提供方便。
2)块设备block:
FLASH,DOC等,可以像文件一样被访问,应用程序对其操作要经过系统的缓冲区,即间接传递给驱动程序处理,管理方式是为系统的存储提供优化。
3)网络设备
Linux中Makefile包括以下内容:
(1)需要由make工具创建的项目,通常是目标文件和可执行文件。
通常使用“目标(target)”一词来表示要创建的项目。
(2)要创建的项目依赖于哪些文件。
(3)创建每个项目时需要运行的命令。
●设备驱动程序的基本结构:
(1)驱动程序的注册与注销。
(2)设备的打开与释放。
(3)设备的读写操作。
(4)设备的控制操作。
(5)设备的中断和轮询处理
●字符设备的基本结构图:
四、实验操作部分
●Vi编辑器,包括vi编辑器的几种模式,保存,退出等命令的使用
●Gcc编译器:
包括四种编译阶段,各个阶段所针对的文件后缀等
●Gdb,包括gdb各种命令的使用
●windows环境下超级终端的配置以及LINUX操作系统中minicom的配置步骤。
●简述Linux环境下NFS的配置步骤
●Linux环境下TFTP的配置步骤
●简述busybox安装编译过程
●制作yaffs2文件系统的步骤
●LINUX文件系统中makefile一般应包含那些内容
●Bootloader的在嵌入式系统中基本作用?
●安装U-boot的过程
●安装编译交叉编译器的步骤
五、程序
(一)Makefile编写程序
1)edit:
main.okbd.ocommand.o//定义目标文件edit和源文件main.o等
gcc-oeditmain.okbd.ocommand.o//定义edit的编译方法
main.o:
main.cdefs.h//定义目标文件main.o和源文件main.cdefs.h
gcc-cmain.c//定义main.o的编译方法
kbd.o:
kbd.cdefs.hcommand.h//定义目标文件kbd.o和源文件
gcc-ckbd.c//定义kbd.o的编译方法
command.o:
command.cdefs.hcommand.h//定义目标文件command.o和源文件
gcc-ccommand.c
clean:
//定义伪目标
rmeditmain.okbd.ocommand.odisplay.oinsert.o//删除目标文件
2)CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc//定义gcc
LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld//定义ld
CFLAGS=-I/HHARM9-EDU/kernel/include/linux-Wall//定义编译选项
led.o:
led.c//定义目标和源文件
$(CC)$(CFLAGS)-gled.c-oled//编译方法
cpled.o/-f//复制led.o到/
.PHONY:
clean//定义伪目标
clean:
//定义clean
-rm-f*.o//删除中间文件
(二)字符类设备的驱动程序
1)staticstructfile_operationskeybd_fops={
open:
keybd_open,
read:
keybd_read,
release:
keybd_release,};//
intkeybd_open(structinode*inode,structfile*filp)//
{printk("openok\n");
return0;}
ssize_tkeybd_read(structfile*fp,char*buf,//
size_tsize)
{……}
intkeybd_release(structinode*inode,structfile*filp)//
{printk("releaseok\n");//
return0;}
ssize_tled_write(structfile*fp,char*buf,//
size_tsize)
{……}
int__initkeybd_init(void)//
{……}
staticvoid__exitkeybd_exit(void)//
{devfs_unregister(devfs_keybd);}//
module_init(keybd_init);//
module_exit(keybd_exit);//
附录:
示例1LED灯的驱动程序:
/*driver/char/led.c
*thisisaledchardevicedriver.
*Anyproblemplscontactsupport@*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"led_ioctl.h"
#defineLED_MAJOR139
#defineLED_2(LED_1+1)
#defineLED_3(LED_1+2)
#defineLED_4(LED_1+3)
#defineLED_5(LED_1+4)
#defineLED_6(LED_1+5)
#defineled_sle(*(volatileunsignedlong*)LED_GPACON)
#defineled_sle_data(*(volatileunsignedlong*)LED_GPADATA)
devfs_handle_tdevfs_led;
unsignedlongLED_1;
unsignedlongLED_GPACON;
unsignedlongLED_GPADATA;
unsignedlongled_write_addr;
intled_open(structinode*,structfile*);
intled_release(structinode*,structfile*);
intled_ioctl(structinode*,structfile*,unsignedint,unsignedlong);
ssize_tled_read(structfile*,char*,size_t);
ssize_tled_write(structfile*,char*,size_t);
staticstructfile_operationsled_fops={
open:
led_open,
read:
led_read,
write:
led_write,
ioctl:
led_ioctl,
release:
led_release,
};
/**Open/closecodeforrawIO.*/
intled_open(structinode*inode,structfile*filp)
{
led_sle|=0x2000;//chip_selectenable
led_sle_data&=(~0x2000);//0-->chip_select
printk("openok\n");
return0;
}
ssize_tled_read(structfile*fp,char*buf,size_tsize)
{
return1;
}
ssize_tled_write(structfile*fp,char*buf,size_tsize)
{
charkey;
if(get_user(key,buf))
return-EFAULT;
(*(volatileunsignedchar*)led_write_addr)=key;
return1;
}
intled_release(structinode*inode,structfile*filp)
{
//led_sle&=(~0x2000);//chip_selectdisable
//led_sle_data|=0x2000;
printk("releaseok\n");
return0;
}
intled_ioctl(structinode*inode,structfile*flip,unsignedintcommand,unsignedlongarg)
{
interr=0;
switch(command){//judgewhichledwanttolight
caseIOCTRL_LED_1:
led_write_addr=LED_1;
break;
caseIOCTRL_LED_2:
led_write_addr=LED_2;
break;
caseIOCTRL_LED_3:
led_write_addr=LED_3;
break;
caseIOCTRL_LED_4:
led_write_addr=LED_4;
break;
caseIOCTRL_LED_5:
led_write_addr=LED_5;
break;
caseIOCTRL_LED_6:
led_write_addr=LED_6;
break;
default:
err=-EINVAL;
}
returnerr;
}
int__initled_init(void)
{
printk("*********************led_init**************\n");
LED_GPACON=ioremap(0x56000000,4);
LED_GPADATA=ioremap(0x56000004,4);
LED_1=ioremap(0x10000000,8);
devfs_led=devfs_register(NULL,"led",DEVFS_FL_DEFAULT,LED_MAJOR,0,
S_IFCHR|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP,
&led_fops,NULL);
return0;
}
staticvoid__exitled_exit(void)
{
devfs_unregister(devfs_led);
}
module_init(led_init);
module_exit(led_exit);
示例2S3C2440中AD转换器驱动程序
1、建立驱动程序文件my2440_adc.c,实现驱动的初始化和退出
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*定义了一个用来保存经过虚拟映射后的内存地址*/
static void __iomem *adc_base;
/*保存从平台时钟队列中获取ADC的时钟*/
static struct clk *adc_clk;
/*申明并初始化一个信号量ADC_LOCK,对ADC资源进行互斥访问*/
DECLARE_MUTEX(ADC_LOCK);
static int __initadc_init(void)
{
int ret;
/*从平台时钟队列中获取ADC的时钟,这里为什么要取得这个时钟,因为ADC的转换频率跟时钟有关。
系统的一些时钟定义在arch/arm/plat-s3c24xx/s3c2410-clock.c中*/
adc_clk = clk_get(NULL, "adc");
if (!
adc_clk)
{
/*错误处理*/
printk(KERN_ERR "failedtofindadcclocksource\n");
return -ENOENT;
}
/*时钟获取后要使能后才可以使用,clk_enable定义在arch/arm/plat-s3c/clock.c中*/
clk_enable(adc_clk);
/*将ADC的IO端口占用的这段IO空间映射到内存的虚拟地址,ioremap定义在io.h中。
注意:
IO空间要映射后才能使用,以后对虚拟地址的操作就是对IO空间的操作,
S3C2410_PA_ADC是ADC控制器的基地址,定义在mach-s3c2410/include/mach/map.h中,0x20是虚拟地址长度大小*/
adc_base = ioremap(S3C2410_PA_ADC, 0x20);
if (adc_base == NULL)
{
/*错误处理*/
printk(KERN_ERR "Failedtoremapregisterblock\n");
ret = -EINVAL;
goto err_noclk;
}
/*把看ADC注册成为misc设备,misc_register定义在miscdevice.h中
adc_miscdev结构体定义及内部接口函数在第②步中讲,MISC_DYNAMIC_MINOR是次设备号,定义在miscdevice.h中*/
ret = misc_register(&adc_miscdev);
if (ret)
{
/*错误处理*/
printk(KERN_ERR "cannotregistermiscdevonminor=%d(%d)\n", MISC_DYNAMIC_MINOR, ret);
goto err_nomap;
}
printk(DEVICE_NAME "initialized!
\n");
return 0;
//以下是上面错误处理的跳转点
err_noclk:
clk_disable(adc_clk);
clk_put(adc_clk);
err_nomap:
iounmap(adc_base);
return ret;
}
static void __exitadc_exit(void)
{
free_irq(IRQ_ADC, 1); /*释放中断*/
iounmap(adc_base); /*释放虚拟地址映射空间*/
if (adc_clk) /*屏蔽和销毁时钟*/
{
clk_disable(adc_clk);
clk_put(adc_clk);
adc_clk = NULL;
}
misc_deregister(&adc_miscdev);/*注销misc设备*/
}
/*导出信号量ADC_LOCK在触摸屏驱动中使用,因为触摸屏驱动和ADC驱动公用
相关的寄存器,为了不产生资源竞态,就用信号量来保证资源的互斥访问*/
EXPORT_SYMBOL(ADC_LOCK);
module_init(adc_init);
module_exit(adc_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("My2440ADCDriver");
2、adc_miscdev结构体定义及内部各接口函数的实现,代码如下
#include
/*设备名称*/
#define DEVICE_NAME "my2440_adc"
/*定义并初始化一个等待队列adc_waitq,对ADC资源进行阻塞访问*/
static DECLARE_WAIT_QUEUE_HEAD(adc_waitq);
/*用于标识AD转换后的数据是否可以读取,0表示不可读取*/
static vo