打印
[ZLG-ARM]

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

[复制链接]
1571|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hasayakipw|  楼主 | 2008-1-4 23:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define  OS_CRITICAL_METHOD    3   
 
 
#if      OS_CRITICAL_METHOD == 3 
 
#if      OS_CPU_INT_DIS_MEAS_EN > 0 
 
#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();   
                               OS_CPU_IntDisMeasStart();} 
#define  OS_EXIT_CRITICAL()   {OS_CPU_IntDisMeasStop();    
                               OS_CPU_SR_Restore(cpu_sr);} 
 
#else 
 
#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();} 
#define  OS_EXIT_CRITICAL()   {OS_CPU_SR_Restore(cpu_sr);} 
 
#endif 
 
#endif 
**********************************************************
**********************************************************
#if OS_CRITICAL_METHOD == 3 
__arm  OS_CPU_SR  OS_CPU_SR_Save(void); 
__arm  void       OS_CPU_SR_Restore(OS_CPU_SR cpu_sr); 
#endif 
**********************************************************
**********************************************************
OS_CPU_SR_Save 
    MRS     R0, CPSR 
                             ; Set IRQ and FIQ bits in CPSR to disable all interrupts. 
    ORR     R1, R0, #OS_CPU_ARM_CONTROL_INT_DIS 
    MSR     CPSR_c, R1 
    BX      LR               ; Disabled, return the original CPSR contents in R0. 

OS_CPU_SR_Restore 
    MSR     CPSR_c, R0 
    BX      LR 

以上是uc/OS网站上一段移植到arm的程序,请教:
1,为什么在disable all interrupts. 和OS_CPU_SR_Restore 中最后一行都有BX      LR ? 在这种情况下程序返回到那里去?
2,cpu_sr = OS_CPU_SR_Save();  中OS_CPU_SR_Save()是如何带回一个值返回给cpu_sr的?
谢谢!!!!

相关帖子

沙发
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 all interrupts. 和OS_CPU_SR_Restore 中最后一行都有BX      LR ? 在这种情况下程序返回到那里去?
    这个是返回到调用程序中的OS_CPU_SR_Save()或OS_CPU_SR_Restore 的下一句

2,cpu_sr = OS_CPU_SR_Save();  中OS_CPU_SR_Save()是如何带回一个值返回给cpu_sr的?
    通过R0返回

使用特权

评论回复
5
zlgarm| | 2008-1-5 15:06 | 只看该作者

有关uc/os移植问题

Hasayakipw :您好!

1、为什么在disable all interrupts. 和OS_CPU_SR_Restore 中最后一行都有BX      LR ? 在这种情况下程序返回到那里去?
答:BX是个带状态切换的跳转语句,“ BX      LR ” 是返回到调用OS_CPU_SR_Save()函数的调用程序的下一条指令处,即执行:OS_CPU_IntDisMeasStart(); 别的同理。
此外,在ARM汇编指令中,BX指令会判断目标地址的最低位为0或是1,从而将目标地址的代码解释为Thumb代码(最低位为1),或是ARM代码(最低位为0)。

2、cpu_sr = OS_CPU_SR_Save();  中OS_CPU_SR_Save()是如何带回一个值返回给cpu_sr的?
答:在C与汇编交叉调用编译时,函数发生调用时,函数参数、返回值是依据ATPCS规则来进行的。此处返回值是通过ARM处理器的通用寄存器R0返回的。


有关ATPCS规则及指令原理的相关内容,如有兴趣,请关注周立功公司的相关参考书籍,如《深入浅出ARM7——LPC213x/214x》(上册),以及以下网页:
http://www.zlgmcu.com/infocomm/newupdate.asp?sorttype=search
另外,周立功公司每一款开发板平台中,都会附带有uc/os-ii (2.52版本)的移植模板及相关说明。

                                                          By zlgarm_wgg

使用特权

评论回复
6
hasayakipw|  楼主 | 2008-1-5 19:09 | 只看该作者

非常感谢!

非常感谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

19

帖子

0

粉丝