?? arm_00_os_taskswitch.lst
字號(hào):
ARM COMPILER V2.50a, ARM_00_OS_TaskSwitch 28/08/06 09:18:53 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 DEBUG TABS(4)
stmt level source
1 /**********************************************************************************************
2 本程序只供學(xué)習(xí)使用,不得用于其它任何用途,否則后果自負(fù)。
3
4 ARM_00_OS_TaskSwitch.c file
5
6 注意:該文件必須設(shè)置為ARM模式。
7
8 作者:Computer-lov
9 建立日期:2006-5-1
10 修改日期:2006-5-16
11 最后修改時(shí)間:2006-08-25
12 版本:V1.0
13 版權(quán)所有,盜版必究。
14 任何技術(shù)問題可到我的博客上留言: http://computer00.21ic.org
15 Copyright(C) Computer-lov 2006-2016
16 All rights reserved
17 **********************************************************************************************/
18
19 #include "CPU.H"
20
21 #include "My_type.h"
22 #include "LED.H"
23 #include "UART.H"
24 #include "KEYS.H"
25 #include "interrupt.h"
26 #include "ARM_00_OS_Core.H"
27 #include "ARM_00_OS_TaskSwitch.H"
28
29 /**********************************************************************************************
30 功能:禁止中斷。
31 入口參數(shù)1:DisEnabledBit。即CPSR中對(duì)應(yīng)的I位和Q位。
32 頭文件中有定義,#define OS_I_Bit 0x80 #define OS_F_Bit 0x40
33 關(guān)IRQ中斷時(shí),使用OS_I_Bit,關(guān)FIQ中斷時(shí),使用OS_F_Bit。
34 兩個(gè)都關(guān)時(shí),將兩者按位或,即 OS_I_Bit | OS_F_Bit
35 返回:無。
36 使用資源:使用軟中斷號(hào)0。
37 備注:使用了內(nèi)嵌的ARM指令,該函數(shù)所在的文件必須設(shè)置為ARM模式。
38 **********************************************************************************************/
39 void DisEnableInterrupt(uint32 DisEnableBit) __swi(0)
40 {
41 1 __asm LDMIA SP!,{R8} //堆棧中保存的是SPSR寄存器(參看SWI_VEC.s文件),將其彈出至R8中。
42 1 __asm ORR R8,R8,R0,LSL #0 //R8中的值,跟傳遞進(jìn)來的DisEnableBit(被放在R0中)相或。{}
43 1 __asm STMDB SP!,{R8} //將設(shè)置好的SPSR寄存器,壓回堆棧
44 1
45 1 DisEnableBit=0; //防止編譯器警告。請(qǐng)不要?jiǎng)h除該語句。如果刪除該語句,編譯器可能會(huì)刪除某些語句
46 1 //從而導(dǎo)致程序運(yùn)行錯(cuò)誤
47 1 }
48 //////////////////////////////////End of function//////////////////////////////////////////////
49
50
51
52 /**********************************************************************************************
53 功能:使能中斷。
54 入口參數(shù)1:EnabledBit。即CPSR中對(duì)應(yīng)的I位和Q位。
55 頭文件中有定義,#define OS_I_Bit 0x80 #define OS_F_Bit 0x40
56 關(guān)IRQ中斷時(shí),使用OS_I_Bit,關(guān)FIQ中斷時(shí),使用OS_F_Bit。
57 兩個(gè)都關(guān)時(shí),將兩者按位或,即 OS_I_Bit | OS_F_Bit
58 返回:無。
59 使用資源:使用軟中斷號(hào)1。
ARM COMPILER V2.50a, ARM_00_OS_TaskSwitch 28/08/06 09:18:53 PAGE 2
60 備注:使用了內(nèi)嵌的ARM指令,該函數(shù)所在的文件必須設(shè)置為ARM模式。
61 **********************************************************************************************/
62 void EnableInterrupt(uint32 EnableBit) __swi(1)
63 {
64 1 __asm LDMIA SP!,{R8} //堆棧中保存的是SPSR寄存器(參看SWI_VEC.s文件),將其彈出至R8中
65 1 __asm MVN R0,R0 //EnableBit(被放在R0中)取反{}
66 1 __asm AND R8,R8,R0 //R8中的值,跟R0相與{}
67 1 __asm STMDB SP!,{R8} //將設(shè)置好的SPSR寄存器,壓回堆棧
68 1
69 1
70 1 EnableBit=0; //防止編譯器警告。請(qǐng)不要?jiǎng)h除該語句
71 1
72 1 }
73 //////////////////////////////////End of function//////////////////////////////////////////////
74
75
76
77 /**********************************************************************************************
78 功能:?jiǎn)?dòng)操作系統(tǒng)。
79 入口參數(shù)1:AddrOfSystemIdle。必須設(shè)置為系統(tǒng)空閑任務(wù)的入口地址。系統(tǒng)啟動(dòng)后,從系統(tǒng)空閑任務(wù)開始運(yùn)行。
80 入口參數(shù)2:Mode。系統(tǒng)空閑任務(wù)代碼的模式。可以選擇ARM_MODE或者THUMB_MODE。
81 返回:無。
82 使用資源:使用軟中斷號(hào)2。
83 備注:使用了內(nèi)嵌的ARM指令,該函數(shù)所在的文件必須設(shè)置為ARM模式。系統(tǒng)啟動(dòng)后,進(jìn)入系統(tǒng)空閑任務(wù)。
84 **********************************************************************************************/
85 void OSStart(uint32 AddrOfSystemIdle,uint32 Mode) __swi(2)
86 {
87 1 __asm ADD SP,SP,#20 //{}調(diào)整SP,使其指向返回地址的前一個(gè)字
88 1 __asm STMDB SP,{R0} //將入口地址壓入堆棧中的返回地址處
89 1
90 1 __asm SUB SP,SP,#20 //{}將堆棧指針調(diào)回
91 1
92 1 __asm LDMIA SP!,{R8} //將SPSR彈出,放入R8中
93 1
94 1 Mode|=~(0x20); //將傳遞進(jìn)來的Mode其它位設(shè)置為1,只保留T位
95 1
96 1 __asm ORR R8,R8,#0x20 //將SPSR中的T位設(shè)置為1{}
97 1 __asm AND R8,R8,R1 //將SPSR的值與Mode相與。從而T位跟Mode的T位相同{}
98 1
99 1 __asm STMDB SP!,{R8} //將SPSR壓回棧中
100 1
101 1
102 1 OSCurrentPcb=&OSSystemIdlePcb; //當(dāng)前任務(wù)為系統(tǒng)空閑任務(wù)
103 1
104 1 AddrOfSystemIdle=0; //防止編譯器警告。請(qǐng)不要?jiǎng)h除該語句
105 1
106 1 }
107 //////////////////////////////////End of function//////////////////////////////////////////////
108
109
110 /**********************************************************************************************
111 功能:保存堆棧指針。堆棧指針被保存在當(dāng)前任務(wù)的TaskSP成員中。
112 入口參數(shù)1:sp。當(dāng)前任務(wù)堆棧指針的地址值。
113 返回:無。
114 備注:sp由R0寄存器傳入。
115 **********************************************************************************************/
116 void OSSaveSP(uint32 sp)
117 {
118 1 OSCurrentPcb->TaskSP=sp; //保存當(dāng)前堆棧指針
119 1 }
120 //////////////////////////////////End of function//////////////////////////////////////////////
121
122
123 /**********************************************************************************************
124 功能:恢復(fù)堆棧指針。將當(dāng)前任務(wù)的堆棧指針恢復(fù)。
125 入口參數(shù)1:無。
ARM COMPILER V2.50a, ARM_00_OS_TaskSwitch 28/08/06 09:18:53 PAGE 3
126 返回:堆棧指針的地址值。被保存在R0中。
127 備注:無。
128 **********************************************************************************************/
129 uint32 OSResumeSP(void)
130 {
131 1 return OSCurrentPcb->TaskSP; //將堆棧指針的地址值返回
132 1 }
133 //////////////////////////////////End of function//////////////////////////////////////////////
134
135 /**********************************************************************************************
136 功能:設(shè)置堆棧。任務(wù)創(chuàng)建時(shí),要設(shè)置好其堆棧,使其看起來,就像任務(wù)剛被切換的任務(wù)一樣。
137 入口參數(shù)1:StackAddr。32位的堆棧入口地址值,堆棧是往下生長(zhǎng)的,所以入口地址應(yīng)該是堆棧區(qū)的最高地址。
138 入口參數(shù)2:TaskEntryAddr。32位的任務(wù)入口地址值。
139 入口參數(shù)3:Mode。被創(chuàng)建任務(wù)代碼的模式。可選擇為OS_ARM_MODE或者OS_THUMB_MODE。
140 返回:32位的堆棧地址。被壓入堆棧后,堆棧指針會(huì)更新。
141 使用資源:使用軟中斷號(hào)4。
142 備注:無。
143 **********************************************************************************************/
144 uint32 OSSetStack(uint32 StackAddr,uint32 TaskEntryAddr,uint32 Mode) __swi(4)
145 {
146 1 #define PushedBytes (16*4) //壓入了16個(gè)字,共64字節(jié)
147 1 //R0中保存的是堆棧入口地址
148 1 __asm MOV R12,R0 //{}StackAddr傳進(jìn)時(shí),被放在了R0中。將R0轉(zhuǎn)存至R12中。
149 1 __asm STMDB R12!,{R3} //入口地址被TaskEntryAddr被編譯器轉(zhuǎn)移至R3中。將R3壓棧
150 1 __asm MOV R8,#0 //{}R8清零
151 1 __asm STMDB R12!,{R8} //該位置保存的是R3。將其清0。
152 1 __asm STMDB R12!,{R8} //該位置保存的是R2。將其清0。
153 1 __asm STMDB R12!,{R8} //該位置保存的是R1。將其清0。
154 1 __asm STMDB R12!,{R8} //該位置保存的是R0。將其清0。
155 1
156 1 __asm LDMIA SP,{R8} //將剛壓入的SPSR(見SWI_VEC.S文件)出棧至R8中。
157 1
158 1
159 1 Mode|=~(0x20); //將Mode的其它位置1,只保留T位。
160 1 __asm ORR R8,R8,#0x20 //將SPSR中的T位置1。
161 1 __asm AND R8,R8,R2 //將SPSR的值與Mode相與。從而T位跟Mode的T位相同{}
162 1
163 1 __asm STMDB R12!,{R8} //將SPSR壓棧。任務(wù)被調(diào)度時(shí),SPSR將被返回至CPSR。
164 1
165 1 __asm MOV R8,#0 //R8清0{}
166 1
167 1 __asm STMDB R12!,{R8} //該位置保存的是用戶模式下的R14。將其清0。
168 1
169 1 __asm STMDB R12!,{R8} //該位置保存的是R12。將其清0。
170 1 __asm STMDB R12!,{R8} //該位置保存的是R11。將其清0。
171 1 __asm STMDB R12!,{R8} //該位置保存的是R10。將其清0。
172 1 __asm STMDB R12!,{R8} //該位置保存的是9。將其清0。
173 1 __asm STMDB R12!,{R8} //該位置保存的是R8。將其清0。
174 1 __asm STMDB R12!,{R8} //該位置保存的是R7。將其清0。
175 1 __asm STMDB R12!,{R8} //該位置保存的是R6。將其清0。
176 1 __asm STMDB R12!,{R8} //該位置保存的是R5。將其清0。
177 1 __asm STMDB R12!,{R8} //該位置保存的是R4。將其清0。
178 1
179 1 TaskEntryAddr=0; //防止編譯器警告。請(qǐng)不要?jiǎng)h除該語句。
180 1
181 1 return StackAddr-PushedBytes; //返回堆棧指針
182 1 }
183 //////////////////////////////////End of function//////////////////////////////////////////////
184
185
186 /**********************************************************************************************
187 功能:切換任務(wù)。任務(wù)被切換到優(yōu)先級(jí)最高的就緒態(tài)任務(wù)。
188 入口參數(shù):無。
189 返回:無。
190 使用資源:使用軟中斷號(hào)3。
191 備注:該函數(shù)為任務(wù)切換函數(shù),修改這里的代碼是要注意,可能會(huì)導(dǎo)致跑飛。
ARM COMPILER V2.50a, ARM_00_OS_TaskSwitch 28/08/06 09:18:53 PAGE 4
192 **********************************************************************************************/
193 void OSTaskSwitch(void) __swi(3)
194 {
195 1 //將用戶模式下的堆棧地址裝入到R8中
196 1 __asm MOV R8,SP //{}特權(quán)模式下的堆棧指針暫時(shí)放到R8{}
197 1 __asm STMDB R8!,{R13}^ //將用戶模式下的堆棧指針R13放入到特權(quán)模式下的堆棧中{}
198 1 __asm NOP //插入一個(gè)NOP指令,在訪問用戶模式下的寄存器后,后面不能緊跟訪問備份寄存器的指令
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -