ldmia r0!, {r4-r11, r14} 的意思是
LDMIA 中的 I 是 increase 的缩写,A 是 after 的缩写,LD加载(load)的意思
R0后面的感叹号“!表示会自动调节 R0里面的指针
所以整句话意思是任务栈R0的存储地址由低到高,将R0存储地址里面的内容手动加载到 CPU 寄存器 R0,R4-R12里
还有一种是STMDB R1!, {R0,R4-R12} 这就和上面反过来了,ST是存储(store)的意思,D是decrease的意思,B是before的意思,整句话就是R1的存储地址由高到低递减,将R0,R4-R12里的内容存储到R1任务栈里面。
typedef struct tskTaskControlBlock
{
volatile StackType_t *pxTopOfStack; /* 栈顶 */ (1)
ListItem_t xStateListItem; /* 任务节点 */ (2)
StackType_t *pxStack; /* 任务栈起始地址 */ (3)
/* 任务名称,字符串形式 */(4)
char pcTaskName[ configMAX_TASK_NAME_LEN ];
} tskTCB;
typedef tskTCB TCB_t;
TCB_t * volatile pxCurrentTCB = NULL;
__asm void vPortSVCHandler( void )
{
PRESERVE8
/* Get the location of the current TCB. */
ldr r3, =pxCurrentTCB
ldr r1, [r3]
ldr r0, [r1]
/* Pop the core registers. */
ldmia r0!, {r4-r11, r14} ;以 r0 为基地址,将栈中向上增长的 8 个字的内容加载到 CPU 寄存
器 r4~r11,同时 r0 也会跟着自增
msr psp, r0 ;此时的r0由于r0! 已经增加到了新的数值,将新的栈顶指针保存到psp中
isb
mov r0, #0
msr basepri, r0;打开所有的中断
bx r14
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)