?? 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。
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 + -