实际包含的宏为:
cpu_sr = os_cpu_save_sr();
os_cpu_save_sr:
MRSR0, CPSR;
ORRR1,R0,#NO_INT;
MSRCPSR,R1;
汇编好像是这样的,把CPRS读到R0,屏蔽FIQ和IRQ后反写回CPSR.
有点不明白.这个宏可以在任务中任何位置使用,为什么调用的时候就敢随便把R0的内容覆盖掉?,还有这里返回给cpu_sr使用的R1还是R0?.
OS_EXIT_CRITICL()os_cpu_restore_sr(cpu_sr); 操作R0能明白.第一个参数是通过R0传递的.可上面那个根本没参数输入阿..
??呵呵.: 求解~
作者:Swd21ic 2008-1-27 18:51:00
系统区人气实在是太不旺了.
所以发过来了呵呵
作者:Swd21ic 2008-1-27 18:56:00
遵循 ARM-Thumb 过程调用标准 (ATPCS) 可以确保分别编译或汇编的子程序能够
协同工作。
使用寄存器 r0-r3 将参数值传送到函数,并将结果值传出。可以用 a1-a4 来
引用 r0-r3,以使此用法透明。请参阅第 3-9 页的参数传递。在子程序调用
之间,可以将 r0-r3 用于任何用途。被调用函数在返回之前不必恢复 r0-r3。
如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。
作者:JOHN_light 2008-1-27 21:52:00
楼上正解 作者:rodger_br 2008-1-29 19:38:00
明白了,把ATPCS看了下
..
反正R0-R3可以乱用,有参数就传,这样不会对其他造成损害.
作者:Swd21ic 2008-1-29 20:11:00
cpu_sr = os_cpu_save_sr();这是函数调用。系统会自动保存那些寄存器,这个用户不用管,等函数条用完毕,return之后,寄存器会自动恢复。
MRSR0, CPSR;把cpsr的值保存到r0里边,做返回值使用。cpu_sr得到的就是这个值。里边的R1就是当一般的寄存器使用的,保存了中间变量,可以换成别的也无所谓。
作者:zjf0000 2008-1-31 9:39:00