第一范文网 - 专业文章范例文档资料分享平台

嵌入式复习题(最新汇总)

来源:用户分享 时间:2025/8/13 12:18:02 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

int star2() { int i,j,k; for(k=NUMBER;k>=0;--k) { for(i=1;i<=(NUMBER-k+1);++i) printf(\ for(j=1;j<=(2*k-1);++j) printf(\ printf(\ } return 0; }

#endif

hello.h文件内容如下: /*hello.h*/

#ifndef HELLO_H #define HELLO_H void hello() { star1(); printf(\}

#endif

hello.c 文件内容如下: void showhello() { hello(); }

star.c文件内容如下: #include \#include \#include int main() { star1(); star2(); showhello(); return 0; }

答:第一种方法:分步进行程序编译:

(1)由star.c starfun.h 文件生成star.o 目标文件

gcc -c star.c -o star.o

(2)由hello.c hello.h starfun.h生成hello.o目标文件

gcc -c hello.c -o hello.o

(3)由hello.o star.o 生成应用程序myprog

gcc star.o hello.o -o myprog

第二种方法:用动态连接库编译程序:

(1)[root@localhost 01_hello]# gcc -c -fpic hello.c

编译生成了hello.o文件。

(2)[root@localhost 01_hello]# gcc -shared -s -o libhello.so hello.o 编译生成了共享库libhello.so

也可以用下面的命令替代上面两步: gcc -fpic -shared -s hello.c -o libhello.so

(3)[root@localhost 01_hello]# cp libhello.so /usr/lib 把libhello.so库拷贝到/usr/lib,此文件夹为用户库自动搜索路径 (4)[root@localhost 01_hello]# gcc -lhello star.c -o mystar 把动态库与star.c一同编译生成可执行的文件mystar。 可以用下面命令查看可执行程序mystar 用到的动态库。即 [root@localhost 01_hello]# ldd mystar

libhello.so => /usr/lib/libhello.so (0x4002d000) libc.so.6 => /lib/tls/libc.so.6 (0x42000000) 第三种方法:用静态连接库编译程序:

[root@localhost 01_hello]# gcc -c hello.c -o hello.o 编译生成了hello.o文件。

[root@localhost 01_hello]# ar -rc libhello.a hello.o 编译生成了静态连接库libhello.a

[root@localhost 01_hello]# gcc star.c libhello.a -o mystar 把静态库与star.c一同编译生成可执行的文件mystar。 [root@localhost 01_hello]# ./mystar 运行可执行文件mystar。

2、有prog.c、code.c、prog.h、code.h四个文件,其中prog.c程序代码中包含了prog.h、code.h两个头文件,code.c 包含了code.h头文件,试编写一个简单的Makefile文件,使其能生成test目标文件。

.c源代码文件 .h头文件 .o 编译后的目标文件

-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。 答: 简单的Makefile文件如下:

test:prog.o code.o gcc –o test prog.o code.o prog.o:prog.c prog.h code.h gcc –c prog.c –o prog.o code.o:code.c code.h gcc –c code.c –o code.o clean: rm –f *.o

3、阅读下面的Makefile文件,并对其进行说明。 all : prog1 prog2 prog3 .PHONY : all

prog1 : prog1.o utils.o cc -o prog1 prog1.o utils.o prog2 : prog2.o cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o cc -o prog3 prog3.o sort.o utils.o

答:上面的Makefile中的第一个目标“all”会被作为其默认目标,其依赖于其它三个目标。由于伪目标的特性是,总是被执行的,所以其依赖的那三个目标就总是不如“all”这个目标

新。所以,其它三个目标的规则总是会被决议。也就达到了我们一口气生成多个目标的目的。“.PHONY : all”声明了“all”这个目标为“伪目标”。从上面的Makefile文件可以看出,目标也可以成为依赖,伪目标同样也可成为依赖。

4、判别下面是Makefile中的规则是否等价,并对其进行说明。 规则一:

bigoutput littleoutput : text.g

generate text.g -$(subst output,,$@) > $@ 规则二:

bigoutput : text.g

generate text.g -big > bigoutput littleoutput : text.g

generate text.g -little > littleoutput

答:上述两个规则等是价于的,因为-$(subst output,,$@)中的“$”表示执行一个Makefile的函数,函数名为subst,后面的为参数。此函数是截取字符串的意思,“$@”表示目标的集合,就像一个数组,“$@”依次取出目标,并执行命令。

5、判别下面是Makefile中的规则是否等价,并对其进行说明。 规则一:

objects = foo.o bar.o all: $(objects)

$(objects): %.o: %.c

$(CC) -c $(CFLAGS) $< -o $@ 规则二: foo.o : foo.c

$(CC) -c $(CFLAGS) foo.c -o foo.o bar.o : bar.c

$(CC) -c $(CFLAGS) bar.c -o bar.o

答:上面的两个规则是等价的,因为规则一指明了目标从$object中获取,“%.o”表明要所有以“.o”结尾的目标,也就是“foo.o bar.o”;而依赖模式“%.c”则取模式“%.o”的“%”,也就是“foo bar”,并为其加上“.c”的后缀,于是,依赖目标就是“foo.c bar.c”。而命令中的“$<”和“$@”则是自动化变量,“$<”表示所有的依赖目标集(也就是“foo.c bar.c”),“$@”表示目标集(也就是“foo.o bar.o”)。所以规则二是由规则一展开后的等价规则。 6、阅读下面的Makefile文件,并对其中的filter函数进行说明。 files = foo.elc bar.o lose.o $(filter %.o,$(files)): %.o: %.c $(CC) -c $(CFLAGS) $< -o $@ $(filter %.elc,$(files)): %.elc: %.el emacs -f batch-byte-compile $<

答:函数$(filter %.o,$(files))表示调用Makefile的filter函数,过滤“$filter”集,只要其中模式为“%.o”的内容。

7、在Makefile中,若依赖关系需要包含一系列的头文件,比如,如果main.c中有一句“#include \”,试写出建立依赖关系的语句。

答:在Makefile中,建立这种依赖关系的语句是:main.o : main.c defs.h

8、在下面的Makefile中,可以自动化地生成每个文件的依赖关系了。简述下面模式规则。 规则如下:

%.d: %.c

@set -e; rm -f $@; \\

$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \\

sed 's, \\ ($*\\ ) \\.o[ :]*, \\ 1.o $ @ : ,g' < $@.$$$$ > $@; \\ rm -f $@.$$$$

答:这个规则的意思是,所有的[.d]文件依赖于[.c]文件,“rm -f $@”的意思是删除所有的目标,也就是[.d]文件,第二行的意思是,为每个依赖文件“$<”,也就是[.c]文件生成依赖文件,“$@”表示模式“%.d”文件,如果有一个C文件是name.c,那么“%”就是“name”,“$$$$”意为一个随机编号,第二行生成的文件有可能是“name.d.12345”,

第三行使用sed命令做了一个替换。第四行就是删除临时文件。总之,这个模式要做的事就是在编译器生成的依赖关系中加入[.d]文件的依赖,即把依赖关系: main.o : main.c defs.h转成:main.o main.d : main.c defs.h

9、在vivi下执行下面命令load flash kernel x,其作用是什么? 答:此命令是装载压缩映像文件zImage到flash存储器中,地址是kernel分区,并采用xmodem传输协议。

10、在vivi下执行下面命令load flash ucos x 其作用是什么?

答:此命令是装载压缩映像文件ucos到flash存储器中,地址是ucos分区,并采用xmodem传输协议。键入bootucos 命令再回车即可运行ucos 程序。

11、试写出执行ifconfig eth0 192.168.1.1 netmask 255.255.255.0 命令的含义。

答:此命令是设置网卡1的地址192.168.1.1,掩码为255.255.255.0,不写netmask参数则默认为255.255.255.0。

12、试写出执行mount -t nfs 192.168.1.1:/sharedir /mnt命令的含义。 答:此命令将nfs服务的共享目录sharedir加载到/mnt/nfs。

13、在vivi下执行下面命令load flash root x 其作用是什么?

答:此命令是装载根文件系统root.cramfs到flash存储器中,地址是根文件系统分区,并采用xmodem传输协议。

14、进入vivi控制台 ,执行以下命令:bon part 0 128k 192k 1216k 4288k:m 64704k 的作用是什么?

答:这个命令的操作同时进行了分区和格式化,0—128K存放vivi,128K—192K存放VIVI控制台指令,192K—1216K存放kernel,1216K—4288K存放root,其余部分存放应用程序。 15、Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。分别简述这五个子系统。 答:(1)进程调度(SCHED):控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。

(2)内存管理(MM)允许多个进程安全的共享主内存区域。Linux 的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。

(3)虚拟文件系统(Virtual File System,VFS)隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为

搜索更多关于: 嵌入式复习题(最新汇总) 的文档
嵌入式复习题(最新汇总).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c6zn934yiko565jb3utz7_3.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top