[ZLG-ARM] 请教uc/os移值的两个问题

[复制链接]
2321|5
 楼主| hasayakipw 发表于 2008-1-4 23:19 | 显示全部楼层 |阅读模式
#define&nbsp;&nbsp;OS_CRITICAL_METHOD&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;<br />&nbsp;<br />&nbsp;<br />#if&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_CRITICAL_METHOD&nbsp;==&nbsp;3&nbsp;<br />&nbsp;<br />#if&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_CPU_INT_DIS_MEAS_EN&nbsp;&gt&nbsp;0&nbsp;<br />&nbsp;<br />#define&nbsp;&nbsp;OS_ENTER_CRITICAL()&nbsp;&nbsp;{cpu_sr&nbsp;=&nbsp;OS_CPU_SR_Save();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_CPU_IntDisMeasStart();}&nbsp;<br />#define&nbsp;&nbsp;OS_EXIT_CRITICAL()&nbsp;&nbsp;&nbsp;{OS_CPU_IntDisMeasStop();&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_CPU_SR_Restore(cpu_sr);}&nbsp;<br />&nbsp;<br />#else&nbsp;<br />&nbsp;<br />#define&nbsp;&nbsp;OS_ENTER_CRITICAL()&nbsp;&nbsp;{cpu_sr&nbsp;=&nbsp;OS_CPU_SR_Save();}&nbsp;<br />#define&nbsp;&nbsp;OS_EXIT_CRITICAL()&nbsp;&nbsp;&nbsp;{OS_CPU_SR_Restore(cpu_sr);}&nbsp;<br />&nbsp;<br />#endif&nbsp;<br />&nbsp;<br />#endif&nbsp;<br />**********************************************************<br />**********************************************************<br />#if&nbsp;OS_CRITICAL_METHOD&nbsp;==&nbsp;3&nbsp;<br />__arm&nbsp;&nbsp;OS_CPU_SR&nbsp;&nbsp;OS_CPU_SR_Save(void);&nbsp;<br />__arm&nbsp;&nbsp;void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_CPU_SR_Restore(OS_CPU_SR&nbsp;cpu_sr);&nbsp;<br />#endif&nbsp;<br />**********************************************************<br />**********************************************************<br />OS_CPU_SR_Save&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;MRS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;CPSR&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Set&nbsp;IRQ&nbsp;and&nbsp;FIQ&nbsp;bits&nbsp;in&nbsp;CPSR&nbsp;to&nbsp;disable&nbsp;all&nbsp;interrupts.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;R0,&nbsp;#OS_CPU_ARM_CONTROL_INT_DIS&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;R1&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Disabled,&nbsp;return&nbsp;the&nbsp;original&nbsp;CPSR&nbsp;contents&nbsp;in&nbsp;R0.&nbsp;<br /><br />OS_CPU_SR_Restore&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;R0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LR&nbsp;<br /><br />以上是uc/OS网站上一段移植到arm的程序,请教:<br />1,为什么在disable&nbsp;all&nbsp;interrupts.&nbsp;和OS_CPU_SR_Restore&nbsp;中最后一行都有BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LR&nbsp;?&nbsp;在这种情况下程序返回到那里去?<br />2,cpu_sr&nbsp;=&nbsp;OS_CPU_SR_Save();&nbsp;&nbsp;中OS_CPU_SR_Save()是如何带回一个值返回给cpu_sr的?<br />谢谢!!!!<br />
 楼主| hasayakipw 发表于 2008-1-5 09:26 | 显示全部楼层

自己先顶一下.

  
 楼主| hasayakipw 发表于 2008-1-5 10:47 | 显示全部楼层

我自己的初步理解

这应该是一个c语言如何调用汇编语言的问题,其中就设及到c语言参数如何传递到汇编语言中,同时汇编语言处理的结果如何返回给c语言,以及汇编语言返回的c程序的问题.对这个过程不是很清楚,使用的是ADS的编译器,希望各位高手指点一下.谢谢!
wbideal 发表于 2008-1-5 14:31 | 显示全部楼层

请教uc/os移值的两个问题

1,为什么在disable&nbsp;all&nbsp;interrupts.&nbsp;和OS_CPU_SR_Restore&nbsp;中最后一行都有BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LR&nbsp;?&nbsp;在这种情况下程序返回到那里去?<br />&nbsp;&nbsp;&nbsp;&nbsp;这个是返回到调用程序中的OS_CPU_SR_Save()或OS_CPU_SR_Restore&nbsp;的下一句<br /><br />2,cpu_sr&nbsp;=&nbsp;OS_CPU_SR_Save();&nbsp;&nbsp;中OS_CPU_SR_Save()是如何带回一个值返回给cpu_sr的?<br />&nbsp;&nbsp;&nbsp;&nbsp;通过R0返回
zlgarm 发表于 2008-1-5 15:06 | 显示全部楼层

有关uc/os移植问题

Hasayakipw&nbsp;:您好!<br /><br />1、为什么在disable&nbsp;all&nbsp;interrupts.&nbsp;和OS_CPU_SR_Restore&nbsp;中最后一行都有BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LR&nbsp;?&nbsp;在这种情况下程序返回到那里去?<br />答:BX是个带状态切换的跳转语句,“&nbsp;BX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LR&nbsp;”&nbsp;是返回到调用OS_CPU_SR_Save()函数的调用程序的下一条指令处,即执行:OS_CPU_IntDisMeasStart();&nbsp;别的同理。<br />此外,在ARM汇编指令中,BX指令会判断目标地址的最低位为0或是1,从而将目标地址的代码解释为Thumb代码(最低位为1),或是ARM代码(最低位为0)。<br /><br />2、cpu_sr&nbsp;=&nbsp;OS_CPU_SR_Save();&nbsp;&nbsp;中OS_CPU_SR_Save()是如何带回一个值返回给cpu_sr的?<br />答:在C与汇编交叉调用编译时,函数发生调用时,函数参数、返回值是依据ATPCS规则来进行的。此处返回值是通过ARM处理器的通用寄存器R0返回的。<br /><br /><br />有关ATPCS规则及指令原理的相关内容,如有兴趣,请关注周立功公司的相关参考书籍,如《深入浅出ARM7——LPC213x/214x》(上册),以及以下网页:<br />http://www.zlgmcu.com/infocomm/newupdate.asp?sorttype=search<br />另外,周立功公司每一款开发板平台中,都会附带有uc/os-ii&nbsp;(2.52版本)的移植模板及相关说明。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By&nbsp;zlgarm_wgg
 楼主| hasayakipw 发表于 2008-1-5 19:09 | 显示全部楼层

非常感谢!

非常感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

19

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部