嵌入式25.docx
- 文档编号:15272996
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:9
- 大小:521.29KB
嵌入式25.docx
《嵌入式25.docx》由会员分享,可在线阅读,更多相关《嵌入式25.docx(9页珍藏版)》请在冰点文库上搜索。
嵌入式25
今天看一下实验2.7的思考题
前面的日志中我提到这个程序是个模式之间的切换,现在看来结论过于简单了,从思考题的设置来看应该是对SPSR寄存器和CPSR寄存器的各种应用。
1 在用户模式或系统模式下读取SPSR寄存器会有什么样的结果?
要知道在用户模式和系统模式是没有SPSR寄存器的,实验一下看看,先说一下相关指令吧:
MSR psr-fields,Rm
其中 psr为CPSR/SPSR
fields指定传送的区域,字母必须为小写c控制域;x扩展域;s状态域;f标志域
MRS与上一个指令正好相反。
我写的代码如下:
AREA MODE,CODE,READONLY
ENTRY
CODE32
START MSRCPSR_c,#0xdf
MRSR0,SPSR
MSRCPSR_c,#0xd0
MRSR0,SPSR
END
实际运行的状况是R0中的数据是CPSP中的数据如图:
2 在非特权模式下能否对CPSR寄存器设置?
能否读取CPSR寄存器的值?
我实验的代码如下:
AREA MODE,CODE,READONLY
ENTRY
CODE32
START MSRCPSR_c,#0xdf
MRSR0,SPSR
MSRCPSR_c,#0xd0
MRSR0,CPSR
MSRCPSR_c,#0xdf
END
实验证明在非特权模式下可以读取CPSR寄存器的值,但不能对其进行设置。
3 非特权模式下如何使能/禁止IRQ或者FIO中断?
一定是要进入特权模式的用到软件中断SWI指令。
可是怎么进入管理模式呀?
也就是说怎么设置中断源?
找了一圈没有结果,突然想到应该在启动代码中找答案,在这本实验手册上有一个实验2.14是关于外部中断的,打开其中的Startup.s看看。
看来还要写一个引导代码。
有意思!
折腾了一个半小时,终于调试成功了。
看图吧!
其中还更改了几个参数,如图:
我做的有不对的地方也请高手指出,毕竟还是简单的应用不知道会出什么问题。
4 程序中能不能通过MSR指令直接修改CPSR中的T位来实现ARM/Thumb的转换?
我再管理模式试了一下,看来是不行。
实验2.8的思考题
如果没有Startup.s,C程序运行会出错吗?
我试了一下,好像没什么错误,不知道有没有隐藏的错误。
Main()可不可以改名?
我试了一下,可以改名,没什么问题。
实验2.9的思考题在C语言中调用汇编,如何以指针的形式传递参数,其实就是把传来的参数作为地址罢了
我修改了它给的程序如下:
明天要休息了,今天就提前到这里吧。
各位,我周末未必会上网所以如果回复不及时请见谅。
周一又上班了,按照进度今天应该上电做蜂鸣器的实验,不过出了点小问题,电源丢了,还要买电源,那今天就看看C语言与汇编语言相互调用的文档吧。
在开发板给的光盘上有一个文档ATPCS.pdf说的应该就是这方面内容,还是先看看中文的吧,原来(\)是续行符号呀,今天第一次听说。
在C、C++程序中使用内嵌的汇编指令的注意事项:
1 在汇编指令中(,)用作分隔符。
因此如果指令中的C表达式中包含有逗号,则该表达式应该包含在括号内。
2 在指令中谨慎的使用物理寄存器,特别是需要调用函数或程序段的时候。
3 不要使用物理寄存器去引用一个C变量
4 对于在内嵌汇编语言程序中使用到的寄存器,便一起在编译时会自动保存和恢复这些寄存器,用户不用保存和恢复这些寄存器。
我验证一下:
第一个:
略
第二个:
结果如图所示:
按照原来的设想应该是sum=500+500/5=600;在实际编译中将100给了R0然后相加结果变成了200,这是因为保存500/5的结果的是R0,破坏了R0原有的数据。
程序改为如图所示:
设想的结果出来了,程序先把500放到R1里边去了,这样就不会被500/5的结果打扰。
第三个:
很好理解,略
第四个:
很好理解,略
从汇编程序中访问C程序变量(有这个必要吗?
)
在C程序中声明的全局变量可以被汇编程序通过地址间接访问。
1:
先用IMPORT声明要用这个全局变量。
2:
用伪指令读入这个全局变量的地址。
3:
用相应的指令读取存储全局变量的值
前面所说的ATPCS.pdf我大略的找一下也为以后看着方便
关于ATPCS
什么是ATPCS,什么是PCS?
ATPCS即arm-thumbprocedurecallstandard,PCS即procedurecallstandard.
PCS规定了应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在一起,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。
PCS规范强制实现如下约定:
调用函数如何传参(即压栈方法,以何种方式存放参数),被调用函数如何获取参数,以何种方式传递函数返回值。
PCS规范的制订是一系列指标的“tradeoff”(因为很大程度上涉及系统的一些性能),如会涉及生成代码的大小,调试功能的支持,函数调用上下文处理速度以及内存消耗。
当然,通过编译器的支持可以让生成的代码有不同的特性,如gcc编译选项可以支持或不支持framepointer来支持深入调试功能或提高程序运行性能。
PCS是体系结构密切相关的,直接涉及编译器如何使用处理器提供的应用寄存器,如编译器使用什么寄存器作为栈指针,利用哪些寄存器作直接传参等。
值得注意的是,没有谁规定说ATPCS是必须这样而不是那样的,它是应用相关的,任何一个操作系统和应用可以处于它自身的考虑定义自己的PCS,当然,如果那样,也必须有自己的编译器,而实际上,在一个处理器设计时,都会有某种假设,所以PCS某种程度上应该是一样的。
ATPCS是基于arm指令集和thumb指令集过程调用的规范。
寄存器的使用规则:
寄存器的使用必须满足下面的规则:
1.子程序间通过寄存器R0R3来传递参数,这时,寄存器R0R3可以记作A1-A4。
被调用的子程序在返回前无需恢复寄存器R0-R3的内容。
2.在子程序中,使用寄存器R4R11来保存局部变量.这时,寄存器R4-R11可以记作V1-V8。
如果在子程序中使用到了寄存器V1-V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。
在Thumb程序中,通常只能使用寄存器R4-R7来保存局部变量。
3.寄存器R12用作子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip。
在子程序间的连接代码段中常有这种使用规则。
4.寄存器R13用作数据栈指针,记作sp。
在子程序中寄存器R13不能用作其他用途。
寄存器sp在进入子程序时的值和退出子程序时的值必须相等。
5.寄存器R14称为连接寄存器,记作lr。
它用于保存子程序的返回地址。
如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。
6.寄存器R15是程序计数器,记作pc。
它不能用作其他用途。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 25