- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ARM嵌入式完整系统结构与编程习题答案邱铁著
第8章 ARM汇编语言与嵌入式C混合编程
1.严格按照嵌入式C语言的编程规范,写一个C语言程序,实现将一个二维数组内的数据行和列进行排序。
答:略
2.嵌入式C程序设计中常用的移位操作有哪几种,请说明每种运算所对应的ARM指令实现。
答:移位操作分为左移操作与右移操作
左移运算符“”实现将“”左边的操作数的各个二进制位向左移动“”右边操作数所指定的位数,高位丢弃,低位补0。其值相当于乘以:2“左移位数”次方。
右移运算符“”实现将“”左边的操作数的各个二进制位向右移动“”右边操作数所指定的位数。
对于空位的补齐方式,无符号数与有符号数是有区别的。
对无符号数进行右移时,低位丢弃,高位用0补齐,其值相当于除以:2“右移位数”次方
对有符号数进行右移时,根据处理器的不同选择逻辑右移或算术右移
3.volatile限制符在程序中起到什么作用。请举例说明。
答:volatile的本意为 “暂态的”或.“易变的”,该说明符起到抑制编译器优化的作用。
如果在声明时用“volatile”关键进行修饰,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供特殊地址的稳定访问。
例:硬件端口寄存器读取
Char x=0,y=0,z=0;
x=ReadChar(0;//读端口
y=x;
x=ReadChar(0;//再读端口
z=x;
以上代码可能被编译器优化为
Char x=0,y=0,z=0;
x=ReadChar(0;//读端口
y=x;
z=x;
为了确保x的值从真实端口获取,声明时应该为
Volatile char x;
Char y,z;
4.请分析下列程序代码的执行结果。
#includestdio.h
main(){
int value=0xFF1;
int *p1,**p2,***p3,****p4;
p1=value;
p2=p1;
p3=p2;
p4=p3;
printf(****p4=%d\n,****p4);
}
答:程序输出结果为:****p4=4081
5.分析宏定义#define POWER(x) x*x 是否合理,举例说明。如果不合理,应如何更改?
答:#define POWER(x) x*x 不合理;对于带参数的宏,其参数应该用括号括起来。
例:如果按照下边方式使用该宏
POWER(2+3) 则宏展开后为 2+3*2+3
该宏应修改为:#define POWER(x) (x)*(x)
6.条件编译在程序设计中有哪些用途?
答:条件编译包括了6条预处理指令#ifdef, #ifndef. ##if, #elif, #else, #endif.。条件编译的功能在于对源程序中的一部分内容只有满足某种条件的情况下才进行编译。
7.何为可重入函数?如果使程序具有可重入性,在程序设计中应该注意哪些问题?
答:如果某个函数可以被多个任务并发使用,而不会造成数据错误,我们就说这个函数具有可重入性(reentrant) 。
可重入函数可以使用局部变量,也可以使用全局变量。
如果使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护,若不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使得此全局变量变为不可知状态。
8.现有模块module_1, module_2, module_3, 要求在模块module_1中提供可供模块module_2, module_3使用的int型变量xx,请写出模块化程序设计框架。
答:首先在module_1的.c文件中定义 int xx;
/*module_1.c*/
int xx=0;
然后在module_1的.h 文件中声明xx为外部变量
/*module_1.h*/
extern int xx;
接下来在module_2源文件中包括module_1的 .h 文件
/*module_2.c*/
#include module_1.h
在module_3源文件中包括module_1的 .h 文件
/*module_3.c*/
#include module_1.h
这样在module_2, module_3中就可以使用module_1中提供的int型变量xx了。
9.ATPCS 与 AAPCS的全称是是什么,它们有什么差别?掌握子程序调用过程中寄存器的使用规则,数据栈的使用规则及参数的传递规则,在具体的函数中能够熟练应用。
答:过程调用标准ATPCS(ARM-Thumb Produce Call Standard)规定了子程序间相互调用的基本规则, ATPCS规定子程序调用过程中寄存器的使用规则、数据栈的使用规则及参数的传递规则。
2
原创力文档


文档评论(0)