一、选择题
1.下面哪一类嵌入式处理器最适合用于工业控制( )。
A.嵌入式微处理器 B.微控制器
C. DSP D.以上都不合适
2. 存储一个32位数0x2168465到2000H~2003H四个字节单元中,若以大端模式存储,则2000H存储单元的内容为( )。
A.0x21 B.0x68 C.0x65 D.0x02
3.以下关于GPIO的描述,错误的是?( )
A. 共有117个多功能I/O端口
B. GPxCON配置端口复用功能
C. 包含GPxCON,GPxDAT,GPxUP共3个寄存器
D. GPA没有上拉电阻配置功能
4.下面哪一种工作模式不属于ARM特权模式( )。
A.用户模式 B.系统模式 C.软中断模式 D.FIQ模式
5. 以下关于RAM,ROM,Flash的描述,正确的是()。
A. 全部为非易失性存储器
B. 全部为并行随机存储器
C. RAM存取速度最快
D. Flash不可以片内执行程序
6. 在嵌入式系统的存储结构中,存取速度最快的是( )。
A.内存 B. Cache C. Flash D.寄存器组
4.以下S3C2440的定时器描述错误的是( )。
A.所有定时器均具备PWM功能
B.两级预分频可取的更宽的定时范围
C.基本时钟输入单位是PCLK
D.核心是比较器和计数器
7.以下关于S3C2410的存储控制器,以下描述错误的是?( )
A.设计中,可将SDRAM连接到BANK0
B.共27位地址总线,容量为1G,分8个BANK
C.通过steptone 技术,可实现Nand Flash启动
D.可通过OM1,OM0选择16位或32位数据宽度
8. ARM7TMDI的工作状态包括()。
A.测试状态和运行状态 B.挂起状态和就绪状态
C. 就绪状态和运行状态 D.ARM状态和Thumb状态
9.SDRAM,Nor Flash以及Nand Flash的存取速度由慢到快的速度排序是( )
A.SDRAM,Nor Flash, Nand Flash
B.SDRAM,Nand Flash,Nor Flash
C.Nand Flash, Nor Flash, SDRAM
D.Nor Flash, Nand Flash,SDRAM
10.以下哪对信号线用于UART的流控?( )
A.TXD-RXD
B.RTS-CTS
C.DSR-DTR
D.DCD-RING
11.下面哪一种工作模式不属于ARM特权模式( )。
A.用户模式 B.系统模式 C.软中断模式 D.FIQ模式
12.S3C2410提供的符合I2C协议的设备连接串行线是( )。
A.SCL和RTX B.RTX和RCX C.SCL和SDA D.SDA和RCX
13. 以下哪个不是ARM的7种运行状态之一:( )
A.快中断状态 B. 挂起状态 C.中断状态 D.无定义状态
14. 下列( )设备是字符设备。
A. hdc B. fd0 C. hda1 D. tty1
15. ARM指令集和Thumb指令集分别是( )位的。
A. 32位,32位 B. 16位,32位
C. 16位,16位 D. 32位,16位
16. 嵌入式Linux操作系统一般在ROM中存放的布局并不包括( )
A.Bootloader B.内核参数区 C.Linux内核 D.交叉编译器
17. 在大多数Linux发行版本中,以下哪个属于块设备 ( )。
A.串行口 B.硬盘 C.虚拟终端 D.打印机
18.以下关于S3C2410时钟源的描述,哪个是错误的?( )
A.PCLK用于为CPU内核提供时钟
B.UPLL为USB提供时钟源
C.输出时钟取决于M,P,S分频器的值
D.MPLL提供三路时钟输出,FCLK,HCLK以及PCLK。
19. NAND FLASH和NOR FLASH的区别正确的是( )
A.NOR的读速度比NAND稍慢 B.NAND的写入速度比NOR慢很多
C.NAND的擦除速度比NOR慢 D.大多数写入操作需要先进行擦除操作
20.以下关于ARM920T在ARM状态下的寄存器的描述,正确的是( )。
A.R14 = R15 + 4
B.R1~ R15在所有模式下定义均相同
C.CPSR 为当前状态寄存器,低5位用于决定处理器工作模式
D.R13为程序计数器,R14为堆栈指针寄存器
二、简答题
1.什么是扇区,块,段?
扇区是块设备硬件对数据处理的基本单位,硬件每次传送一个扇区的数据到内存中。在内核模块中,通常以512字节来定义扇区的大小。
块是由Linux制定对内核或文件系统等数据处理的基本单位。通常,1个块由1个或多个扇区组成。因此,块必须是扇区大小的整数倍。
段是由若干个相邻的块组成,是Linux内存管理机制中一个内存页或者内存页的一部分。段的大小与块相关,是块的整数倍。
2.UART和I2C的区别。
通用异步收发传输器,通常称作UART,是一种异步收发传输器,是电脑硬件的一部分。将资料由串行通信与并行通信间作传输转换,作为并行输入成为串行输出的芯片,通常集成于其他通讯接口的连结上。与标准信号幅度变换芯片进行搭配,作为连接外部设备的接口。
I2C总线是两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。I2C 总线支持任何IC 生产过程。通过串行数据线和串行时钟线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别,而且都可以作为一个发送器或接收器。
3.什么是UART?并简单描述UART的数据传输流程。
通用异步收发传输器通常被称作UART,是电脑硬件的一部分,将资料由串行通信与并行通信间作传输转换。UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来主机与辅助设备通信,如汽车音响与外接AP之间的通信。
(1)平时数据线处于“空闭”状态(1状态)。
(2)当要发送数据时,UART改变TxD数据线的状态(变为0状态)并维持1位的时间,这样接收方检测到开始位后,再等待1.5位的时间就开始一位一位地检测数据线的状态得到所传输的数据。
(3)UART一帧中可以有5、6、7或8位的数据,发送方一位一位地改变数据线的状态将它们发送出去,首先发送最低位。
(4)如果使用校验功能,UART在发送完数据位后,还要发送1个校验位。有两种校验方法:奇校验、偶校验---数据位连同校验位中,“1”的数目等于奇数或偶数。
(5)最后,发送停止位,数据线恢复到“空闭”状态(1-状态)。
4.字符设备和块设备之间的主要区别是什么?
块和字符是两种不同的访问设备的策略;同一个设备可以同时支持块和字符两种访问策略;字符设备只能顺序访问,而块设备可以随机访问。Nand、SD卡(电储存)等随机访问效率等同于顺序访问。传统的机械式块设备虽可以随机访问,但连续访问效率更高,因此块设备驱动中有排序逻辑将用户的随机访问重新调整成尽量连续访问以提升效率。块设备通过系统缓存进行读取,不是直接和物理磁盘读取。字符设备可直接物理磁盘读取,不经过系统缓存。
5.简单描述ARM体系的主要特征
Load/Store体系结构;大量的寄存器,都可用于多种用途;三地址指令(两个源操作数寄存器和结果寄存器独立设定);每条指令都可以条件执行,包含非常强大的多寄存器Load和Store指令;能在单时钟周期内完成操作数的移位操作;能过协处理器指令集来扩展ARM指令集,包括在编程模式下增加了新的寄存器和数据类型;在Thumb体系结构中以高密度16位压缩形式表示指令集。
6.对于S3C2440,进行嵌入式Linux开发一般需要哪几个步骤?
1)建立开发环境
操作系统一般使用RedHat-Linux,版本从7到9都可以,选择定制安装或全部安装,通过网络下载相应的GCC交叉编译器进行安装(例如arm-Linux-gcc、arm-μclibc-gcc),或者安装产品厂家提供的交叉编译器。
2)配置开发主机
配置MINICOM,一般的参数为波特率为115 200bps,数据位为8位,停止位为1,无奇偶校验,软件硬件流控设为无。
3)建立引导装载程序BOOTLOADER
从网络上下载一些公开源代码的BOOTLOADER,根据自己具体的芯片进行移植修改。
4)下载别人已经移植好的Linux操作系统:如μCLinux、ARM-Linux、PPC-Linux等。
5)建立根文件系统
从www.busybox.net下载使用BUSYBOX软件进行功能裁减,产生一个最基本的根文件系统,再根据自己的应用需要添加其他程序。
6)建立应用程序的Flash磁盘分区:一般使用JFFS2或YAFFS文件系统。
7)开发应用程序
8)烧写内核、根文件系统、应用程序
9)发布产品7.ARM中断控制器处理中断的流程。
1.保存现场。保存当前的PC值到R14,保存当前的程序运行状态到SPSR。
2.模式切换。 根据发生的中断类型,进入IRQ模式或FIQ模式。
3.获取中断源。若是IRQ中断,则PC指针跳到0x18处;若是FIQ中断,则跳到0x1C处
4.接下来PC指针跳入中断服务子程序处理中断。中断处理为各种中断定义不同的优先级别,并为每一个中断设置一个中断标志位。当发生中断时,通过判断中断优先级以及访问中断标志位的状态来识别到底哪一个中断发生了。进而调用相应的函数进行中断处理。
5.中断返回,恢复现场 当完成中断服务子程序后,将SPSR中保存的程序运行状态恢复到CPSR中,R14中保存的被中断程序的地址恢复到PC中,进而继续执行被中断的程序。
8.嵌入式微处理器和嵌入式微控制器的区别。
嵌入式微处理器,以CPU为基础。将微处理器装配在专门设计的电路板上,只保留和嵌入式应用有关的功能;外接电路必须包括ROM等各种外设等器件
嵌入式微控制器又称单片机,是将整个计算机系统浓缩集成到一块芯片中。一般以某种微处理器内核为核心,芯片内部集成ROM/EPROM、RAM、定时/计数器等各种必要功能和外设。
9.驱动程序与应用程序的区别。
应用程序一般有一个 main 函数,从头到尾执行一个任务。驱动程序却不同,它没有 main 函数,通过使用宏 module_init(初始化函数名),将初始化函数加入内核全局初始化函数列表中,在内核初始化时执行驱动的初始化函数,从而完成驱动的初始化和注册。之后驱动便等待被应用软件调用。驱动程序中有一个宏 moudule_exit(退出处理函数名)注册退出处理函数。它在驱动退出时被调用。应用程序可以和 GLIBC 库连接,因此可以包含标准的头文件,在驱动程序中不能使用标准 C 库,因此不能调用所有的 C 库函数包含的头文件只能是内核的头文件。
10.简单描述MMU。
MMU是内存管理单元,有时称作分页内存管理单元(PMMU)。它是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换、内存保护、中央处理器高速缓存的控制,在较为简单的计算机体系结构中,负责总线的仲裁以及存储体切换。
11.简单描述下NOR Flash和NAND Flash的区别。
读写的基本单位不同。应用程序对NOR芯片操作以“字”为基本单位。应用程序对NAND芯片操作是以“块”为基本单位。要修改NAND芯片中一个字节,必须重写整个数据块。NOR闪存是随机存储介质,用于数据量较小的场合;NAND闪存是连续存储介质,适合存放大的数据。NOR地址线和数据线分开,所以NOR芯片可以像SRAM一样连在数据线上。NOR芯片的使用也类似于通常的内存芯片,它的传输效率很高,可执行程序可以在芯片内执行,不必再把代码 读到系统RAM中。由于NOR的这个特点,嵌入式系统中经常将NOR芯片做启动芯片使用。而NAND共用地址和数据总线,需要额外联结一些控制的输入输出,所以直接将NAND芯片做启动芯片比较难。NOR的存储密度低,所以存储一个字节的成本也较高,而NAND闪存的存储密度和存储容量均比较高。
12.什么是驱动程序?请详细描述。
驱动程序一般指的是设备驱动程序,是一种可以使计算机和设备进行相互通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作。因此,驱动程序被比作“ 硬件的灵魂”、“硬件的主宰”、“硬件和系统之间的桥梁”等。
13.简单说明字符设备注册函数int register_chrdev(unsigned int major,const char *name,struct file_operations *fops)中参数的意义。
其中: major是为设备驱动程序向系统申请的主设备号,如果是0,则系统为此驱动程序动态分配一个主设备好。name是设备名,fops是对各个调用的入口点说明,此函数返回0时表示成功;返回EINVAL,表示申请的主设备非法,主要原因是主设备号大于系统所允许的最大设备号;返回EBUSY,表示申请的主设备号正在被其他设备程序使用。如果动态分配主设备号成功,此函数将返回所分配的主设备号。
14.简单说明字符设备注销函数int unregister_chrdev(unsigned int major,const char *name)中参数的意义。
其中:Marjor为主设备号,name为设备名。Linux内核把name和major在内核注册的名称对比,如果不相等卸载失败,并返回-EINVAL;如果major大于最大的设备号。也返回-EINVAL
15.简单说明下面两个函数的意义以及函数参数的意义。
unsigned long copy_to_user(void * to,const void *from,usigned long len);
unsigned long copy_from_user(void * to,const void *from,usigned long len);这两个函数用于在用户空间和内核空间之间进行数据拷贝,两个函数具有相同的参数和返回值,事实上,除了数据的拷贝方向不一样外,它们是一致的。函数 copy_to_user()是把数据从内核空间拷贝到用户空间,而函数 copy_from_user()是把数据从用户空间拷贝到内核空间。
参数:
to:数据的目标地址,即数据将要拷贝到哪里;
from:为数据的源地址,即数据从哪里拷贝;
len:需要拷贝的数据个数,以字节为单位;16.简述arm处理器的工作模式
ARM体系的CPU有以下7种工作模式
(1)用户模式:用于正常执行程序;
(2)快速中断模式:用于高速数据传输;
(3)外部中断模式:用于通常的中断处理;
(4)管理模式:操作系统使用的保护模式;
(5)数据访问终止模式:当数据或指令预取终止时进入该模式,可用于虚拟存储以及存储保护。
(6)系统模式:运行具有特权的操作系统任务;
(7)未定义指令中止模式:当未定义的指令执行时进入该模式,可用于支持硬件。
17.请完成以下SDRAM与S3C2410的硬件连线设计,其中A0 为SDRAM的第一条地址线引脚标号,BA0,BA1为SDRAM的BANK引脚标号,请将S3C2410相应的引脚填入到对应表格中,无需连接的请打✖号。
SDRAM的地址线用A[n]表示,即A0,A1,….
S3C2410的地址线用ADDR[n]表示,即ADDR0,ADDR1,…
BANK数量
容量
总线宽度
芯片数量
A0
BA0
BA1
2
4M
8BIT
1
ADDR0
ADDR21
2
16M
8BIT
2
ADDR1
ADDR23
4
64M
16BIT
2
ADDR2
ADDR24
ADDR25
4
128M
32BIT
1
ADDR2
ADDR25
ADDR26
18.已知S3C2410开发板,外部晶振频率Fin = 12M。请根据如下设计要求计算相关寄存器的值并填入表中。不使用的位设置为0,要求写出计算过程。附图为相关寄存器取值说明。
- 时钟输出:FCLK=200MHz,HCLK=100MHz,PCLK=50MHz
- UART0 工作模式为:PCLK输入,查询方式,8数据位,1停止位,无校验,波特率:115200
寄存器值表(使用16进制)
CLKDIVN
MPLLCON
GPHCON
ULCON0
UCON0
UBRDIV0
CLKDIVN计算:
因FCLK:HCKL:PCLK=4:2:1,根据表CLKDIVN可知,
PDIVN=[1],HDIVN=[0:1],DIVN_UPLL=[0],故:CLKDIVN=0x03
MPLLCON计算:
根据公式:MPLL(FCLK)=(m*Fin)/(p*2^s);其中m=MDIV+8,p=PDIV+2,s=SDIV
可知:200=12m/(p*2^s),显然该方程无唯一解,考虑MDIV,PDIV以及SDIV的取值范围分别为MDIV[0~255],PDIV[0~63],SDIV[0~3],固当分式分子分母为整数较容易计算,若使m=100,则:p=4,s=0,故:
MDIV=92=Ox5c; PDIV=4=Ox04; SDIV=0=0x00
因此:MPLLCON=Ox5c040
计算GPHCON:
UART0引脚与GPH2,GPH3复用,因此需要将其设置位UART模式,根据表GPHCON定义GPH2=[10],GPH3=[10],其他位设为0
故:GPHCON=0xA0
计算ULCON:
由题知,UART0采用8数据位,1停止位,无校验,根据ULCON定义可知
ULCON=Ox03
计算UCON:
UARTO采用查询方式,故UCON[3:2]=UCON[1:0]=[01];UART0时钟选择PCLK,故UCON[10]=[0];故UCON=0x05
计算UBRDIV0
UART0波特率为115200,PCLK=50MHZ,故:
UBRDIV0=(int)50000000/(115200X16)-1=26=0x1A19.某设计采用CPU采用S3C2410,Nand Flash采用K9F1280,以下代码是CPU对该Nand Flash的读取操作的代码,阅读代码并完成以下问题。
- 阅读代码2~14行,NFADDR是什么?并给出NFADDR的地址。
- 阅读代码60~73行,解释该段代码的作用是什么,给出该代码段的关键语句注释。
- 利用代码中的已实现函数,完成向flash写入数据的功能,函数原型如下:
/**
* 向页写入数据
* @param buf 待写入数据段的首地址
* @param page_addr 页地址
*/
void nand_program(unsigned char *buf, unsigned long page_addr){
// code here
return;
}
下表为完成代码编写需要的命令字定义表。
以下为程序代码:
(1)阅读代码2~14行,NFADDR是什么?并给出NFADDR的地址。
答:NFADDR是NANDFlash的地址寄存器,NFADDR的地址为0x4E000008。
(2)阅读代码60~73行,解释该段代码的作用是什么,给出该代码段的关键语句注释。
答:本段代码的作用是向NAND Flash(即NFADDR)地址寄存器写入地址。
关键代码注释:
static void write_addr(unsigned int addr)
{
int i;
// 指向NFADDR地址寄存器
volatile unsigned char *p = (volatile unsigned char *)&s3c2410nand->NFADDR;
// 写入地址A0~A7
*p = addr & 0xff;
for(i=0; i<10; i++);
// 写入地址A9~A16
*p = (addr >> 9) & 0xff;
for(i=0; i<10; i++);
// 写入地址A17~A24
*p = (addr >> 17) & 0xff;
for(i=0; i<10; i++);
// 写入地址A25
*p = (addr >> 25) & 0xff;
for(i=0; i<10; i++);
}
(3)利用代码中的已实现函数,完成向flash写入数据的功能,函数原型如下:
答:
/**
* 向页写入数据
* @param buf 待写入数据段的首地址
* @param page_addr 页地址
*/
void nand_program(unsigned char *buf, unsigned long page_addr){
nand_init(); // 初始化
nand_select_chip(); // 片选芯片
write_cmd(128); // 写0x80命令字,开始写入地址和数据
write_addr(page_addr); // 写页地址
wait_idle(); // 等待nand flash空闲可操作
// 将数据写入页
*p = (volatile unsigned char *)&s3c2410nand->NFDATA;
for (int i = 0; i < 528; i++)
{
unsigned char *p = *buf;
buf = buf++;
}
write_cmd(16); // 写入0x10控制字,开始烧写数据
wait_idle(); // 等待nand flash空闲可操作
write_cmd(112); // 写入读取芯片状态命令字0x70
// 读取芯片状态数据,判读是否读写成功
unsigned char writeStauts = read_data() & 0x01;
if (writeStauts)
// process code here if success to program
else
// process code here if fail to program
return;
}
20.某设计采用CPU采用S3C2410,Nand Flash采用K9F1280,以下代码是CPU对该Nand Flash的读取操作的代码,阅读代码并完成以下问题。
1)阅读代码2~14行,给出变量NFCMD的值,说明该变量代表的含义是什么?
2)阅读代码92~105行,该段代码为由Nand Flash读取数据到CPU内存,给出该代码段的关键语句注释(95~103行)。
3)利用代码中的已实现函数,完成flash数据擦除功能(块擦除)的功能,函数原型如下:
/**
* 块擦除
* @param block_addr 要擦除的块地址
*/
void nand_erase_block(unsigned long block_addr){
// code here
return;
}
下表为K9F1280命令字定义表
以下为程序代码:
1)阅读代码2~14行,给出变量NFCMD的值,说明该变量代表的含义是什么?
答:NFCMD的值为0xff,该变量代表NFCMD寄存器的值。
2)阅读代码92~105行,解释该段代码的作用是什么?给出该代码段的关键语句注释。
答:本段代码的作用是从NAND Flash存储器中读数据。
关键代码注释:
void nand_read(unsigned char *buf, unsigned long start_addr, int size)
{
int i, j;
nand_init( ) / * NAND初始化*/
nand_select_chip(); /* 选中芯片 */
for(i=start_addr; i < (start_addr + size);) /* 设地址 */
{
write_cmd(0); /* 发出READ0命令 */
write_addr(i); /* 写地址 */
wait_idle(); /* 等待*/
for(j=0; j < NAND_SECTOR_SIZE; j++, i++) /* 设地址 */
{
*buf = read_data(); /* 读数据*/
buf++; /* 数据缓存器自动加1*/
}
}
3)利用代码中的已实现函数,完成flash数据擦除的功能,函数原型如下:
答:
void nand_erase_block(unsigned long block_addr)
{
int i;
nand_init(); // 初始化
nand_select_chip(); // 片选芯片
write_cmd(0x60); // 写0x60命令字,开始擦除数据
write_addr(block_addr); // 写块地址
wait_idle(); // 等待nand flash空闲可操作
write_cmd(0xd0); // 写入0xd0控制字
wait_idle(); // 等待nand flash空闲可操作
return;
}
21.编写hello_module驱动模块。要求需要具有各个功能模块,仅仅在模块注册时输出“hello,world!”,模块卸载时输出“goodbye,world!”。
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "hello, world!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "goodbye, world!\n");
}
module_init(hello_init);
module_exit(hello_exit);
22.一个软件系统包括应用程序、库、操作系统,驱动程序。开发人员可以只关注自己熟悉的部分,对于相邻层,只需要了解它的接口,无需关注它的实现细节。现在需要完成如下任务:
- 什么是驱动程序?并简单描述驱动程序的开发步骤。
- 驱动程序进行模块化后,如何实现向内核注册。
- 请写一个点亮LED灯的驱动程序。
1)英文名为“Device Driver”,全称为“设备驱动程序”是一种可以使计算机和设备通信的特殊程序,可以 说相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 因此,驱动程序被誉为“ 硬件的灵魂”、“硬件的主宰”、和“硬件和系统之间的桥梁” 。
- 查看原理图、数据手册。了解设备的操作方法。
- 在内核找到相近的驱动程序,以它为模板进行开发。
- 实现驱动程序的初始化。
- 设计所要实现的操作。
- 实现中断服务。
- 编译驱动程序到内核。
- 测试驱动程序。
2)模块初始化时,将主设备号与file operations结构一起向内核注册。
驱动程序有一个初始化函数,在安装驱动程序时会调用它。在初始化函数中,会将驱动程序的fileoperations结构连同其主设备号一起向内核进行注册。对于字符设备使用如下以下函数进行注册:
int register_chrdev(unsigned int major, const char *name, struct file operations *fops);
这样,应用程序操作设备文件时,Linux系统就会根据设备文件的类型(是字符设备还是块设备)、主设备号找到在内核中注册的fileoperations结构(对于块设备为block_device operations结构),次设备号供驱动程序自身用来分辨它是同类设备中的第几个。
3)点亮LED的驱动程序。
![]()
嵌入式复习题
最新推荐文章于 2024-04-19 23:52:47 发布