文档库 最新最全的文档下载
当前位置:文档库 › 嵌入式

嵌入式

嵌入式
嵌入式

重庆邮电大学研究生堂下考试答卷

第一学年第1学期

考试科目嵌入式系统设计

姓名樊忠(S100101025)

年级2010级4班

专业通信与信息系统

2010年12 月20日

嵌入式系统设计实验报告

一、【实验目的】

1.了解PXA270微处理器IO的功能

2.熟悉PXA270微处理器IO驱动程序的编写方法

3.掌握驱动程序的加载过程和方法

4.熟悉IO口驱动实验的操作步骤,对数码管实现循环移位等操作。

5.熟悉编写驱动程序代码和测试程序代码,编写 Makefile文件。

二、【实验步骤】

1.打开虚拟机,在文件系统中找出exam文件夹,按照实验要求,解压两个实验所需文件:arm-linux4.

2.1、linux-2.6.22.10.tar.gz和xscalev1.tar.gz 2.进入/exam/linux-2.6.22.10目录下下修改顶层Makefile文件,将

修改为:

3.在文件夹/exam/test下修改Makefile文件如下:

4.再在该文件夹下打开终端,运行make命令进行编译,在该目录中应生成xsb_seg.ko模块文件,利用file命令查看xsb_seg.ko文件的格式,应为ARM 格式的ELF文件;

5.在/exam/IO_driver文件下完善Makefile文件如下:

6.再在/exam/IO_driver文件下用make命令进行编译,利用file命令查看

IO_test文件的格式,应为ARM格式的ELF文件;

7.在Linux操作系统下输入minicom,然后打开EELiod目标平台电源,平台启动后,输入root,按CTRL+A,然后按Z,启动串口命令界面,按S键,选择zmodem 传输方式;按回车。

8.将光标移至“[ . . ]”处,双击空格键,即可进入根目录如下图所示:

9.以相似的方法进入相应目录中按一次空格选中xsb_seg.c、xsb_seg.ko、xsb_seg.mod.c、IO_test这四个文件,再安回车键进行下载。

10.在目标平台终端利用mknod命令建立设备文件节点;并利用insmod命令动态加载驱动模块,同时利用lsmod命令查看驱动模块的加载情况,然后在目标平台终端运行Led驱动测试程序IO_test,在平台终端将显示驱动测试程序菜单如下图所示:

11.在平台终端显示驱动测试程序菜单输入提示输入数字“0”。驱动测试程序将通过open函数打开设备文件,同时内核调用驱动程序的xxx_open函数,在平台终端可以查看驱动和测试程序调试输出信息;

12.选择菜单中的其他编号观察数码管的显示。

三、【Makefile文件分析】

1、/exam/IO_driver下的Makefile文件分析:

# Makefile for the emdoor 8 seg driver. #

CFLAGS +=$(DEBFLAGS) –Wall //隐含规则中的变量

ifneq ($(KERNELRELEASE),) // 如果KERNELRELEASE宏被定义

obj-m :=xsb_seg.o //生成目标文件

else //如果KERNELRELEASE没有被定义

KERNELDIR :=/exam/linux-2.6.22.10 //内核文件所在目录

PWD :=/exam/IO_driver //驱动程序所在目录

ALL: //以KERNELDIR目录下的内核为基础,编译PWD目录下的驱动程序$(MAKE) $(CFLAGS) -C $(KERNELDIR) M=$(PWD) modules

endif

clean: //删除生成的中间文件

rm –fr *.o *.ko *~ core .depend .*.cmd *.mod.c .tmp_versions 2、/exam/test下的Makefile文件分析:

CC = /exam/xscalev1/bin/arm-linux-gcc //指定交叉编译工具的目录INCLUDEDIR = /exam/xscalev1/bin/arm-linux-gcc /include //指定头文件目录

CFLAGS = -I.. -I$(INCLUDEDIR) //编译器选项(包括头文件和线程)TARGET_TEST=IO_test//目标文件IO_test

OBJ_TEST = $(TARGET_TEST) //目标文件的宏定义为OBJ_TEST

SOURCE_TEST = $(TARGET_TEST).c

ALL://执行OBJ_TEST目录下的SOURCE_TEST程序

$(CC) $(CFLAGS) -o $(OBJ_TEST) $(SOURCE_TEST)

clean: //清除中间文件

rm -rf $(OBJ_TEST)

四、【驱动程序分析】

#include //内核模块的头文件

#include //printk等函数的头文件

#include //writew的头文件

#include //copy_form_user及copy_to_user的头文件

#include //read及write的头文件

MODULE_LICENSE("GPL"); //驱动程序的版权(一般写在最下面)

char LED_MODULE=0; //定义一个字符型变量,下面要用到

#define DEVICE_NAME "xsb_seg" //驱动程序的设备名

#define SEG_CS1 0x10300000

#define SEG_CS2 0x10400000

static char LED[10]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7F, 0x6F};//数码管上要显示的数字,即0、1、2…….9。

unsigned long *CS1_Address, *CS2_Address;

struct seg //定义一个结构体,用来存储将要显示的数字

{

char LED1_Val; //定义变量存储第一个数码管要显示的数字值;下同

char LED2_Val;

char LED3_Val;

char LED4_Val;

char negative; //negative是一个标志位

};

//数码管显示

static void Updateled(struct seg *seg_7)

{

unsigned short buff=0x00;

buff=seg_7->LED1_Val;

buff=buff|( seg_7->LED2_V al <<8);

writew(buff,CS1_Address); //I/O 上写入16 位数据(2字节)第一个参数是要写入的数值,第二个参数是写入的内存地址,因为第一个参数为16为数据,而我们用来在数码管显示数字只需要8位,所以这里用上面buff=seg_7->LED1_Val;

buff=buff|( seg_7->LED2_V al <<8);这两条语句把数码管1 、2的值写进了buff,用来在数码管上显示数字

buff=0x00;

buff=seg_7->LED3_Val;

buff=buff|( seg_7->LED4_V al<<8);

writew(buff,CS2_Address);

return;

}

//数码管上设置要显示的数字,就是设置在哪个数码管上显示,显示什么数字,

void value_seting(struct seg *seg_7, char position, char value)

{

if (seg_7->negative==0)//negative是一个标志位,如果negative等于0在数码管上就什么也不显示,只有negative不等于0时,才在数码管上显示要显示的数字。

value=~value & ~(0x1<<7);

else

value=(0x1<<7)|value; //把将要显示数字的值赋值给value

if (position==1)

seg_7->LED1_Val=value; //将value的值赋第一个数码管显示的值else if(position==2)

seg_7->LED2_Val=value; //将value的值赋第二个数码管显示的值else if(position==3)

seg_7->LED3_Val=value; //将value的值赋第三个数码管显示的值else if(position==4)

seg_7->LED4_Val=value; //将value的值赋第四个数码管显示的值

}

//显示2008的

static ssize_t XSB_Seg_write(struct file *file, const char *buffer, size_t count, loff_t * ppos) {

int i;

struct seg *seg_7=file->private_data;

char led_forall[4]; //定义一个数组,用来接收传递过来的数组值

printk(KERN_EMERG "The Module is written,XSB_Seg_write\n");

if(count!=4) //判断

{

printk(KERN_EMERG "the count of input is not 4!!");

return 0;

}

if(copy_from_user(led_forall, buffer, 4))//copy_from_user这个函数就是把测试程序中传递的参数复制过来,也就是把led数组中的值赋值给这里的led_forall数组,即2008这个值。

{

for(i=1;i<=4;i++)//for循环用来实现在四个数码管上显示2008

{

value_seting(seg_7, i, LED[led_forall[i-1]]);

}

Updateled( seg_7 ); //这个函数送显。

}

return 0;

}

//主函数

static int XSB_Seg_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg) {

char val=0x00; //定义一个字符变量,用来接收测试程序中传递过来的参数

struct seg *seg_7=fp->private_data;

if (!arg)

return -EINV AL;

if (copy_from_user(&val, (int *)arg, sizeof(char))) //copy_from_user这个函数就是把测试程序中传递的参数复制过来,(int*)arg的意思是把传递过来的参数转换为整型,并把它赋值给val,val就是数码管上要显示的数字

return -EFAULT;

switch(cmd){

case 1:

value_seting(seg_7, 1, val);

break;

case 2:

value_seting(seg_7, 2, val);

break;

case 3:

value_seting(seg_7, 3, val);

break;

case 4:

value_seting(seg_7, 4, val);

break;

case 0:

seg_7->negative = LED_MODULE;

break;

default:

printk(KERN_EMERG"ioctl parameter input error,please input number 0-4");

break;

}

Updateled( seg_7 ); //送显

return 0;

}

//打开驱动设备文件,进行一些初始化设置

static int XSB_Seg_open(struct inode *inode, struct file *filp)

{

struct seg *seg_7; //定义一个结构体指针变量seg_7,它的结构就是上面定义的那样,包含5个数据,前4个用来存储4个数码管要显示的数字,第5个是一个标志位printk(KERN_EMERG "The Module is open,XSB_Seg_open\n");

seg_7=kmalloc(sizeof(struct seg), GFP_KERNEL);//分配内存(在内核空间),也就是给定义的那个结构分配一定的空间,用来存储数据,GFP_KERNEL是一个参数。

seg_7->negative=LED_MODULE; //将标志位置0

filp->private_data=seg_7;//这里用指针变量seg_7将刚才分配的内存空间的起始地址赋值给文件里私有数据变量

return 0;

}

//释放初始化时分配的内存空间

static int XSB_Seg_release(struct inode *inode, struct file *filp)

{

printk(KERN_EMERG "The Module is release,XSB_Seg_release\n");

kfree(filp->private_data);

return 0;

}

static struct file_operations Emdoor_fops = {

open: XSB_Seg_open,

write: XSB_Seg_write,

release:XSB_Seg_release,

ioctl: XSB_Seg_ioctl,

owner: THIS_MODULE,

};

//数码管初始化,映射地址和驱动设备的注册

static int __init XSB_Seg_init(void)

{

int ret;

printk(KERN_EMERG "The Module is Init,XSB_Seg_init\n");

CS1_Address=ioremap(SEG_CS1, 4);

CS2_Address=ioremap(SEG_CS2, 4); // ioremap将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问,SEG_CS1表示要映射的起始的IO地址,4表示要映射的大小

ret = register_chrdev(61, DEVICE_NAME, &Emdoor_fops); //字符设备的注册,调用该函数后就可以向系统申请主设备号

if (ret < 0) {

printk(DEVICE_NAME " can't get major number\n");

return ret;

}

return 0;

}

//实现七段数码管驱动模块退出函数与模块描述

static void __exit XSB_Seg_exit(void)

{

printk(KERN_EMERG "The Module is Exit,XSB_Seg_exit\n");

iounmap(CS1_Address); //释放上面的地址映射

iounmap(CS2_Address); //释放上面的地址映射

unregister_chrdev(61, DEVICE_NAME); //注销上面申请的字符设备

}

module_init(XSB_Seg_init); //驱动程序加载时的入口点

module_exit(XSB_Seg_exit); //驱动程序卸载时的入口点

MODULE_AUTHOR("Ben.li, ben.li@https://www.wendangku.net/doc/354198162.html,");//驱动程序的作者

MODULE_DESCRIPTION("This is a 8 Segment Led driver demo");//驱动程序卸载时打印出来的提示

五、总结

在本次实验中,通过上机调试,使我了解了关于设备驱动的加载过程。

设备驱动在加载时首先从入口函数init_module()开始。该函数的主要功能

为:完成设备驱动的初始化工作,比如寄存器置位、结构体赋值等工作,最重要

的程序是向内核注册该设备,对于字符设备调用register_chrdev()完成注册,

而对于块设备则需要调用register_blkdev()完成注册。

注册成功后,该设备获得了系统分配的主设备号、自定义的次设备号,并建

立起于文件系统的关联。设备在卸载时需要回收相应的资源,令设备的响应寄存

器复位并从系统中注销该设备,字符设备调用unregister_chrdev()、块设备调

用unregister_blkdev()。系统调用部分则是对设备的操作过程,如open、read、

write、ioctl等。设备驱动程序负责将应用程序如读、写等操作正确无误的传

递给相关的硬件,并使硬件能够做出正确反应的代码,因此在编写设备驱动程序

时,必须要了解相应的硬件设备的寄存器、IO口及内存的配置参数。另外,还

学会了编写驱动程序和测试程序的Makefile文件,并能成功的下载到实验箱上,

实现相应功能。

附录Ⅰ(驱动程序代码):

#include

#include

#include

#include

#include

MODULE_LICENSE("GPL");

char LED_MODULE=0;

#define DEVICE_NAME "xsb_seg"

#define SEG_CS1 0x10300000

#define SEG_CS2 0x10400000

static char LED[10]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7F, 0x6F}; unsigned long *CS1_Address, *CS2_Address;

struct seg

{

char LED1_Val;

char LED2_Val;

char LED3_Val;

char LED4_Val;

char negative;

};

static void Updateled(struct seg *seg_7)

{

unsigned short buff=0x00;

buff=seg_7->LED1_Val;

buff=buff|( seg_7->LED2_Val <<8);

writew(buff,CS1_Address);

buff=0x00;

buff=seg_7->LED3_Val;

buff=buff|( seg_7->LED4_Val<<8);

writew(buff,CS2_Address);

return;

}

void value_seting(struct seg *seg_7, char position, char value)

{

if (seg_7->negative==0)

value=~value & ~(0x1<<7);

else

value=(0x1<<7)|value;

if (position==1)

seg_7->LED1_Val=value;

else if(position==2)

seg_7->LED2_Val=value;

else if(position==3)

seg_7->LED3_Val=value;

else if(position==4)

seg_7->LED4_Val=value;

}

static ssize_t XSB_Seg_write(struct file *file, const char *buffer, size_t count, loff_t * ppos)

{

int i;

struct seg *seg_7=file->private_data;

char led_forall[4];

printk(KERN_EMERG "The Module is written,XSB_Seg_write\n");

if(count!=4)

{

printk(KERN_EMERG "the count of input is not 4!!");

return 0;

}

if(copy_from_user(led_forall, buffer, 4))

{

for(i=1;i<=4;i++)

{

value_seting(seg_7, i, LED[led_forall[i-1]]);

}

Updateled( seg_7 );

}

return 0;

}

static int XSB_Seg_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg)

{

char val=0x00;

struct seg *seg_7=fp->private_data;

if (!arg)

return -EINVAL;

if (copy_from_user(&val, (int *)arg, sizeof(char)))

return -EFAULT;

switch(cmd){

case 1:

value_seting(seg_7, 1, val);

break;

case 2:

value_seting(seg_7, 2, val);

break;

case 3:

value_seting(seg_7, 3, val);

break;

case 4:

value_seting(seg_7, 4, val);

break;

case 0:

seg_7->negative = LED_MODULE;

break;

default:

printk(KERN_EMERG"ioctl parameter input error,please input number 0-4");

break;

}

Updateled( seg_7 );

return 0;

}

static int XSB_Seg_open(struct inode *inode, struct file *filp)

{

struct seg *seg_7;

printk(KERN_EMERG "The Module is open,XSB_Seg_open\n");

seg_7=kmalloc(sizeof(struct seg), GFP_KERNEL);//在内核空间分配内存seg_7->negative=LED_MODULE;

filp->private_data=seg_7;

return 0;

}

static int XSB_Seg_release(struct inode *inode, struct file *filp) {

printk(KERN_EMERG "The Module is release,XSB_Seg_release\n");

kfree(filp->private_data);

return 0;

}

static struct file_operations Emdoor_fops = {

open: XSB_Seg_open,

write: XSB_Seg_write,

release:XSB_Seg_release,

ioctl: XSB_Seg_ioctl,

owner: THIS_MODULE,

};

static int __init XSB_Seg_init(void)

{

int ret;

printk(KERN_EMERG "The Module is Init,XSB_Seg_init\n");

CS1_Address=ioremap(SEG_CS1, 4);

CS2_Address=ioremap(SEG_CS2, 4);

ret = register_chrdev(61, DEVICE_NAME, &Emdoor_fops);

if (ret < 0) {

printk(DEVICE_NAME " can't get major number\n");

return ret;

}

return 0;

}

static void __exit XSB_Seg_exit(void)

{

printk(KERN_EMERG "The Module is Exit,XSB_Seg_exit\n");

iounmap(CS1_Address);

iounmap(CS2_Address);

unregister_chrdev(61, DEVICE_NAME);

}

module_init(XSB_Seg_init);

module_exit(XSB_Seg_exit);

MODULE_AUTHOR("Ben.li, ben.li@https://www.wendangku.net/doc/354198162.html,");

MODULE_DESCRIPTION("This is a 8 Segment Led driver demo");

附录Ⅱ(Makefile代码):

驱动程序的Makefile:

#Makefile for the emdoor 8 seg driver. #

CFLAGS +=$(DEBFLAGS) -Wall

ifneq ($(KERNELRELEASE),)

obj-m :=xsb_seg.o

else

KERNELDIR :=/exam/linux-2.6.22.10

PWD :=/exam/IO_driver

ALL:

$(MAKE) $(CFLAGS) -C $(KERNELDIR) M=$(PWD) modules

endif

clean:

rm -fr *.o *.ko *~ core .depend .*.cmd *.mod.c .tmp_versions

测试程序的Makefile:

CC = /exam/xscalev1/bin/arm-linux-gcc

INCLUDEDIR = /exam/xscalev1/bin/arm-linux-gcc /include

CFLAGS = -I.. -I$(INCLUDEDIR)

TARGET_TEST = IO_test

OBJ_TEST = $(TARGET_TEST)

SOURCE_TEST = $(TARGET_TEST).c

ALL:

$(CC) $(CFLAGS) -o $(OBJ_TEST) $(SOURCE_TEST)

clean:

rm -rf $(OBJ_TEST)

附录Ⅲ(测试程序代码):

基本测试程序:

#include

#include

#include

#include

typedef unsigned char u8;

#define SEG_DEV "/dev/xsb_seg"

char number[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7F, 0x6F}; void clear_led(int fd)

{

int i;

char val=0;

for(i=1;i<=4;i++)

{

ioctl(fd, i, &val);

}

sleep(1);

}

void display_led(int fd)

{

int i;

char val=0x7f;

for(i=1;i<=4;i++)

{

ioctl(fd, i, &val);

}

sleep(1);

}

void appear_same(int fd)

{

char i,j,base=0;

for (j=0, base=0 ;j<=9; j++, base++)

{

for(i=1; i<=4; i++)

ioctl(fd, i, number+base);

sleep(1);

}

}

void appear_roll(int fd)

{

char i, j, base=0;

for (j=0, base=0; j<=9; j++, base++)

{

for(i=1; i<=4; i++)

ioctl(fd, i, number+(base+i-1)%10);

sleep(1);

}

}

void display_menu()

{

printf(" *****Choice Menu*********\n");

printf(" [0] Open Device\n");

printf(" [1] Display Same\n");

printf(" [2] Roll Display\n");

printf(" [3] All Display\n");

printf(" [4] Clear Display\n");

printf(" [5] Write Display\n");

printf(" [C] Close Device\n");

printf(" [x] Exit Test\n");

printf(" ***********************\n");

printf(" Please input your choise: ");

}

int main(int argc, char **argv)

{

int fd=-1;

char ch=0x00;

unsigned char led[4]={2,0,0,8};

display_menu();

while(1)

{

ch=getchar();

switch(ch)

{

case '0':

if(fd>0)

{

printf("##SEG Device has been open##%d \n",fd);

}

else

{

fd = open(SEG_DEV, O_RDWR);

if(fd < 0)

printf("####SEG Device open Fail####\n");

else

printf("####SEG Device open Success####%d \n",fd);

}

display_menu();

break;

case '1':

if(fd>0)

{

appear_same(fd);

clear_led(fd);

}

else

printf("##SEG Device is NOT open## \n");

display_menu();

break;

case '2':

if(fd>0)

{

appear_roll(fd);

clear_led(fd);

}

else

printf("##SEG Device is NOT open## \n"); display_menu();

break;

case '3':

if(fd>0)

display_led(fd);

else

printf("##SEG Device is NOT open## \n");

display_menu();

break;

case '4':

if(fd>0)

clear_led(fd);

else

printf("##SEG Device is NOT open## \n");

display_menu();

break;

case '5':

if(fd>0)

{

write(fd,led,4);

}

else

printf("##SEG Device is NOT open## \n");

display_menu();

break;

case 'c':

case 'C':

if(fd>0)

{

clear_led(fd);

sleep(1);

close(fd);

printf("##SEG Device is closed success## \n");

fd=-1;

}

display_menu();

break;

case 'x':

case 'X':

if(fd>0)

{

clear_led(fd);

sleep(1);

close(fd);

}

exit(0);

break;

}

}

return(0);

}

扩展测试程序:

#include

#include

#include

#include

typedef unsigned char u8;

#define SEG_DEV "/dev/xsb_seg"

char number[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7F, 0x6F}; void clear_led(int fd)

{

int i;

char val=0;

for(i=1;i<=4;i++)

{

ioctl(fd, i, &val);

}

sleep(1);

}

void display_led(int fd)

{

int i;

char val=0x7f;

for(i=1;i<=4;i++)

{

ioctl(fd, i, &val);

}

sleep(1);

}

void appear_roll(int fd)//

在数码管中逆序显示的数字:9012-8901-7890-6789-5678-4567-3456-2345-1234-0123 char i, j, base=9;

for (j=0, base=9; j<=9; j++, base--)

{

for(i=1; i<=4; i++)

ioctl(fd, i, number+(base+i-1)%10);

sleep(1);

}

}

void appear_roll_odd(int fd)//循环显示奇数,比如:1357,3579,5791,7913,9135 {

char i, j, base=0;

for (j=0, base=0; j<=9; j++, base++)

{

for(i=1; i<=4; i++)

ioctl(fd, i, number+(2*base+2i-1)%10);

sleep(1);

}

}

void display_menu()

{

printf(" *****Choice Menu*********\n");

printf(" [0] Open Device\n");

printf(" [1] Display Same\n");

printf(" [2] Roll Display\n");

printf(" [3] All Display\n");

printf(" [4] Clear Display\n");

printf(" [5] Write Display\n");

printf(" [C] Close Device\n");

printf(" [x] Exit Test\n");

printf(" ***********************\n");

printf(" Please input your choise: ");

}

int main(int argc, char **argv)

{ int fd=-1;

char ch=0x00;

unsigned char led[4]={2,0,0,8};

display_menu();

while(1)

{

ch=getchar();

switch(ch)

{

case '0':

if(fd>0)

{

printf("##SEG Device has been open##%d \n",fd);

}

《嵌入式技术基础与实践》习题参考答案

第1章概述习题参考答案 1.嵌入式系统的基本含义是什么?为什么说单片机是典型的嵌入式系统? 答:即MCU的含义是:在一块芯片上集成了中央处理单元(CPU)、存储器(RAM/ROM 等)、定时器/计数器及多种输入输出(I/O)接口的比较完整的数字处理系统。大部分嵌入式系统以MCU为核心进行设计。MCU从体系结构到指令系统都是按照嵌入式系统的应用特点专门设计的,它能很好地满足应用系统的嵌入、面向测控对象、现场可靠运行等方面的要求。因此以MCU为核心的系统是应用最广的嵌入式系统。 2.简述嵌入式系统的特点以及应用领域。 答:嵌入式系统属于计算机系统,但不单独以通用计算机的面目出现;嵌入式系统开发需要专用工具和特殊方法;使用MCU设计嵌入式系统,数据与程序空间采用不同存储介质;开发嵌入式系统涉及软件、硬件及应用领域的知识;嵌入式系统的其他特点,比如紧张的资源,较高稳定性要求,低功耗,低成本等。一般用于工业控制,智能家电,日常电子等领域。 4.比较MCU与CPU的区别与联系。 答:CPU是一个单独的PC处理器。而MCU,则有微处理器,存储器(RAM/ROM等)、定时器/计数器及多种输入输出(I/O)接口的比较完整的数字处理系统。所以可以这么说,MCU 是一个包含微处理器的嵌入式系统,而CPU紧紧是一个处理器而已。 第2章FreescaleS08微控制器习题参考答案 1.给出AW60 存储器映像的简要说明。 答:所谓存储器映像,是指地址$0000 ~ $FFFF这个64KB空间,哪些地址被何种存储器所占用,或者说AW60的RAM、Flash、I/O映像寄存器各使用$0000 ~ $FFFF这个64KB空间中的哪些地址。简单地说,就是$0000 ~ $FFFF这个64KB空间是如何分配的。 2.AW60的引脚主要分为哪几类?简要说明主要引脚的功能。 答:(1)电源类信号引脚(2)复位信号引脚(3)主要功能模块引脚。比如定时器,IRQ中断等。(4)其他,比如背景调试BKGD引脚 主要引脚:AW60最小系统连接的I/O口,以及各具体功能I/O口。 3.嵌入式系统中RAM和Flash作用分别是什么?答:一般来说RAM这个区域安排用户数据(主要是全局变量)和堆栈空间;Flash 要用于存储程序、常数、中断向量等。 4.给出AW60的硬件最小系统。答:AW60芯片的硬件最小系统包括电源及其滤波电路、复位电路、晶振电路及PLL滤 波电路、写入器接口电路。 5.指出下列指令中的源操作数和目的操作数的寻址方式。 (1) MOV #$80 , $80 (2) MOV $80,$A0 (3) MOV $80 , X+ (4) MOV X+ , $80 (5) LDA $80 , X 答:(1)立即寻址,直接寻址 (2)直接寻址,直接寻址

什么是嵌入式软件开发嵌入式系统软件开发所需要学习那些知识_百(精)

什么是嵌入式软件开发?嵌入式系统软件开发所需要学习那些知识? 随着智能化和信息化网络化的不断发展,嵌入式技能已经日趋成为一种新时代新技术革命的关键。对于嵌入式系统和嵌入式软件开发人员来说,这份职业无疑是种高端应用技术的结合。是一个很有前景的职业。 嵌入式趋势来势汹涌,目前为止已经被很多企业所应用,对于这方面人才的需求更是倍感吃紧。关于嵌入式具体应用不做详细的解说,在这里有必要强调一下,嵌入式软件开发是含义,和要想在嵌入式软件开发中取得不菲的成绩所需掌握那些最基础的知识。 嵌入式技术执行专用功能并被内部计算机控制的设备或者系统。嵌入式系统不能使用通用型计算机,而且运行的是固化的软件,嵌入式技术及应用是计算机应用技术的新发展,具有广泛的应用领域和发展前景,就业形势看好。 嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分。通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是是由单个程序实现整个控制逻辑,笼统地来说,嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。 这么多的应用可见嵌入式系统的前景和人才需求是相当大的,在最近几年中关于这一类的培训也层出不穷,所涉及到的课程和知识点相对来说还是有点差异的,在深圳达内福田培训中心网站上看到了关于嵌入式系统软件开发所需要掌握的几大知识点,感觉划分的很细致。 主要包含以下8个核心部分 1.Linux操作系统核心

近年来嵌入式硬件的发展

近年来嵌入式硬件的发展 施明 摘要:近年来随着移动处理、嵌入式应用的大量涌现,以及通用微处理器工艺水平和主频的不断提升,双核乃至四核的出现,功耗日益成为设计者必须关心的问题。这就要求嵌入式软硬件提出了新的要求,需要不断的改进和创新。本文围绕嵌入式近年的发展与更新,主要翻阅了十几篇论文,直接参考文献12篇,其中外文资料4篇。根据所阅读的文献通过对比浅析嵌入式硬件近年来的发展状况。 关键词:8位微控制器,32位微控制器,DSP核MPU In recent years the development of embedded hardware Abstract: in recent years as mobile processing, embedded application, as well as the general microprocessor to improve the technological level and frequency, dual-core and even the emergence of four nuclear power has increasingly become the designers must concern. This requires an embedded hardware and software is put forward new requirements, need continuous improvement and innovation. Around embedded in recent years, the development and updating, this paper mainly through more than ten papers, direct 12 references, including 4 foreign data. According to the reading of literature by comparing the embedded hardware is analysed in recent years the development of the situation Key words:8-bit microcontroller.32- bit microcontroller. DSP core MPU 一、引言 20世纪90年代后期,正处后PC机的前夜.开始兴起了嵌入式的第二次浪潮。随着手机的铺天盖地,惊醒了国内的专家和广大的单片机技术人员,引发了一场单片机与嵌入武的议论。无论改论是否有一致的认识,议论总是有益的。如果能取得一致的认识当然就更好。嵌入式,即嵌入式计算机,是从功能上说的。嵌入式计算机强调的要点是:计算机不为表现自己,而为辅助它所在的宿主设备.智能化地,剃现设备的功能。单片机的叫法,一,未能体现它初始的控制使命,二,它不能代表嵌入式的总体.仅是嵌入式中的类。尽管单片机的结构展示着嵌入式的极终方向,正如今日人们追求的SoC。单片机是Intel 初期的命名,但随后不久就改口叫微控制器了,并把它列入嵌入式器件的一类之中。

嵌入式技术基础与实践_习题参考答案

单片机习题参考答案 第1章概述习题参考答案 1.嵌入式系统的基本含义是什么?为什么说单片机是典型的嵌入式系统? 答:即MCU的含义是:在一块芯片上集成了中央处理单元(CPU)、存储器(RAM/ROM 等)、定时器/计数器及多种输入输出(I/O)接口的比较完整的数字处理系统。大部分嵌入式系统以MCU为核心进行设计。MCU从体系结构到指令系统都是按照嵌入式系统的应用特点专门设计的,它能很好地满足应用系统的嵌入、面向测控对象、现场可靠运行等方面的要求。因此以MCU为核心的系统是应用最广的嵌入式系统。 简述嵌入式系统的特点以及应用领域。 答:嵌入式系统属于计算机系统,但不单独以通用计算机的面目出现;嵌入式系统开发需要专用工具和特殊方法;使用MCU设计嵌入式系统,数据与程序空间采用不同存储介质;开发嵌入式系统涉及软件、硬件及应用领域的知识;嵌入式系统的其他特点,比如紧张的资源,较高稳定性要求,低功耗,低成本等。一般用于工业控制,智能家电,日常电子等领域。 3.比较MCU与CPU的区别与联系。 答:CPU是一个单独的PC处理器。而MCU,则有微处理器,存储器(RAM/ROM等)、定时器/计数器及多种输入输出(I/O)接口的比较完整的数字处理系统。所以可以这么说,MCU 是一个包含微处理器的嵌入式系统,而CPU紧紧是一个处理器而已。 4.举例说明嵌入式系统在日常生活中的应用。 答:日常数码产品:手机,MP3,U盘,相机等。 日常工业类:冰箱,空调,微波炉,汽车等。 5.C语言的那些特性使得它成为嵌入式系统中使用频率最高的高级语言。 答:相比底端汇编,更简单易学;与高级语言如(C++,C#,java等)相比,执行效率高,编译后的编码体积小,而且支持好的编译器还支持嵌入汇编代码;对位的操纵能力很强。6.阅读光盘中【第01章(概述)阅读资料】中的“嵌入式C语言工程简明规范”,用一页纸给出嵌入式C语言工程简明规范的要点。 答:此规范主要针对单片机编程语言和08编译器而言,包括命名、注释、编码规范性等内容。建议在一个工程或者一个项目中尽量遵循相同的代码规范,而不是说你只能拥有一个代码规范。 (1)命名规则:命名清晰明了,有明确含义,使用完整单词或约定俗成的缩写。通常,较短的单词可通过去掉元音字母形成缩写;较长的单词可取单词的头几个字母形成缩写。即"见名知意";命名风格要自始至终保持一致;命名中若使用特殊约定或缩写,要有注释说明;为了代码复用,命名中应避免适用与具体项目相关的前缀;应使用英语命名。 (2)注释:注释基本原则就是有助于对程序的阅读理解,说明程序在"做什么",解释代码的目的、功能和采用的方法。一般情况源程序有效注释量在30%左右。注释语言必须准确、易懂、简洁。边写代码边注释,修改代码同时修改相应的注释,不再有用的注释要删除。汇编和C中都用"//",取消";" 不使用段注释" /* */ "(调试时可用)。 使用文件注释必须说明文件名、项目名称、函数功能、创建人、创建日期、版本信息等相关信息。修改文件代码时,应在文件注释中记录修改日期、修改人员,并简要说明此次修改的目的。所有修改记录必须保持完整。文件注释放在文件顶端,用"/*……*/"格式包含。

详解嵌入式系统的发展特点及架构

详解嵌入式系统的发展特点及架构 随着电子产品的发展,嵌入式系统已经广泛地应用我们的生活的各个领域,例如:计算机、汽车、航天飞机等等。提到嵌入式系统首先联想到单片机,是的,MCU是最基础和常用的嵌入式系统。嵌入式系统与模拟电路或其他功能电路组成的SoC(System on Chip,片上系统)或SiP(System in Package,系统级封装)在手机、机顶盒等功能复杂的产品中的应用也越来越多。 嵌入式系统发展呈现如下特点:·由8位处理向32位过渡·由单核向多核过渡·向网络化功能发展·MCU、FPGA、ARM、DSP等齐头并进·嵌入式操作系统呈多元化趋势所有的嵌入式处理器都是基于一定的架构的,即IP核(Intellectual Property,知识产权),生产处理器的厂家很多,但拥有IP核的屈指可数。有自己的IP核,光靠卖IP核即可坐拥城池。嵌入式系统的架构有专有架构和标准架构之分,在MCU(微控制器)产品上,像瑞萨(Renesas)、飞思卡尔(Freescale)、NEC都拥有自己得专有IP核,而其他嵌入式处理器都是基于标准架构。 标准的嵌入式系统架构有两大体系,目前占主要地位的是所谓RISC(Reduced Instruction Set Computer,精简指令集计算机)处理器。RISC体系的阵营非常广泛,从ARM、MIPS、PowerPC、ARC、Tensilica等等,都是属于RISC处理器的范畴。不过这些处理器虽然同样是属于RISC体系,但是在指令集设计与处理单元的结构上都各有不同,因此彼此完全不能兼容,在特定平台上所开发的软件无法直接为另一硬件平台所用,而必须经过重新编译。 其次是CISC(Complex Instruction Set Computer,复杂指令集计算机)处理器体系,我们所熟知的Intel的X86处理器就属于CISC体系,CISC体系其实是非常低效率的体系,其指令集结构上背负了太多包袱,贪大求全,导致芯片结构的复杂度被极大的提升。过去被应用在嵌入式系统的X86处理器,多为旧世代的产品,比如说,工业计算机中仍可常见数年前早已退出个人计算机市场的Pentium3处理器。由于此世代的产品效能与功耗比可以说是过去X86体系的甜蜜点,加上已经被市场长久验证,稳定性高,故常被应用于效能需求不高,但稳定性要求高的应用中,如工控设备等产品。 1、RISC家族之ARM处理器 ARM 公司于1991年成立于英国剑桥,主要出售芯片设计技术的授权。目前,采用ARM技术智能财产(IP)核心的处理器,即我们通常所说的ARM处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于ARM技术的处理器应用约占据了32位RISC微处理器75%以上的市场,ARM技术不止逐步渗入到我们生活的各个方面,我们甚至可以说,ARM 于人类的生活环境中,已经是不可或缺的一环。 目前市面上常见的ARM处理器架构,可分为ARM7、ARM9以及ARM11,新推出的Cortex系列尚在进行开发验证,市面上还未有相关产品推出。ARM也是嵌入式处理器中首先推出多核心架构的厂商。ARM 首个多核心架构为ARM11 MPCore,架构于原先的ARM11处理器核心之上。ARM11核心是发布于2002年10月份,为了进一步提升效能,其管线长度扩展到8阶,处理单元则增加为预取、译码、发送、转换/MAC1、执行/MAC2、内存存取/MAC3和写入等八个单元,体系上属于ARM V6指令集架构。ARM11采用当时最先进的0.13μm制造制程,运行频率最高可达500到700MHz。如果采用90nm制程,ARM11核心的工作频率能够轻松达到1GHz以上—对于嵌入式处理器来说,这显然是个相当惊人的程度,不过显然1GHz在ARM11体系中不算是个均衡的设定,因此几乎没有厂商推出达到1GHz的ARM11架构处理器。 ARM11的逻辑核心也经过大量的改进,其中最重要的当属“静/动态组合转换的预测功能”。ARM11的执行单元包含一个64位、4种状态的地址转换缓冲,它主要用来储存最近使用过的转换地址。当采用动态转换预测机制而无法在寻址缓冲内找到正确的地址时,静态转换预测功能就会立刻接替它的位置。在实际测试中,单纯采用动态预测的准确率为88%,单纯采用静态预测机制的准确率只有77%,而ARM11的静/动态预测组合机制可实现92%的高准确率。针对高时脉速度带来功耗增加的问题,ARM11采用一项名为“IEM (Intelligent Energy Manager)”的智能电源管理技术,该技术可根据任务负荷情况动态调节处理器的电压,进而有效降低自身的功耗。这一系列改进让ARM11的功耗效能比得以继续提高,平均每MHz只需消耗0.6mW(有快取时为0.8mW)的电力,处理器的最高效能可达到660 Dhrystone MIPS,远超过上一代产品。至于ARM11 MPCore,其在架构上与ARM11同样属于V6指令体系。根据不同应用的需要,MPCore可以被配置为1-4个处理器的组合方式,根据官方资料,其最高性能约可达到2600 Dhrystone MIPS的程度。MPCore是标准的同质多核心处理器,组成MPCore的是4个基于ARM11架构的处理器核心,由于多核心设计的优点是在频率不变的情况下让处理器的性能获得明显提升,因此可望在多任务应用中拥有良好的表现,这一点很适合未来家庭消费电子的需要。例如,机顶盒在录制多个频道电视节目的同时,还可通过互联网收看数字视频点播节目、车内导航系统在提供导航功能的同时,仍然有余力可以向后座乘客播放各类视频码流等。 2、RISC家族之MIPS处理器 MIPS是美国历史悠久的RISC处理器体系,其架构的设计,也如美国人的性格一般,相当的大气且理想化。MIPS架构起源,可追溯到1980年代,斯坦福大学和伯克利大学同时开始RISC架构处理器的研究。MIPS公司成立于1984年,随后在1986年推出第一款R2000处理器,在1992年时被SGI所并购,但随着MIPS架构在桌面市场的失守,后来在1998年脱离了SGI,成为MIPS技术公司,并且在1999年重新制定公司策略,将市场目标导向嵌入式系统,并且统一旗下处理器架构,区分为32-bit以及64-bit两大家族,以技术授权成为主要营利模式。 MIPS除了在手机中应用得比例极小外,其在一般数字消费性、网络语音、个人娱乐、通讯、与商务应用市场有着相当不错的成绩,不过近年来因为其它IP授权公司的兴起,其占有比率稍有衰退。MIPS应用最为广泛的应属家庭视听电器(包含机顶盒)、网通产品以及汽车电子方面。对于MIPS,其核心技术强调的是多执行绪处理能力(Multiple issue,国内也通常称作多发射核技术,以下以此称谓)。一般来说,多核心与多发射是两个并不是互斥的体系,可以彼此结合,然而在嵌入式领域,ARM与MIPS这两大处理器IP厂商对这两个架构的态度不同,造成这两个架构在嵌入式市场上对抗的结果。 MIPS 的多发射体系为MIPS34K系列,此为32位架构处理器,从架构上来看,其实多发射核技术只是为了尽量避免处理单元闲置浪费而为的折衷手段,就是将处理器中的闲置处理单元,分割出来虚拟为另一个核心,以提高处理单元的利用率。在技术上,为了实现硬件多重处理,多核心与多发射两者对于软件最佳化的复杂度方面同样都比单核心架构来得复杂许多。34K核心能执行现有的对称式二路SMP操作系统(OSes)与应用软件,通过操作系统的主动管理,现有的应用软件也能善用多发射处理能力。它亦能应用在多个执行线程各自有不同角色的(AMP或非对称式多重处理)环境下。此外,34K核心能设定一或两个虚拟处理组件(VPE)以及多至5个线程内容(Thread Content),提供相当高的设计弹性。MIPS的多发射在任务切换时,有多余的硬件缓存器可以记录执行状态,避免切换任务时,因为必须重新加载指令,或者是重新执行某部分的工作,造成整个执行线程的延迟。不过即便能够达到同时执行多个任务的能力,多发射处理器本质上仍然是单核心处理器,在单一执行绪

吉林大学嵌入式系统与结构考题及答案

一、单选题 1. (4分) 通常用作堆栈指针的寄存器叫什么名字? ? A. r13 ? B. r14 ? C. r15 ? D. cpsr 得分:0知识点:嵌入式系统与结构作业题收起解析答案A 解析 2. (4分) ARM使用什么样的总线协议? ? A. AMBA ? B. CAN ? C. 1553b总线 ? D. TCP/IP 得分:0知识点:嵌入式系统与结构作业题收起解析答案A 解析

(4分) 通常用作堆栈指针的寄存器叫什么名字? ? A. r13 ? B. r14 ? C. r15 ? D. cpsr 得分:0知识点:嵌入式系统与结构作业题收起解析答案A 解析 4. (4分) 根据ARM命名规则,ARM7TDMI的T代表什么意思? ? A. debug ? B. 支持Thumb指令 ? C. 多媒体处 ? D. 支持Jazelle加速 得分:0知识点:嵌入式系统与结构作业题收起解析答案B 解析 5.

当前程序状态字寄存器的名称是什么? ? A. CPSR ? B. SPSR ? C. MCR ? D. MSR 得分:0知识点:嵌入式系统与结构作业题收起解析答案A 解析 6. (4分) ARM上的外设中断,通常产生哪种异常? ? A. FIQ ? B. IRQ ? C. Data Abort ? D. SWI 得分:0知识点:嵌入式系统与结构作业题收起解析答案B 解析 7. (4分) ARM中位于主存储器和内核之间的快速存储器叫什么?

? A. Cache ? B. MMU ? C. MPU ? D. SDRAM 得分:0知识点:嵌入式系统与结构作业题收起解析答案A 解析 8. (4分) 下列哪条指令可以实现r1=r0×3? ? A. ADD r1,r0,r0,LSL#1 ? B. ADD r1,r0,r0,LSL#3 ? C. MOV r1,r0,LSL#1 ? D. MOV r1,r0,LSL#3 得分:0知识点:嵌入式系统与结构作业题收起解析答案A 解析 9. (4分) ARM上实现内存管理的单元叫什么? ? A. MMU

嵌入式开发工具使用

《嵌入式开发工具使用》 实验报告 学生姓名:______________________ 学号:— 专业班级:_______________ 指导教师:_________________ 完成时间: 实验2嵌入式开发工具使用实验 一?实验目的 了解嵌入式开发工具套件组成,掌握开发工具安装,熟练运用gcc各命令选项,熟练编写Makefile和使用make工具,掌握gdb各命令用于应用程序调试。 二?实验内容 实验 2.1 arm-linux-gcc安装 实验2.2编译工具gcc使用 实验2.3 编写Makefile和使用make编译 实验2.4使用gdb调试应用程序 实验2.5 使用code::blocks进行图形化编程 三?预备知识 Linux使用等 四?实验设备及工具(包括软件调试工具) 硬件:ARM嵌入式开发平台、PC机Pentium100以上、串口线。软件:WinXP或 UBUNTU开发环境。 五?实验步骤 5.1交叉编译工具配置及编译 第一步,解压缩交叉编译器工具,命令为: #cd /tmp _____________________________________________________________________ ? arm-l inu x-gcc可执行文件位于目录 /root/gcc-gdb-make_exp _________________________________________ 。 第二步,修改PATH环境变量,将arm-linux-gcc可执行文件目录添加到PATH环境变量中,命令为 5.2 arm-l inu x-gcc编译工具使用

嵌入式系统与结构

?作业详细信息 ?单选题 ?多选题 ?判断题 ?填空题 作业>>详细信息 ?学期:141511 ?课程名称:嵌入式系统与结构 ?作业名称:嵌入式系统与结构 ?本次作业成绩:0分作业综合成绩:0分 ?本次题目信息:多选题:15 单选题:35 ?多选题个数:15个完成次数:1次 ?单选题个数:35个完成次数:1次 ?指导教师:张晋东所在学院:算机科学与技术学院 ?EMail:zhangjindong_100@https://www.wendangku.net/doc/354198162.html, 作业>>单选题 1.r13 2.r14 3.r15 4.cpsr 1.debug 2.支持Thumb指令 3.多媒体处 4.支持Jazelle加速

1.PowerPC 2.SecurCore 3.OMAP 4.AT91 1.7 2.8 3.9 4.10 1.会 2.不会 3.根据程序的执行状态决定是否影响 4.根据执行的指令决定是否影响 1.Data Abort 2.指令预取异常 3.IRQ中断请求

4.FIQ中断请求 1.37个 2.16个 3.38个 4.39个 1.ADD 2.SUB 3.MUL 4.MOV 1.r1 2.r14 3.spsr 4.cpsr 1.MPU除有内存单元保护功能外,还具有虚拟地址到物理地址的映射 2.两种功能相同,可以在不同的芯片上集成不同的模块

3.MMU的功耗比MPU低 4.MMU除有内存单元保护功能外,还具有虚拟地址到物理地址的映射 1.32位 2.16位 3.除MOV指令32位外,其他指令均为16位 4.可以通过编译器的选项设定其是16位还是32位 1.ADD 2.SUB 3.MUL 4.MOV 1.ADD 2.SUB 3.MUL 4.MOV

(完整版)《嵌入式系统毕业课程设计与实践》

课程设计 课程名称嵌入式系统课程设计与实践题目名称嵌入式最小系统设计 学生学院自动化学院 专业班级电子(2) 学号 学生姓名何延 指导教师尹明

2013 年5月30日

广东工业大学课程设计任务书 题目名称嵌入式最小系统设计 学生学院自动化学院 专业班级电子(2) 姓名何延 学号 一、课程设计的内容 学习LPC2000系列ARM处理器的启动流程,学习嵌入式系统硬件设计(最小系统),学习嵌入式系统应用程序框架,学习在ARM7处理器上移植uCOS-II操作系统的流程及设计流水灯应用程序。 设计实现一个基于LPC2000系列ARM处理器的最小系统,完成操作系统移植,设计流水灯程序。鼓励在完成基本功能的基础上,自由发挥完成其它功能。 二、课程设计的要求与数据 熟悉LPC2000系列ARM处理器的启动流程,掌握嵌入式系统硬件设计(最小系统),掌握嵌入式系统应用程序设计,掌握在ARM7处理器上移植uCOS-II操作系统的流程及设计流水

灯应用程序。 1完成嵌入式系统最小系统硬件设计,并制作硬件平台。 2 在无操作系统情况下,设计流水灯应用程序,并在前述硬件平台上调试、运行。 3 移植UCOS-II操作系统,并设计流水灯应用程序,在前述硬件平台上调试、运行。 三、课程设计应完成的工作 1 嵌入式系统最小系统硬件设计,并调试验证。 2 设计流水灯应用程序,调试、运行。 3 移植uCOS-II操作系统,设计流水灯应用程序,调试、运行。 四、课程设计进程安排

五、应收集的资料及主要参考文献 《LPC2210使用指南》(LPC2210-user_cn.pdf) LPC2131板原理图(Z2418PSCH.pdf) 《ADS开发者指南》(ADS_DeveloperGuide_D.pdf) 发出任务书日期:年月日指导教师签名:

嵌入式技术基础与实践(第3版)课后习题1-8章答案

试阅: hello ---------------------正文 第一章 1.嵌入式系统的基本含义是什么?为什么说单片机是典型的嵌入式系统? 答:即MCU的含义是:在一块芯片上集成了中央处理单元(CPU)、存储器(RAM/ROM等)、定时器/计数器及多种输入输出(I/O)接口的比较完整的数字处理系统。大部分嵌入式系统以MCU为核心进行设计。MCU从体系结构到指令系统都是按照嵌入式系统的应用特点专门设计的,它能很好地满足应用系统的嵌入、面向测控对象、现场可靠运行等方面的要求。因此以MCU为核心的系统是应用最广的嵌入式系统。 2.简述嵌入式系统的特点以及应用领域(举例)。 答:嵌入式系统属于计算机系统,但不单独以通用计算机的面目出现;嵌入式系统开发需要专用工具和特殊方法;使用MCU设计嵌入式系统,数据与程序空间采用不同存储介质;开发嵌入式系统涉及软件、硬件及应用领域的知识;嵌入式系统的其他特点,比如紧张的资源,较高稳定性要求,低功耗,低成本等。 一般用于工业控制,智能家电,日常电子等领域。 日常数码产品:手机,MP3,U盘,相机等。 日常工业类:冰箱,空调,微波炉,汽车等。 3.比较MCU与CPU的区别与联系。 答:CPU是一个单独的PC处理器。而MCU,则有微处理器,存储器(RAM/ROM等)、定时器/计数器及多种输入输出(I/O)接口的比较完整的数字处理系统。所以可以这么说,MCU 是一个包含微处理器的嵌入式系统,而CPU仅仅是一个处理器而已。 4. 总结嵌入式系统常用术语。 硬件:封装,印刷电路板,动态可读写随机存储器与静态可读写随机存储器,只读存储器,闪速存储器,模拟量与开关量。 通信:并行通信,串行通信,串行外设接口,集成电路互连总线,通用串行总线,控制器局域网,背景调试模式,边界扫描测试协议,串行线调试技术。 功能模块及软件:通用输入/输出,A/D与D/A,脉冲宽度调制器,看门狗,液晶显示,发光二级管,键盘,实时操作系统。 5.C语言的那些特性使得它成为嵌入式系统中使用频率最高的高级语言。 答:相比底端汇编,更简单易学;与高级语言如(C++,C#,java等)相比,执行效率高,编译后的编码体积小,而且支持好的编译器还支持嵌入汇编代码;对位的操纵能力很强。

嵌入式系统与结构 吉大考试题库答案

嵌入式系统与结构 1:假设r0=0x01,r1=0x03,正确执行MOV r0,r1后,r0的值为?3.0x03 2:ARM上实现内存管理的单元叫什么?1.MMU 3:ARM采用多少位的体系结构?2.32位 4:Thumb指令集的长度是多少?2.16位 5:下列描述中,哪些是正确的?1.ARM包含除法硬件 6:程序状态寄存器CPSR的C位表示什么?3.运算结果产生进位 7:指令MOV r0,r1,LSL,#3中,LSL的作用是?2.逻辑左移 8:下列哪条指令,可以实现将地址单元(r1+r2×4)的数据读到r0?1.LDR r0,[r1,r2,LSL ×2] 9:ARM使用什么样的总线协议?1.AMBA 10:用户模式下的可见通用寄存器个数为多少个?2.16个 11:处理器上电默认进入哪种状态?1.ARM 12:提供了安全解决方案的ARM系列产品是以下系列中的哪一种? 2.SecurCore 13:当前程序状态字寄存器的名称是什么?1.CPSR 14:CPSR寄存器的作用是什么?1.存储当前的处理器状态 15:下面所列指令,哪一条指令语法格式正确?2.ADD r1,r2,r3 16:ARM汇编指令中,用于实现减法运算的是哪条指令?2.SUB 17:ARM上实现内存管理的单元叫什么?1.MMU 18:ARM的全称是什么?1.Advanced RISR Machines 19:下列哪些指令可以协处理器的访问?1.MRC

20:ARM用于响应快速外部中断的处理器模式叫什么?1.FIQ 21:下面哪条指令使用了ARM中的桶型移位寄存器?3.STR r0,[r1,r2,LSL #2] 22:ARM共有几种处理器模式?1.7 23:假设r0=0x05,r1=0x03,正确执行SUB r0,r0,r1后,r0的值为?2.0x02 24:ATPCS中规定,使用哪个寄存器存放堆栈基地址?2.r13 25:如何禁止IRQ中断?1.将CPSR寄存器的I位置1 26:ATPCS中规定,用哪些寄存器传递参数?1.r0~r3 27:ARM上电后进入哪种模式?2.管理模式 28:什么样的ARM指令可以条件执行?1.所有的 29:ATPCS中规定,使用哪个寄存器存放程序的返回地址?1.r14 30:Thumb指令集的长度是多少?1.16 31:当程序直接改写cpsr来切换模式时,cpsr会被复制到spsr?2.不会32:下列哪些指令可以访问程序状态寄存器?1.MRS 33:ARM中位于主存储器和内核之间的快速存储器叫什么?1.Cache 34:ARM使用那个寄存器存放程序的返回地址?1.R14 35:ARM指令中对立即数的操作有一定限制,下面所列立即数中,属于合法立即数的是哪一个?4.0xff 4:下列那个寄存器被当作程序计数器pc?4.r15 5:对MMU和MPU的区别描述正确的是?4.MMU除有内存单元保护功能外,还具有虚拟地址到物理地址的映射功能 7:ARM中哪个异常优先级最高?1.Reset 9:ARM上电执行下列哪种异常?1.Reset

嵌入式数据结构

程序的执行与嵌入式编码 这一节主要描述的是主要数据结构的代码生成和嵌入式编码器实时车间。他也总结概括了由文件和头文件构成的编码器实时车间嵌入式的程序,还有描述了怎么找到他们。另外,这一节将描述如何生成实时嵌入式编码器车间项目,从最高水平下降到定时器中断水平。本章节包含下列主题:(略) 一:代码模块的数据结构 实时模型数据结构 实时嵌入式编码在车间实时模型数据结构中封装关于根模型的信息。我们把数据结构的实时模型叫做运转计时器(简称rtm)。 为了减少内存需求,rtm只包含响应你模型的信息。例如,相关领域的数据只有在拥有MAT-file具有代码生成选项时启用。Rtm可能也包含有关时间,结算器,还有模型数据的特殊模型的rtM相关信息,例如:输入,输出,声明,参数。 由于默认,rtM包含一个错误状态,在此时你的代码就可以监视或者设置。如果你不需要日志或监控你的应用程序错误状态,就选择错误状态实时抑制模型数据结构的选项。这将进一步减少内存使用。选择此选项,也可能导致rtM从生成的代码中完全消失。 rtM符号的定义的生成代码如下: ?Structure definition (in model.h): struct _RT_MODEL_model_Tag { ... }; ?Forward declaration typedef (in model_types.h): typedef struct _RT_MODEL_model_Tag RT_MODEL_model; ?Variable and pointer declarations (in model.c): RT_MODEL_model model_M_; RT_MODEL_model *model_M = &model_M_; ?Variable export declaration (in model.h): extern RT_MODEL_model *model_M; 栈宏 实时车间提供的嵌入式编码器栈宏,使你的代码能够与rtM界面有接口。通过model.h,你的代码可以使用宏,并可以进入他们引用的任何字段。 如果你的代码是连接到一个单一的模型,一般来说,你应该把rtM指向model_M,使用宏来访问model_M,就像下面的代码片断。 #include "model.h" const char *errStatus = rtMGetErrorStatus(model_M); 你的代码与rtMs的接口有多个,只需要把头文件对应于每个模型,就像下面的代码片断。 #include "modelA.h" /* Make model A entry points visible */ #include "modelB.h" /* Make model B entry points visible */ void myHandWrittenFunction(void) { const char_T *errStatus; modelA_initialize(1); /* Call model A initializer */ modelB_initialize(1); /* Call model B initializer */ /* Refer to model A s rtM */ errStatus = rtmGetErrorStatus(modelA_M);

嵌入式系统

第一章绪论 1.嵌入式系统的定义、特点和分类 2.嵌入式操作系统 3.嵌入式系统的选型 4.嵌入式系统的发展趋势 5.嵌入式系统的关键技术 6.嵌入式系统的应用 思考与练习 1.什么是嵌入式系统?嵌入式系统的特点是什么? 2.请说出嵌入式系统与其它商用计算机系统的区别。 3.嵌入式系统的关键技术有哪些? 4.请说明嵌入式系统技术发展及开发应用的趋势。 5.你知道嵌入式系统在我们日常生活中哪些设备中应用?说明其采用的处理器是什么?采用的哪一个嵌入式操作系统? 6.开发嵌入式系统的计算机语言主要有哪几种?分别用在什么场合?7. 嵌入式系统和专用集成电路的关系是什么? 第二章嵌入式系统设计方法 1. 需求分析与系统分析法 2.软硬件协同设计方法 3.嵌入式硬件开发方法 4.嵌入式软件开发方法 5.构件式开发方法 6.软件调试与软件测试方法 思考与练习 1.请说出嵌入式系统设计的主要方法及设计流程。在嵌入式系统开发的总体设计中,需要进行哪几方面的工作? 2.嵌入式硬件调试的主要方法及技术手段有哪些? 3.什么是构件式开发方法?说明该方法对嵌入式系统开发具有什么意义,并举例说明。4.需求分析阶段分为哪几个步骤?每个步骤完成什么工作? 5.在进行系统设计时,概要设计和详细设计的工作内容有什么不同? 6.在嵌入式系统实现阶段,需要选择开发平台,通常开发平台的选择包括哪些内容?7.在当今IT 时代,为了使产品尽快进入市场,就产品开发阶段,你认为有哪些方法可以加快产品的开发速度? 8.什么是“黑盒”测试?什么是“白盒”测试?什么是“灰盒”测试? 9.嵌入式系统开发中,使用软件组件技术有什么好处? 10.什么是知识产权核(Intellectual Property Core,简称IP Core)?指出“软知识产权核(Soft IP Core)”、“硬知识产权核(Hard IP Core)”、“固知识产权核(Firm IP Core)”的意义和差别。 11.根据嵌入式软件开发的不同阶段,嵌入式开发工具有哪些种类? 12.从底层硬件到上层应用,嵌入式软件的开发可以分为哪几种? 13.什么是交叉开发环境? 14.什么是OCD 调试方法?指出OCD 的主要形式JTAG 和BDM 的特点和区别? 15.嵌入式软件的调试运行环境和固化运行环境主要区别是什么?

嵌入式软件开发流程图

嵌入式软件开发流程 一、嵌入式软件开发流程 1.1 嵌入式系统开发概述 由嵌入式系统本身的特性所影响,嵌入式系统开发与通用系统的开发有很大的区别。嵌入式系统的开发主要分为系统总体开发、嵌入式硬件开发和嵌入式软件开发3大部分,其总体流程图如图1.1所示。 图1.1 嵌入式系统开发流程图 在系统总体开发中,由于嵌入式系统与硬件依赖非常紧密,往往某些需求只能通过特定的硬件才能实现,因此需要进行处理器选型,以更好地满足产品的需求。另外,对于有些硬件和软件都可以实现的功能,就需要在成本和性能上做出抉择。往往通过硬件实现会增加产品的成本,但能大大提高产品的性能和可靠性。 再次,开发环境的选择对于嵌入式系统的开发也有很大的影响。这里的开发环境包括嵌入式操作系统的选择以及开发工具的选择等。比如,对开发成本和进度限制较大的产品可以选择嵌入式Linux,对实时性要求非常高的产品可以选择Vxworks等。

1.2 嵌入式软件开发概述 嵌入式软件开发总体流程为图4.15中“软件设计实现”部分所示,它同通用计算机软件开发一样,分为需求分析、软件概要设计、软件详细设计、软件实现和软件测试。其中嵌入式软件需求分析与硬件的需求分析合二为一,故没有分开画出。 由于在嵌入式软件开发的工具非常多,为了更好地帮助读者选择开发工具,下面首先对嵌入式软件开发过程中所使用的工具做一简单归纳。 嵌入式软件的开发工具根据不同的开发过程而划分,比如在需求分析阶段,可以选择IBM的Rational Rose等软件,而在程序开发阶段可以采用CodeWarrior(下面要介绍的ADS 的一个工具)等,在调试阶段所用的Multi-ICE等。同时,不同的嵌入式操作系统往往会有配套的开发工具,比如Vxworks有集成开发环境Tornado,WindowsCE的集成开发环境WindowsCE Platform等。此外,不同的处理器可能还有对应的开发工具,比如ARM的常用集成开发工具ADS、IAR和RealView等。在这里,大多数软件都有比较高的使用费用,但也可以大大加快产品的开发进度,用户可以根据需求自行选择。图4.16是嵌入式开发的不同阶段的常用软件。 图1.2 嵌入式开发不同阶段的常用软件 嵌入式系统的软件开发与通常软件开发的区别主要在于软件实现部分,其中又可以分为编译和调试两部分,下面分别对这两部分进行讲解。 1.交叉编译 嵌入式软件开发所采用的编译为交叉编译。所谓交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。在第3章中已经提到,编译的最主要的工作就在将程序转化成运行该程序的CPU所能识别的机器代码,由于不同的体系结构有不同的指令系统。因此,不同的CPU需要有相应的编译器,而交叉编译就如同翻译一样,把相同的程序代码翻译成不同CPU的对应可执行二进制文件。要注意的是,编译器本身也是程序,也要在与之对应的某一个CPU平台上运行。嵌入式系统交叉编译环境如图4.17所示。

奥鹏[吉林大学]吉大20年3月《嵌入式系统与结构》作业考核试题(100分)非免费(参考答案)

拿答案:bao0913a 【奥鹏】-[吉林大学]吉大20年3月《嵌入式系统与结构》作业考核试题试卷总分:100 得分:100 第1题,FIQ总的延迟时间为()周期 A、27 B、28 C、29 D、30 正确答案: 第2题,UC/OS操作系统的主要开发语言是()。 A、汇编语言 B、C++ C、C D、JAVA 正确答案: 第3题,以下叙述中,不符合RISC指令系统特点的是()。 A、指令长度固定,指令种类少 B、寻址方式种类丰富,指令功能增强 C、设置大量通用寄存器,访问存储器指令简单 D、使用频率较高的一些简单指令 正确答案: 第4题,嵌入式系统软件的启动过程是()。 A、bootloader-操作系统-应用程序 B、bootloader-应用程序-操作系统 C、操作系统-bootloader-应用程序 D、应用程序-bootloader-操作系统 正确答案: 第5题,一个任务被唤醒,意味着()。 A、该任务重新占有了CPU B、它的优先级变为最大 C、其任务移至等待队列首

D、任务变为就绪状态 正确答案: 第6题,RISC特点描述正确的是()。 A、指令系统数量多 B、没有较长执行时间的指令 C、较少的寻址模式 D、编码长度固定 正确答案:,C,D 第7题,嵌入式系统一般由()等几个部分组成。 A、嵌入式微处理器 B、外围硬件设备 C、嵌入式操作系统(可选) D、用户的应用软件系统 正确答案:,B,C,D 第8题,ARM7TDMI处理器的存储器的存储有哪几种格式(): A、大端格式 B、小端格式 C、无格式 D、非线性格式 正确答案:,B 第9题,堆栈寻址有哪几种方式(): A、满递减 B、空递减 C、满递增 D、空递增 正确答案:,B,C,D 第10题,流水线技术特点描述正确的是()。 A、流水线可分为若干相互联系的子过程 B、实现子过程的功能所需时间尽可能相等

嵌入式技术基础与实践复习题参考答案

嵌入式技术基础与实践(第二版) 习题参考答案 目录 嵌入式技术基础与实践(第二版) (1) 习题参考答案 (1) 第1章概述习题参考答案 (2) 第2章FreescaleS08微控制器习题参考答案 (3) 第3章第一个样例程序及工程组织习题参考答案 (4) 第5章串行通信接口SCI习题参考答案 (6) 第6章GPIO的应用实例—键盘、LED与LCD习题参考答案 (9) 第7章定时器模块习题参考答案 (10) 第8章串行外设接口SPI习题参考答案 (11) 第9章Flash存储器在线编程习题参考答案 (13)

第1章概述习题参考答案 1.嵌入式系统的基本含义是什么?为什么说单片机是典型的嵌入式系统? 答:即MCU的含义是:在一块芯片上集成了中央处理单元(CPU)、存储器(RAM/ROM等)、定时器/计数器及多种输入输出(I/O)接口的比较完整的数字处理系统。大部分嵌入式系统以MCU为核心进行设计。MCU从体系结构到指令系统都是按照嵌入式系统的应用特点专门设计的,它能很好地满足应用系统的嵌入、面向测控对象、现场可靠运行等方面的要求。因此以MCU为核心的系统是应用最广的嵌入式系统。 2.简述嵌入式系统的特点以及应用领域。 答:嵌入式系统属于计算机系统,但不单独以通用计算机的面目出现;嵌入式系统开发需要专用工具和特殊方法;使用MCU设计嵌入式系统,数据与程序空间采用不同存储介质;开发嵌入式系统涉及软件、硬件及应用领域的知识;嵌入式系统的其他特点,比如紧的资源,较高稳定性要求,低功耗,低成本等。一般用于工业控制,智能家电,日常电子等领域。 4.比较MCU与CPU的区别与联系。 答:CPU是一个单独的PC处理器。而MCU,则有微处理器,存储器(RAM/ROM等)、定时器/计数器及多种输入输出(I/O)接口的比较完整的数字处理系统。所以可以这么说,MCU是一个包含微处理器的嵌入式系统,而CPU紧紧是一个处理器而已。

相关文档