附录1-6
内容可能有误,欢迎大家指正。
(1)ARM汇编程序由 机器 指令、 汇编 指令和 伪 指令构成。
(2)ARM伪指令可以分为以下几类:符号定义伪指令、数据定义伪指令、汇编控制伪指令和宏指令等。
(3)假设存储数据0x12345678于ARM微处理器内存0X30000000开始的位置,则0X30000001内存位置的数据为C(A.0X12 B.0X34 C.0X56 D.0X78)(采用小端模式进行存储)
(4)一般情况下,ARM微处理器异常处理模式共有7种,机器启动后第一条指令执行的是A(A.复位异常处理函数指令 B.中断异常处理指令 C.IRQ异常处理指令 D.指令预取终止异常)。
(5)调用函数FUN(X,Y,Z),则实参值分别通过 r0、r1 、 r2寄存器来进行传递,如果参数超过4个,则参数传递规则为通过栈进行传递。
(6)举例列出一款ARM7TDMI微内核的嵌入式微处理器S3C44BOX ,ARM920T微内核的嵌入式微处理器S3C2410,ARM11内核的嵌入式微处理器 S3C6410,并列举2款64位ARM微内核Cortex-A53、Cortex-A57。
(7)利用汇编和C混合编程,设计代码完成求a,b,c中最大值功能,要求写出汇编启动代码和C代码。
1.汇编文件 asses.S
EXPORT Max
IMPORT Main
AREA Init,CODE,READONLY
ENTRY
MOV R13,#0X3008000
B Main
MAX
LDR R2,[R0],#4
loop
SUB R1,R1,#1
LDR R3,[R0],#4
CMP R2,R3
MOVLT R2,R3
CMP R1,#1
BEQ EXIT
B loop
exit
MOV R0,R2
MOV PC,LR
END
2.C 文件
//main.c
int Max(int *pa,int len);
void Main()
{
int a[5]={10,24,8,67,34};
Max(a,5);
}
1.嵌入式Linux操作系统包括bootloader、内核、文件系统 三部分组成。
2.在PC机上Linux系统编译使用的编译器名为gcc,ARM处理器嵌入式编译器名为arm-linux-gcc。
3.bootloader的功能:①引导操作系统内核启动②提供辅助命令工具。
4.列出最常用的bootloader:vivi、uboot、redboot、lilo、grub、etherboot。
5.在uboot中,打印开发板上环境变量值的命令为printenv,设置IP地址为192.168.1.1的命令为setenv ipaddr 192.168.1.1,假如嵌入式内核名为vmlinux,通过tftp加载内核的命令为setenv ipaddr 192.168.1.1,启动嵌入式Linux内核的命令为bootm。
6.从C语言角度来理解,嵌入式Linux内核仅是众多函数的集合体,其有一个类似于main的函数,名称为start_kernel。
7.嵌入式Linux内核裁剪命令为make menuconfig;裁剪完成后生成配置选择文件.config;编译内核命令为make zImage。
8.启动linux后常用的命令如ifconfig、cp、ls等通常位于C(A.bootloaderB.内核C.文件系统)中;嵌入式Linux环境下生成文件系统的常用工具为mkyaffs2img;以yaffs方法为例,将嵌入式文件夹压缩成一个yaffs2格式的文件系统命令为mkyaffs2img 文件夹 镜像文件名。
9.构建嵌入式Linux系统时,烧写bootloader的工具为hjtag;烧写Linux内核一般使用A(A.bootloader B.文件系统 C.交叉编译器)来烧写,烧写文件系统一般使用A(A.bootloader B.文件系统 C.交叉编译器)来烧写。
10.简述构建嵌入式Linux系统基本过程
三剑客:
裁剪编译好 uboot 映像文件 uboot.bin
裁剪编译好内核 映像文件 uImage
裁剪编译好文件系统映像文件 rootfs_qtopia_qt4.img
烧写至NAND存储设备
int AddFun(int a,int b) //2.加载到内核的功能函数
{
return a+b;
}
static int __init hello_init(void) //3.模块加载和卸载函数
{
printk( “insert hetlo module into kernel!\n”):
return 0;
}
static void led_exit(void)
{
printk(“hello module leave from kernel!\n”);
return ;
}
module_init(hello_init);
module_exit(hello_exit);
MODULE LICENSE(“GPL”); //4.模块许可证说明
(2) Makefile
obj-m: =hello. ko
all:
make – C /opt/linux-2. 6. 38 SUBDIRS=$(shell pwd) modules
clean:
rm -rf *. ko *. o
(3) 编译和加载
#make
#inmsod hello. ko
关联函数:
connect(m_Win, SIGNAL(clicked() ) , m_on, SLOT(LedOnFun() ) ) ;
connect(m_Win, SIGNAL(clicked() ) , m_off, SLOT(LedOffFun() ) ) ;
void LedOnFun( )
{
int fd;
fd=open(“/dev/leddev” , O_RDWR) ;
ioctl(fd, LEDON) ;
close(fd) ;
}
void LedOffFun()
{
int fd;
fd=open(“/dev/leddev” , O_RDWR) ;
ioctl(fd, LEDOFF) ;
close(fd) ;
}
int AddFun(int a,int b) //2.加载到内核的功能函数
{
return a+b;
}
int SubFun(int a,int b)
{
return a-b;
}
MODULE LICENSE(“GPL”); //4.模块许可证说明
Makefile文件和加载函数见附录四第四题。
设备要能被使用,通常需要设备驱动软件,在Linux系统中,设备驱动驱动软件位于A(A.内核空间 B.用户空间),假设有LED报警灯设备驱动软件leddrv.ko,则加载该驱动软件到内核命令为_#insmod leddrv. ko,测试完成后,将该软件从内核中卸载命令为_ #rmmod leddrv_。
3. 除网络设备外,设备驱动通常采用文件方式进行访问,一般包括_打开设备、读写控制设备,最后关闭设备。在Linux中设备文件名本质上是设备号,将两者之间建立关联的命令为mknod,假设LED设备驱动主设备号为253,次设备号为0,设备名为leddev,则建立设备文件的具体命令为#mknod /dev/leddev c 253 0_。
4.简述编写看门狗驱动基本步骤
编写硬件驱动代码, 包括:
编写硬件接口函数
建立文件系统与硬件接口函数的关联
注册字符设备
添加模块代码
编译设备驱动并加载到内核, 包括:
编写Makefile
编译
加载
创建设备节点
编写应用程序访问底层设备驱动
考试题型分为填空题(选择题)、问答题和设计题三种类型,分别占比为40%、40%和20%