_IntCtxSw
; OSIntCtxSwFlag = 0
mov r1,#0
str r1,[r0]
/*
此时正处于中断模式下,因此sp、spsr等寄存器为中断模式下的相应寄存器,因此
r0-r3,r12,lr这些寄存器在进入中断处理程序后,先被保存在了中断模式下的堆栈中。*/
;现将这些寄存器的值重新恢复。
ldmfd sp!,{r0-r3,r12,lr}
;将r0-r3重新保存回中断模式下的栈空间
stmfd sp!,{r0-r3}
/*
此时中断栈的内容(为被中断任务的r0-r3的值):
----------------à
r3,r2,r1,r0
----------------à栈顶
*/
;保存中断模式下的栈顶指针sp到r1:r1 = sp_irq
mov r1,sp
add sp,sp,#16; sp_irq += 16;
;计算被中断任务的中断返回地址: r2 = lr – 4
sub r2,lr,#4
/*
spsr在中断发生时,保存了中断前即用户模式下的cpsr的值,该过程由硬件自动完成
*/
;取中断前的状态寄存器到r3
mrs r3,spsr
orr r0,r3,#NOINT;屏蔽中断
;返回用户模式(切换到用户堆栈),以便下面保存中断现场
msr cpsr_cxsf,r0
;ldr r0,=.+8
;movs pc,r0;自动切换到用户堆栈
/*
此时已是用户模式,因此,sp为用户模式的栈顶指针,即被中断任务的堆栈指针。
*/
;根据任务栈结构,分别压栈,保存旧任务的现场
stmfd sp!,{r2} ; push old task's pc
stmfd sp!,{r4-r12,lr} ; push old task's lr,r12-r4
/*
此时任务栈的内容:
----------------à
pc,lr,r12,r11,,,,,,r4
----------------à栈顶
*/
;r1为中断栈的栈顶指针,r4 = r1
mov r4,r1 ; Special optimised code below
;r3为中断前状态寄存器cpsr,r5 = r3
mov r5,r3
;将保存在中断栈中的r0-r3保存到任务栈中,r4为中断栈的栈顶指针
ldmfd r4!,{r0-r3}
stmfd sp!,{r0-r3} ; push old task's r3-r0
;保存任务的cpsr到任务栈
stmfd sp!,{r5} ; push old task's psr
;保存任务的spsr到任务栈
mrs r4,spsr
stmfd sp!,{r4} ; push old task's spsr
/*
至此,被中断的任务的现场保存完毕!
*/
; OSPrioCur = OSPrioHighRdy
ldr r4,=OSPrioCur
ldr r5,=OSPrioHighRdy
ldrb r5,[r5]
strb r5,[r4]
; Get current task TCB address:r5= OSTCBCur
ldr r4,=OSTCBCur
ldr r5,[r4]
;OSTCBCur->OSTCBStkPtr = SP;
str sp,[r5] ; store sp in preempted tasks's TCB
bl OSTaskSwHook ; call Task Switch Hook
; Get highest priority task TCB address:r6= OSTCBHighRdy
ldr r6,=OSTCBHighRdy
ldr r6,[r6]
;SP = OSTCBHighRdy ->OSTCBStkPtr;
ldr sp,[r6] ; get new task's stack pointer
; OSTCBCur = OSTCBHighRdy
str r6,[r4] ; set new current task TCB address
;根据任务栈结构,分别出栈,恢复新任务的现场
ldmfd sp!,{r4} ; pop new task's spsr
msr SPSR_cxsf,r4
ldmfd sp!,{r4} ; pop new task's psr
msr CPSR_cxsf,r4
ldmfd sp!,{r0-r12,lr,pc} ; pop new task's r0-r12,lr & pc
|
相关推荐
1.了解uCOS-II内核的主要结构。 2.掌握将uCOS-II内核移植到ARM920T处理器上的基本方法。 3. 将uCOS-II内核移植到ARM920T微处理器上。 4.编写两个简单任务,在超级终端上观察两个任务的切换。
首先必须了解,在将ucos-II移植到ARM920T时,使用了任务栈,和基于ARM920T的OSCtxSw实现分析的程序清单详解。
ucos-II在ARM7上的移植代码(含详细注释)
UCOS-II在ARM上的移植源程序.rar
uCOS-II在ARM系统上的移植与实现
Micriμm uCos-II在Cortex-M3移植的详细说明
基于UCOS-II的多任务与系统时钟课程设计
Micrium_STM32F103ZE-SK_uCOS-II_官方版
《嵌入式实时操作系统ucos-II》中英文共有12章,和我手上《嵌入式实时操作系统ucos-II(第二版)》差了几张,在网上也没找到《嵌入式实时操作系统ucos-II(第二版)》的电子版,估计目前能找到的都是第一版吧 ...
uCOS-II-2.91 官方源码包 最新版本啦,里面还有详细的说明和帮助文档呢.
uCOS-II For ARM7 or ARM9
STM32平台移植uCOS-II详细说明 1. 建立工程所需的文件夹 建立文件夹uCOS-II-Port :工程根目录 建立文件夹uCOS-II-Port/App :存放用户应用程序相关 建立文件夹uCOS-II-Port/Bsp :存放开发板初始化驱动...
uCOS-ii移植的流程,按照教程,轻松移植ucosii
压缩包里分两部分即源码和例程,源码部分包含uCOS-II和uCOS-III的源码(不含port等文件夹,是移植时不需修改的源文件,版本:ucos-ii的v2.86和目前最新的v2.91、ucos-iii的v3.03),例程部分包含完整目录文件夹,有...
ucos-ii中文书(邵贝贝)PDF版.rar � � � � \SOFTWARE\uCOS-II 与 µ C/OS-II 相关的文件都放在这个目录下。 � � � � \SOFTWARE\uCOS-II\EX1_x86L 这个目录里包括例 1 的源代码 ( 参见 1.07, 例 1) ,可以...
将ucos-ii成功移植到LPC2148 ARM7并实现了LCD1602的驱动
内含代码详解,一部分的程序都有解释,以及实验的心得体会。
UCOS-II教程 一本完整的关于UCOS-II教程
文件为移植好的stm32 ucos-ii的keil4工程文件,移植日期2012年7月20日,各种移植源码均为最新版
最近将ucos-ii在ARM7(LPC2220)上移植一遍。 由于我们开发的目的是针对学生学习进行开发的,因此里面的注释很好,并配有书籍说明(ARM嵌入式接口技术应用.doc)。 在该书中详细讲解了移植全过程,我在此将源代码...