📄 arm_00_os_taskswitch.lst
字号:
ARM COMPILER V2.50a, ARM_00_OS_TaskSwitch 16/05/06 14:55:45 PAGE 1
ARM COMPILER V2.50a, COMPILATION OF MODULE ARM_00_OS_TaskSwitch
OBJECT MODULE PLACED IN ARM_00_OS_TaskSwitch.OBJ
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe ARM_00_OS_TaskSwitch.c ARM INTERWORK BROWSE DEBUG TABS(4)
stmt level source
1 /**********************************************************************************************
2 本程序只供学习使用,不得用于其它任何用途,否则后果自负。
3
4 ARM_00_OS_TaskSwitch.c file
5
6 注意:该文件必须设置为ARM模式。
7
8 作者:Computer-lov
9 建立日期:2006-5-1
10 修改日期:2006-5-16
11 版本:V1.0
12 版权所有,盗版必究。
13 任何技术问题可到我的博客上留言: http://computer00.21ic.org
14 Copyright(C) Computer-lov 2006-2016
15 All rights reserved
16 **********************************************************************************************/
17
18 #include <ADuC7027.H>
19 #include "My_type.h"
20 #include "LED.H"
21 #include "UART.H"
22 #include "KEYS.H"
23 #include "interrupt.h"
24 #include "ARM_00_OS_Core.H"
25 #include "ARM_00_OS_TaskSwitch.H"
26
27 /**********************************************************************************************
28 功能:禁止中断。
29 入口参数1:DisEnabledBit。即CPSR中对应的I位和Q位。
30 头文件中有定义,#define OS_I_Bit 0x80 #define OS_F_Bit 0x40
31 关IRQ中断时,使用OS_I_Bit,关FIQ中断时,使用OS_F_Bit。
32 两个都关时,将两者按位或,即 OS_I_Bit | OS_F_Bit
33 返回:无。
34 使用资源:使用软中断号0。
35 备注:使用了内嵌的ARM指令,该函数所在的文件必须设置为ARM模式。
36 **********************************************************************************************/
37 void DisEnableInterrupt(uint32 DisEnableBit) __swi(0)
38 {
39 1 __asm LDMIA SP!,{R8} //堆栈中保存的是SPSR寄存器(参看SWI_VEC.s文件),将其弹出至R8中。
40 1 __asm ORR R8,R8,R0,LSL #0 //R8中的值,跟传递进来的DisEnableBit(被放在R0中)相或。{}
41 1 __asm STMDB SP!,{R8} //将设置好的SPSR寄存器,压回堆栈
42 1
43 1 DisEnableBit=0; //防止编译器警告。请不要删除该语句。如果删除该语句,编译器可能会删除某些语句
44 1 //从而导致程序运行错误
45 1 }
46 //////////////////////////////////End of function//////////////////////////////////////////////
47
48
49
50 /**********************************************************************************************
51 功能:使能中断。
52 入口参数1:EnabledBit。即CPSR中对应的I位和Q位。
53 头文件中有定义,#define OS_I_Bit 0x80 #define OS_F_Bit 0x40
54 关IRQ中断时,使用OS_I_Bit,关FIQ中断时,使用OS_F_Bit。
55 两个都关时,将两者按位或,即 OS_I_Bit | OS_F_Bit
56 返回:无。
57 使用资源:使用软中断号1。
58 备注:使用了内嵌的ARM指令,该函数所在的文件必须设置为ARM模式。
59 **********************************************************************************************/
ARM COMPILER V2.50a, ARM_00_OS_TaskSwitch 16/05/06 14:55:45 PAGE 2
60 void EnableInterrupt(uint32 EnableBit) __swi(1)
61 {
62 1 __asm LDMIA SP!,{R8} //堆栈中保存的是SPSR寄存器(参看SWI_VEC.s文件),将其弹出至R8中
63 1 __asm MVN R0,R0 //EnableBit(被放在R0中)取反
64 1 __asm AND R8,R8,R0 //R8中的值,跟R0相与{}
65 1 __asm STMDB SP!,{R8} //将设置好的SPSR寄存器,压回堆栈
66 1
67 1
68 1 EnableBit=0; //防止编译器警告。请不要删除该语句
69 1
70 1 }
71 //////////////////////////////////End of function//////////////////////////////////////////////
72
73
74
75 /**********************************************************************************************
76 功能:启动操作系统。
77 入口参数1:AddrOfSystemIdle。必须设置为系统空闲任务的入口地址。系统启动后,从系统空闲任务开始运行。
78 入口参数2:Mode。系统空闲任务代码的模式。可以选择ARM_MODE或者THUMB_MODE。
79 返回:无。
80 使用资源:使用软中断号2。
81 备注:使用了内嵌的ARM指令,该函数所在的文件必须设置为ARM模式。系统启动后,进入系统空闲任务。
82 **********************************************************************************************/
83 void OSStart(uint32 AddrOfSystemIdle,uint32 Mode) __swi(2)
84 {
85 1 __asm ADD SP,SP,#20 //{}调整SP,使其指向返回地址的前一个字
86 1 __asm STMDB SP,{R0} //将入口地址压入堆栈中的返回地址处
87 1
88 1 __asm SUB SP,SP,#20 //{}将堆栈指针调回
89 1
90 1 __asm LDMIA SP!,{R8} //将SPSR弹出,放入R8中
91 1
92 1 Mode|=~(0x20); //将传递进来的Mode其它位设置为1,只保留T位
93 1
94 1 __asm ORR R8,R8,#0x20 //将SPSR中的T位设置为1{}
95 1 __asm AND R8,R8,R1 //将SPSR的值与Mode相与。从而T位跟Mode的T位相同{}
96 1
97 1 __asm STMDB SP!,{R8} //将SPSR压回栈中
98 1
99 1
100 1 OSCurrentPcb=&OSSystemIdlePcb; //当前任务为系统空闲任务
101 1
102 1 AddrOfSystemIdle=0; //防止编译器警告。请不要删除该语句
103 1
104 1 }
105 //////////////////////////////////End of function//////////////////////////////////////////////
106
107
108 /**********************************************************************************************
109 功能:保存堆栈指针。堆栈指针被保存在当前任务的TaskSP成员中。
110 入口参数1:sp。当前任务堆栈指针的地址值。
111 返回:无。
112 备注:sp由R0寄存器传入。
113 **********************************************************************************************/
114 void OSSaveSP(uint32 sp)
115 {
116 1 OSCurrentPcb->TaskSP=sp; //保存当前堆栈指针
117 1 }
118 //////////////////////////////////End of function//////////////////////////////////////////////
119
120
121 /**********************************************************************************************
122 功能:恢复堆栈指针。将当前任务的堆栈指针恢复。
123 入口参数1:无。
124 返回:堆栈指针的地址值。被保存在R0中。
125 备注:无。
ARM COMPILER V2.50a, ARM_00_OS_TaskSwitch 16/05/06 14:55:45 PAGE 3
126 **********************************************************************************************/
127 uint32 OSResumeSP(void)
128 {
129 1 return OSCurrentPcb->TaskSP; //将堆栈指针的地址值返回
130 1 }
131 //////////////////////////////////End of function//////////////////////////////////////////////
132
133 /**********************************************************************************************
134 功能:设置堆栈。任务创建时,要设置好其堆栈,使其看起来,就像任务刚被切换的任务一样。
135 入口参数1:StackAddr。32位的堆栈入口地址值,堆栈是往下生长的,所以入口地址应该是堆栈区的最高地址。
136 入口参数2:TaskEntryAddr。32位的任务入口地址值。
137 入口参数3:Mode。被创建任务代码的模式。可选择为OS_ARM_MODE或者OS_THUMB_MODE。
138 返回:32位的堆栈地址。被压入堆栈后,堆栈指针会更新。
139 使用资源:使用软中断号4。
140 备注:无。
141 **********************************************************************************************/
142 uint32 OSSetStack(uint32 StackAddr,uint32 TaskEntryAddr,uint32 Mode) __swi(4)
143 {
144 1 #define PushedBytes (16*4) //压入了16个字,共64字节
145 1 //R0中保存的是堆栈入口地址
146 1 __asm MOV R12,R0 //{}StackAddr传进时,被放在了R0中。将R0转存至R12中。
147 1 __asm STMDB R12!,{R3} //入口地址被TaskEntryAddr被编译器转移至R3中。将R3压栈
148 1 __asm MOV R8,#0 //{}R8清零
149 1 __asm STMDB R12!,{R8} //该位置保存的是R3。将其清0。
150 1 __asm STMDB R12!,{R8} //该位置保存的是R2。将其清0。
151 1 __asm STMDB R12!,{R8} //该位置保存的是R1。将其清0。
152 1 __asm STMDB R12!,{R8} //该位置保存的是R0。将其清0。
153 1
154 1 __asm LDMIA SP,{R8} //将刚压入的SPSR(见SWI_VEC.S文件)出栈至R8中。
155 1
156 1
157 1 Mode|=~(0x20); //将Mode的其它位置1,只保留T位。
158 1 __asm ORR R8,R8,#0x20 //将SPSR中的T位置1。
159 1 __asm AND R8,R8,R2 //将SPSR的值与Mode相与。从而T位跟Mode的T位相同{}
160 1
161 1 __asm STMDB R12!,{R8} //将SPSR压栈。任务被调度时,SPSR将被返回至CPSR。
162 1
163 1 __asm MOV R8,#0 //R8清0{}
164 1
165 1 __asm STMDB R12!,{R8} //该位置保存的是用户模式下的R14。将其清0。
166 1
167 1 __asm STMDB R12!,{R8} //该位置保存的是R12。将其清0。
168 1 __asm STMDB R12!,{R8} //该位置保存的是R11。将其清0。
169 1 __asm STMDB R12!,{R8} //该位置保存的是R10。将其清0。
170 1 __asm STMDB R12!,{R8} //该位置保存的是9。将其清0。
171 1 __asm STMDB R12!,{R8} //该位置保存的是R8。将其清0。
172 1 __asm STMDB R12!,{R8} //该位置保存的是R7。将其清0。
173 1 __asm STMDB R12!,{R8} //该位置保存的是R6。将其清0。
174 1 __asm STMDB R12!,{R8} //该位置保存的是R5。将其清0。
175 1 __asm STMDB R12!,{R8} //该位置保存的是R4。将其清0。
176 1
177 1 TaskEntryAddr=0; //防止编译器警告。请不要删除该语句。
178 1
179 1 return StackAddr-PushedBytes; //返回堆栈指针
180 1 }
181 //////////////////////////////////End of function//////////////////////////////////////////////
182
183
184 /**********************************************************************************************
185 功能:切换任务。任务被切换到优先级最高的就绪态任务。
186 入口参数:无。
187 返回:无。
188 使用资源:使用软中断号3。
189 备注:该函数为任务切换函数,修改这里的代码是要注意,可能会导致跑飞。
190 **********************************************************************************************/
191 void OSTaskSwitch(void) __swi(3)
ARM COMPILER V2.50a, ARM_00_OS_TaskSwitch 16/05/06 14:55:45 PAGE 4
192 {
193 1 //将用户模式下的堆栈地址装入到R8中
194 1 __asm MOV R8,SP //{}特权模式下的堆栈指针暂时放到R8{}
195 1 __asm STMDB R8!,{R13}^ //将用户模式下的堆栈指针R13放入到特权模式下的堆栈中{}
196 1 __asm NOP //插入一个NOP指令,在访问用户模式下的寄存器后,后面不能紧跟访问备份寄存器的指令
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -