1、80-V6107-1_Rev_A_Debug_Troubleshoot.pdf
函数调用的时候 R0-R3传递4个参数,其余的通过栈来保存,并且参数从右向左顺序入栈。
R13 是栈指针 stack pointer(SP),它不用作其他的用途,一直指向栈中当前的位置。当context switch时,REX利用SP来切换不同task的执行(把sp指向不同task的栈)。
R14一般保存返回地址。
PC R15保存下一条指令。
BL跳转指令:跳转之前,会在寄存器R14中保存PC的当前内容,因此可以通过将R14的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。
BL Label; 当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中。
R13(SP)地址是0x140218FC.
输入命令:d.dump ui_stack /BYTE 看 UI stack,如上图。
看到如下的值,此时push{r1-r7, r14}已经被执行:
Address 0x140218FC Value 0x1411FC78 – Contents of R1 <- SP points here
0x14021900 0x00000001 – Contents of R2
0x14021904 0x00142BE3 – Contents of R3
0x14021908 0x00000000 – Contents of R4
0x1402191C 0x1411F438 – Contents of R5
0x14021920 0x14120338 – Contents of R6
0x14021924 0x14120358 – Contents of R7
0x14021928 0x00142BEB – R14 - return address
R14的值返回下一条命令,执行uiuasmsn_init().
FIQ :fast interrupt,它比IRQ中断优先级高。
FIQ interrupt vector:快速中断请求向量表。当异常或者中断发生的时候,处理器设置PC为一个特殊的内存地址(faster RAM memory)。这个地址叫做中断向量表。中断向量表入口是中断、异常的分支入口。.
REX中INTLOCK()和INTFREE()可以控制FIQ和IRQ中断的使能。
FIQ中断每1.25ms就会产生,因此这个中断锁定时间不能长于1.25ms。
TASKLOCK保护当前task活动状态不被别的task取代,但是不会保护不被中断。
INTLOCK()和INTFREE()使用:
锁定中断前,INTLOCK将保存当前IRQ/FIQ标识的状态。这个值可能是0(中断已经使能了,在锁定前),或且非0(在锁定前中断没有使能)。
#define INTLOCK( ) { dword sav = rex_int_lock();
#define INTFREE( ) if(!sav) (void)rex_int_free();}