这个当前任务就是程序从main函数切换到优先级最高的已创建任务,既pxCurrentTCB->pxTopOfStack,将pxTopOfStack的值赋值给R0,可以在任务控制块的定义确认。pxTopOfStack的值在任务创建已经详细阐述。 (4)以R0寄存器的值为首地址出栈恢复R4~R11,R14。这个恢复目前笔者没有发现有太大的意义,因为在任务创建的时候只是...
STRB R2, [R0] LDR R0, __OS_TCBCur ; OS_TCBCur变为OS_TCBHighRdy LDR R1, __OS_TCBHighRdy LDR R2, [R1] STR R2, [R0] LDR R0, [R2] ; R0是新任务的SP LDM R0, {R4-R11} ; 弹出R4-R11等8个寄存器的值 ADDS R0, R0, #0x20 MSR PSP, R0 ;PSP变为R0的值 ORR LR, LR, #0x04 ...
octcopy LDMIA r0!,{r4-r11} ;从源装入8个字 STMIA r1!,{r4-r11} ;存到目的块 SUBS r3,r3,#1 ;计数器减1(拷贝8个字) BNE octcopy ;r3不为,继续拷贝 LDMFD sp!,{r4-r11} ;恢复原来的值 copywordsANDS r2,r2,#7 ;零碎的字(少于8个字的拷贝) BEQ...
1、进入PendSV前,硬件自动压栈了PSR、PC、LR、R12、R3~R0的寄存器(使用PSP指针,压入任务堆栈,即硬件自动保存“调用者保存寄存器”),对应图中的① 2、进入PendSV后,手动保存R4-R11,对应xPortPendSVHandler函数中的stmdb r0!, {r4-r11}语句(也就是手动保存“被调用者保存寄存器”),对应图中的② 3、切换新的...
2、进入PendSV后,手动保存R4-R11,对应xPortPendSVHandler函数中的stmdb r0!, {r4-r11}语句(也就是手动保存“被调用者保存寄存器”),对应图中的② 3、切换新的TCB后,找到该TCB对应的PSP,手动弹出R4-R11,对应xPortPendSVHandler函数中的ldmia r0!, {r4-r11}语句,对应图中的③ ...
ldmia r0!, {r4-r11,r14} msr psp, r0 isb bx r14 nop} 上述代码为pendsv中断处理函数,功能是进行任务的切换,这里讲一下外部引入的两个参数: task :类型,uint32**,指向包含任务堆栈最后一个数地址的地址。 vTaskSwitchContext:任务切换函数的函数名。 __asm void SVC_Handler(void){ PRESERVE8 extern ...
ADD R0, R0, #0x4 ; R0 = R0 + 0x4; ; store R11 STR R11, [R0] ; *R0 = R11; ADD R0, R0, #0x4 ; R0 = R0 + 0x4; SUB R0, R0, #0x20 ; R0 = R0 - 0x20; ; easy method ;SUB R0, R0, #0x20 ;STM R0, {R4-R11} ...
子程序间通过寄存器 R0、R1、R2、 R3 来传递参数。如果参数多于 4 个,则多出的部分用堆栈传递。被调用的子程序在返回前无须恢复寄存器 R0-R3 的内容。 在子程序中,使用寄存器 R4-R11 来保存局部变量。如果在子程序中使用到了寄存器 R4-R11 中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢...
首先从micrium网站上下载官方移植版本(编译器使用ARM/Keil的,V2.86版本,V2.85有问题)。 下载地址:http://micrium.com/page/downloads/ports/st/stm32 解压缩后得到如下文件夹和文件: Micrium\ AppNotes ...
1 MOV R2,R0 ;R0的值送R22 ADD R4,R3,R2 ;R2加R3,结果送R43 CMP R7,R8 ;比较 R7 和 R8 的值3、 寄存器移位寻址方式和寄存器寻址类似,只是操作前需要对寄存器操作数进行移位操作。寄存器的值在被送到 ALU 之前,可以事先经过桶形移位寄存器的处理。预处理和移位发生在同一周期内,所以有效地使用移位寄存器...