清采NOTE

理解他人 善待自己

用户工具

站点工具


courses:embedded_system:lianxi_06

嵌入式系统·第6章练习题


1、在涉及到硬件(寄存器)操作时,经常用到C语言中的位运算,这些位运算及其运算符包括(与 &)(或 |)(异或 ^)(取反 ~)(左移 «)(右移 »)

2、若 x = (0x01«5),则x的值为(0x20)

3、写出C语言中封装寄存器GPJ2CON的预处理语句。(已知GPJ2CON的地址为0xE0200280)

答:

GPJ2CON  *( (volatile unsigned *)0xE0200280 )

4、volatile限制符的作用是什么?适用于哪些场合?

答: volatile限制符可以抑制编译器优化,提供特殊地址的稳定访问。主要使用的场合包括:存储器映射的硬件寄存器;中断服务程序中修改的供其他程序检测的变量;多任务环境下各任务间共享的标志。

5、已知LED模块的原理图和相关寄存器表,写出分析过程,并分别编写汇编程序和C程序点亮LED。

6、已知蜂鸣器模块的原理图和相关寄存器表,写出分析过程,并分别编写汇编程序和C程序让蜂鸣器响。

7、已知蜂鸣器模块的原理图和相关寄存器表,写出分析过程,并编写C程序让蜂鸣器响3声后挺2秒,依次循环。

8、嵌入式Linux交叉开发的基本思想是什么?

答:
(1) 在宿主机(Host)上安装开发工具,编辑、编译目标板的Linux引导程序、内核、文件系统以及驱动/应用程序;
(2) 将上述程序下载到目标板(Target)上执行,实现各种功能。

9、嵌入式Linux交叉开发环境中,最常用的交叉编译工具是(arm-linux-gcc)

10、Linux操作系统移植的3各映像文件为:(启动代码/bootloader)(内核/Kernal)(根文件系统/Root filesystem)

11、不同CPU体系结构有不同的Bootloader,常用的有(Redboot)(U-boot)(Blob)

12、在Linux终端,查看当前或指定路径的目录时可使用(ls)命令;修改文件路径时可使用(cd)命令;创建文件目录时可使用(mkdir)命令;修改文件操作权限时可使用(chmod)命令;删除整个文件路径及其子目录时可以使用(rm -r)命令。

13、如果想测试宿主机与目标板的网络连通性,可以使用(ping 192.168.1.230)命令(假设目标板的IP地址为192.168.1.230)。如果想查看本机的网卡和IP地址,可以使用(ifconfig)命令。

14、如果想通过远程登录访问目标板时,可以使用(telnet 192.168.1.230)命令(假设目标板的IP地址为192.168.1.230)。如果想在目标板终端从宿主机下载文件时,可以使用(tftp -g -r ex 192.168.1.2)命令(假设宿主机的IP地址为192.168.1.2,且待下载的文件名为ex)。

15、Linux操作的文件系统是以根节点开始的(树状)结构,默认挂载的文件目录包括(bin)(boot)(dev)(etc)(home)(lib)(usr)(var)等(列举其中的5个即可)。

16、绘制嵌入式Linux编程结构图,并简述其基本思想。

答: 图如下(来自PPT第11页)

基本思想:CPU、寄存器、内存等系统资源处于内核空间,用户编程时是在用户空间中完成。

17、在Linux中,所有对的(目录)(设备)的操作都等同于对(文件)的操作,极大简化了系统对不同设备的处理,提高了效率。

18、Linux中的文件主要为:(普通文件)(目录文件)(链接文件)(设备文件)

19、内核区分和引用特定的文件的方式是(文件描述符),它是一个(非负)整数。

20、什么是文件描述符,它的作用是什么?

答:文件描述符是一个非负整数,用来指向内核中每个进程打开文件的记录表。当打开或者创建一个文件时,内核就向进程返回一个文件描述符;当需要读写文件时,需要将文件描述符作为参数传递给相应的函数。通常,一个进程启动时,都会打开三个文件,即标准输入、标准输出、标准出错处理,它们的文件描述符分别为0、1、2。

21、常见的I/O操作函数有(open)(close)(read)(write)等。

22、如果以读写的方式打开一个设备文件,则C语句为:(fd = open(“/dev/mem”, O_RDWR););若想关闭该文件,则C语句为:(close(fd);)。

23、已知虚拟地址映射函数的原型如下

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

指出该函数中各个参数的含义,并任举一例展示如果调用该函数。

答:
(1) 参数addr:表示指定映射的虚拟内存地址,设为NULL时,由Linux内核自动选择虚拟内存地址;
(2) 参数length:表示映射的长度;可以指定为页大小,即getpagesize();
(3) 参数prot:表示映射内存的保护模式,如可读可写设置为 PROT_READ | PROT_WRITE;
(4) 参数flags:表示指定映射的类型,可选为共享,即 MAP_SHARED;
(5) 参数fd:表示要进行映射的文件描述符;
(6) 参数offset:表示文件偏移量,即被映射文件的物理起始地址,一般为特殊功能寄存器组的基地址。

调用示例:

void *addr = mmap(NULL, getpagesize(), PROT_WRITE, MAP_SHARED, fd, 0xE0200280);

24、利用munmap函数释放第23题中映射的虚拟地址,C语句为:(munmap( (void *)addr, 4*4096 );

25、已知蜂鸣器模块的原理图和相关寄存器表,编写完整的Linux程序,实现蜂鸣器周期性响铃。