嵌入式作页.docx

上传人:b****0 文档编号:12734950 上传时间:2023-04-21 格式:DOCX 页数:16 大小:263.31KB
下载 相关 举报
嵌入式作页.docx_第1页
第1页 / 共16页
嵌入式作页.docx_第2页
第2页 / 共16页
嵌入式作页.docx_第3页
第3页 / 共16页
嵌入式作页.docx_第4页
第4页 / 共16页
嵌入式作页.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

嵌入式作页.docx

《嵌入式作页.docx》由会员分享,可在线阅读,更多相关《嵌入式作页.docx(16页珍藏版)》请在冰豆网上搜索。

嵌入式作页.docx

嵌入式作页

1.名词含义

Framebuffer、ARM、xscale、PXA255、RISC、体系结构

Framebuffer:

驱动程序的一种,帧缓冲区。

通过Framebuffer设备,上层软件可以通过一个良好定义的软件接口访问图形硬件,而不需要关心底层图形硬件是如何工作的。

FrameBuffer是出现在2.2.xx内核当中的一种驱动程序接口。

Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。

Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。

用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。

这种操作是抽象的,统一的。

用户不必关心物理显存的位置、换页机制等等具体细节。

这些都是由Framebuffer设备驱动来完成的。

但Framebuffer本身不具备任何运算数据的能力所有显示任务都有CPU完成在应用程序中,一般通过将FrameBuffer设备映射到进程地址空间的方式使用。

FrameBuffer设备还提供了若干ioctl命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。

ARM:

(1)英国知识产权和设计公司,专门从事基于RISC(精简指令集)技术芯片设计开发,作为知识产权供应商,本身不直接从事芯片生产,而是转让设计许可,提供内核、体系扩展技术;

(2)一种技术的名子:

(3)一类微处理器的通称,广泛应用于移动通信、手持计算、多媒体数字消费等嵌入式解决方案的RISC标准,特点有:

小体积、低功耗、成本低、高性能;16/32位双指令集;全球众多合作伙伴。

包括:

ARM2,3、ARM6,60,610、ARM7,710、ARM7D,7DM、ARM7TDMI、ARM8,810、ARM9,920、ARM9E系列、ARM10E系列、StrongARM、SecureCore系列、Xscale等。

Xscale:

ARM微处理器的一款。

Xscale处理器是基于ARMv5TE系列结构的解决方案,是一款性能全、性价比高、功耗低的处理器。

采用7级流水线,32K数据/指令缓存。

支持16位的Thumb指令和DSP指令集。

为多媒体的应用支持SIMD。

有七种工作模式(用户、系统、特权、快速中断、外部中断、中止。

未定义指令)。

已使用在数字移动电话、个人数字助理和网络产品等场合。

PXA255:

Intel公司提供的一种嵌入式系统硬件开发平台(处理器)。

特性有:

(1)基于IntelXscaleMicroarchitecture且具有其特性的;

(2)在IntelXscaleMicroarchitecture基础上集成了许多其他的功能单元。

实验板硬件资源:

XscalePXA255处理器、64位SDRAM(存储器)、32位Flash、网口、声卡、LCD、触摸屏、USB从口、(1Slot)PCMCIA、实时钟电源控制器、红外口、(1Slot)CF、(1Slot)MMC(多媒体卡接口)、DMA控制器。

实验板软件资源:

操作系统(Linux2.4.18kernel)、驱动程序、文件系统、GUI。

RISC:

微处理器的体系结构。

相比传统的CISC结构优势在于精简指令集。

精华为通过简化计算机指令功能,简化计算机指令格式,使指令的平均执行周期减少,同时大量使用通用寄存器,来提高计算机的工作主频,提高程序执行的速度。

特点有:

采用固定长度的指令格式;使用单周期指令,便于流水线操作执行;使用大量寄存器,数据处理指令只对寄存器进行操作;采用加载/存储指令批量传输数据,以提高数据的传输效率;在一条数据处理指令中,同时完成逻辑处理和移位处理两个功能;在循环处理中使用地址的自动增减,提高运行效率。

体系结构:

嵌入式硬件与软件的衔接,确定嵌入式系统设计的部件、部件功能、部件间接口的设计并集中于嵌入式系统的核心部分——处理器的运算与内存的存取。

2、对pxa255电路模块图进行翻译

(1)IntelStrataFlash:

Intel公司的一种FlashMemory,内存器件的一种,闪存在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘。

(2)SDRAM:

SynchronousDynamicRandomAccessMemory,同步动态随机存储器,同步是指Memory工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写,用来临时存放数据的,特点是掉电数据会丢失。

(3)10Base-TEthernet1Port:

10Mbps数字基带信号传输,采用双绞线介质,有效传输距离100米的以太网口。

(4)Serial2Port:

两个串口,支持蓝牙,全双工串口。

(5)JTAGPort:

JointTestActionGroup,联合测试工作组)是一种国际标准测试协议(IEEE1149.1兼容),主要用于芯片内部测试

(6)USBSlavePort:

USB从设备接口。

(7)PCMCIA1Slot:

PCMCIA(PERSONALCOMPUTERMEMORYCARDINTERNATIONALASSOCIATION),这个是指支持这个协会指定的标准的卡的卡槽。

(8)CF1Slot:

CF卡(CompactFlash)的卡槽。

(9)MMC1Slot:

MMC卡(MultimediaCard),多媒体卡的卡槽。

(10)ExternalInterface:

额外的接口。

(11)TouchScreen:

触摸屏。

(12)6.4inchesTFTLCD:

6.4英寸TFT液晶屏。

(13)RTC:

realtimeclock,实时时钟。

(14)IrDA:

IrDA红外连接通信。

(15)Audio:

声卡。

3、叙述基于linux的嵌入式平台的搭建过程

(1)处理器以及硬件开发平台的选择

以处理器为主,结合考虑硬件平台的情况。

处理器考虑的问题包括应用类型及I/O接口、主频和功耗、对不同类型存储器的支持、封装等;硬件平台的选择和设计包括内存和外围存储器、输入输出接口以及设备等几项主要内容。

(2)操作系统的选择

由于已经选择了Linux操作系统,因此此处主要是内核版本的选取以及对内核功能的裁剪。

(3)开发环境的选取

即开发工具的选取,主要是指开发软件的选取,比如常用的minicom。

(4)开发实施

首先,Bootloader的烧制。

目的是对硬件系统基本功能的支持,比如串口通信。

其次,内核文件的制作。

接下来,内核文件的拷贝。

此时,对通过串口或者网口实施传输,能够大幅度提高传输速度。

最后,在主机使用开发软件,完成对硬件系统的开发工作。

包括硬件驱动程序、上层的应用程序、系统的集成与调试等。

4、冯。

诺依曼架构与哈佛架构的区别。

哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。

中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。

程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度。

冯·诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。

程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。

(数据总线地址总线共用)

在通用计算机系统中,应用软件的多样性使得计算机要不断地变化所执行的代码的内容,并且频繁地对数据与代码占有的存储器进行重新分配,这种情况下,冯·诺依曼结构占有绝对优势,因为统一编址可以最大限度地利用资源,而哈佛结构的计算机若应用于这种情形下则会对存储器资源产生理论上最大可达50%的浪费,这显然是不合理的。

但是在嵌入式应用中,系统要执行的任务相对单一,程序一般是固化在硬件里。

嵌入式计算机在工作时与通用计算机有着一些区别:

嵌入式计算机在工作期间的绝大部分时间是无人值守的,而通用计算机工作期间一般是有人操作的;嵌入式计算机的故障可能会导致灾难性的后果,而通用计算机一般就是死死机,重新启动即可。

这两点决定了对嵌入式计算机的一个基本要求:

可靠性。

选用哈佛结构代替更加合理。

5、单周期3级流水的情况下,第10个指令周期时,第几条指令执行结束?

结束。

 

6、下面是linux下的一个简单的设备驱动程序,写出linux设备驱动常用的数据结构,同时阅读下面代码,请给出测试程序中的每条语句加以注释。

设备驱动程序Keypad.c的源代码:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#defineLEDnKEY_MAJOR251

#defineKEYPAD_NAME"X-Hyper250Keypad"

#defineKEYPAD_VERSION"Version0.1"

#defineEXT_KEY_CSEXT_PORT2

#defineEXT_LED_CSEXT_PORT3

#defineLED_SHOW10

/*EXT_KEY_CS为向外部LED进行数值设定,它定义在其它头文件里*/

voidled_off_on()/**/

{

inti;

EXT_LED_CS=0xff;

for(i=0;i<8;++i)

{

EXT_LED_CS=~((1<

udelay(30000);/*使之亮一段时间*/

}

EXT_LED_CS=0xff;/*LED灭*/

}

/*当应用程序系统调用open函数来打开设备文件时,调用此函数*/

intlednkey_open(structinode*inode,structfile*filp)

{

MOD_INC_USE_COUNT;/*内核提供的一个宏,检查使用驱动程序的用户数*/

return(0);/*success*/

}

intlednkey_release(structinode*inode,structfile*filp)/*释放设备文件*/

{

led_off_on();

MOD_DEC_USE_COUNT;

return(0);

}

/*按键读取函数*/

ssize_tlednkey_read(structfile*filp,char*Putbuf,size_tlength,loff_t*f_pos)

{

unsignedshortBottonStatus;

unsignedcharBottontmp=0;

inti;

BottonStatus=(EXT_KEY_CS&0xff);/*按键状态读取*/

for(i=0;i<8;++i)/*判断哪个键被按下*/

{

if(((BottonStatus>>i)&1)==0)

Bottontmp=(i+1);

}

/*将数据从内核态拷贝到用户态,这是由定义在里的特殊函数实现在不同空间传输任意字节的数据*/

copy_to_user(Putbuf,&Bottontmp,length);

returnlength;

}

ssize_tlednkey_write(structfile*filp,constchar*Getbuf,size_tlength,loff_t*f_pos)

{

intnum;

unsignedcharUsrWantLed;

copy_from_user(&UsrWantLed,Getbuf,length);/*将数据从用户态拷贝到核心态*/

num=((UsrWantLed)&0xff);/*确定那一位要进行设定*/

EXT_LED_CS=~(1<<(num-1));/*点亮相应地LED灯*/

return(0);

}

/*这是接口函数,主要用于获取或改变正在运行的设备参数*/

intlednkey_ioctl(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg)

{

switch(cmd)

{

caseLED_SHOW:

/*如果要点亮LED灯*/

{

if(arg)

led_off_on();/*则点亮*/

break;

}

}

return0;

}

/*以下这些驱动函数是与用户的应用程序里对设备文件操作的函数相对应的*/

structfile_operationslednkey_fops={

open:

lednkey_open,

read:

lednkey_read,

write:

lednkey_write,

ioctl:

lednkey_ioctl,

release:

lednkey_release,

};

/*初始化设备函数,在函数名之前加上这个属性后,系统会在初始化完成之后就丢弃初始化函数,收回它所站的内存,以减小内核占用的空间,它只对内建的驱动起作用*/

staticint_initxhyper250_keypad_init(void)

{

intresult;

result=register_chrdev(LEDnKEY_MAJOR,"lednkey",&lednkey_fops);

/*向操作系统注册一个主号为251,设备名为“lednkey”,并传递设备驱动程序的指针为led_fops(全局变量),其中register_chrdev()是内核提供的函数,作用是完成注册新的字符设备*/

printf("%s%sinitialized.\n",KEYPAD_NAME,KEYPAD_VERSION);

led_off_on();

return0;

}

/*向操作系统卸载设备函数*/

staticvoid_exitxhyper250_keypad_exit(void)

{

unregister_chrdev(LEDnKEY_MAJOR,"lednkey");

led_off_on();

}

module_init(xhyper250_keypad_init);/*显示声明初始化设备函数*/

module_exit(xhyper250_keypad_exit);/*显示声明卸载设备函数*/

/*通过上述两个声明使内核知道驱动程序的进入点*/

测试文件的源代码如下:

#include

#include

#include

#include

#include

#include

#defineLED_SHOW10

intfd;

staticchar*dev_name="/dev/keypad";

intmain(intargc,char**argv)

{

intdata=0,pre_data;

fd=open(dev_name,O_RDWR);

if(!

(fd>=0))

{

printf("%sfileopenfailed\n",dev_name);

exit(-1);

}

printf("\nkeypadApp:

pressthepushbuttonseeshowled-ExitCtrl-C\n",dev_name);

ioctl(fd,LED_SHOW,1);

while

(1)

{

do

{

pre_data=data;

read(fd,(char*)&data,sizeof(data));

data=(data&0xff);

}while(data==0);

if(pre_data==0)

{

printf("Write%dLED\n",data);

write(fd,(constchar*)&data,sizeof((constchar)data));

}

}

close(fd);

return0;

}

 

1)数据结构

 

struct file_operations 

struct module *owner; 

 loff_t (*llseek)(struct file *, loff_t, int);

ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);

ssize_t (*aio_read)(struct kiocb *, char __user *, size_t, loff_t);

ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *); 

ssize_t (*aio_write)(struct kiocb *, const char __user *, size_t, loff_t);

 int (*readdir)(struct file *, void *, filldir_t);

unsigned int (*poll)(struct file *, struct poll_table_struct *);

int (*ioctl)(struct inode *, struct file *, unsigned int, unsigned long);

long (*unlocked_ioctl)(struct file *, unsigned int, unsigned long); 

long (*compat_ioctl)(struct file *, unsigned int, unsigned long);

 int (*mmap)(struct file *, struct vm_area_struct *);

 int (*open)(struct inode *, struct file *);

inode_operations。

int(*flush)(struct file *);

int (*release)(struct inode *, struct file *);

int (*fsync)(struct file *, struct dentry *, int datasync);

int (*aio_fsync)(struct kiocb *, int datasync);

int (*fasync)(int, struct file *, int); 

int (*lock)(struct file *, int, struct file_lock *); 

ssize_t (*readv)(struct file *, const struct iovec *, unsigned long, loff_t *);

ssize_t (*writev)(struct file *, const struct iovec *, unsigned long, loff_t *); 

ssize_t (*sendfile)(struct file *, loff_t *, size_t, read_actor_t, void *); 

ssize_t(*sendpage)(struct file *, struct page *, int, size_t, loff_t *, int);

unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, 

unsigned long, unsigned long);

int (*check_flags)(int); 

int (*dir_notify)(struct file *filp, unsigned long arg);

int (*flock)(struct file *, int, struct file_lock *);

 

 

2)程序注释

 

#include 

#include 

#include 

#include 

#include 

#include 

#define LED_SHOW 10 

int fd; 

static char*dev_name="/dev/keypad"; 

int main(int argc,char**argv) 

{

int data=0,pre_data; 

fd=open(dev_name,O_RDWR); //

使用函数

open

打开设备

keypad 

if(!

(fd>=0)) //

打开失败,显示出错信息

printf("%s file open failed\n",dev_name); 

exit(-1); 

//

打开成功,提示用户输入

 printf("\nkeypad App:

press the push button see show led-Exit Ctrl-C\n",dev_name); 

//

循环显示

LED

,看

LED

是否正常

ioctl(fd,LED_SHOW,1); 

while

(1)

//

采用忙等待方式扫描用户输入,传递给

write

函数

do 

pre_data=da

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1