📄 ggt_cpu_c.lst
字号:
ARM COMPILER V2.32a, GGT_CPU_c 28/02/08 23:05:54 PAGE 1
ARM COMPILER V2.32a, COMPILATION OF MODULE GGT_CPU_c
OBJECT MODULE PLACED IN .\Output\GGT_CPU_c.obj
COMPILER INVOKED BY: D:\Program Files\Keil\ARM\BIN\CA.exe Source\Kernel\GGT_CPU_c.c ARM BROWSE DEBUG PRINT(.\LIST\GGT_CP
-U_C.LST) TABS(4) OBJECT(.\Output\GGT_CPU_c.obj)
stmt level source
1 /****************************************************************************************************
2 ** Gogoto OS
3 ** (c) Copyright 2007-2008, luyigui(卢益贵)
4 ** All Rights Reserved
5 ** V1.00.0
6 **
7 ** 狗狗兔嵌入式多任务系统(基于消息机制)
8 ** 绿城代码、GGT-OS、Gogoto OS、狗狗兔嵌入式、狗狗兔系统
9 ** QQ:48092788
10 **
11 **------------------文件信息------------------------------------------------------------------------
12 ** 文件名: GGT_CPU_c.c
13 ** 创建人: 卢益贵
14 ** 日 期: 2007年12月8日
15 ** 版 本: V1.00.0
16 ** 描 述: Gogoto OS 与CPU相关的C核心代码部分,将所有移植可能与CPU和编译器相关的部分放置与此,
17 方便移植。
18 **
19
20 **------------------修改记录------------------------------------------------------------------------
21 ** 修改人: 卢益贵
22 ** 版 本: V1.00.1
23 ** 日 期: 2008年1月5日
24 ** 描 述: 增加OSIsrBegin和OSIsrEnd函数,考虑到CPU允许中断嵌套的可能,特为此增加这个两个函数,如果
25 CPU允许中断嵌套,将GGT_CPU.h头文件的OS_INT_COUNT 定义为1即可
26 **
27 ****************************************************************************************************/
28
29 #include "GGT_OS.h"
30 #include "GGT_CPU.h"
31 #include "GGT_Func.h"
32 #include "GGT_SysType.h"
33 #include "GGT_Kernel.h"
34
35 #define T0IR (*((volatile unsigned long *) 0xE0004000))
36 #define T0TCR (*((volatile unsigned long *) 0xE0004004))
37 #define T0TC (*((volatile unsigned long *) 0xE0004008))
38 #define T0MCR (*((volatile unsigned long *) 0xE0004014))
39 #define T0MR0 (*((volatile unsigned long *) 0xE0004018))
40
41 #define VICVectAddr0 (*((volatile unsigned long *) 0xFFFFF100))
42 #define VICVectCntl0 (*((volatile unsigned long *) 0xFFFFF200))
43 #define VICIntEnable (*((volatile unsigned long *) 0xFFFFF010))
44
45 #define VICVectAddr (*((volatile unsigned long *) 0xFFFFF030))
46
47 #if(OS_INT_COUNT)
48 INT32 OSIrqCount = 0;
49 #endif
50
51 /****************************************************************************************************
52 ** 函数名: OSClockIRQ
53 ** 描 述: 系统时钟中断函数。系统时钟启动后,第一次节拍发生时,pOSTskNow等于pOSTskMain,
54 从而达到把main函数设置为main任务的目的。
55
56 ** 输 入: 无
57 ** 输 出: 无
58 ** 创建人: 卢益贵
ARM COMPILER V2.32a, GGT_CPU_c 28/02/08 23:05:54 PAGE 2
59 ** 日 期: 2007年12月12日
60
61 **------------------修改记录------------------------------------------------------------------------
62 ** 修改人:
63 ** 版 本:
64 ** 日 期:
65 ** 描 述:
66 **
67 **--------------------------------------------------------------------------------------------------
68 ****************************************************************************************************/
69 void DelayNS(int Time) __arm
70 {
71 1 // (1000000000 / (11059200 * 5)) = 18 每个
72 1 // 在调用时消耗两个指令:
73 1 // Mov R0,#Time
74 1 // B DelayNS
75 1 Time = (Time - 18 * 5) / (18 * 3); // 估计消耗三个指令:
76 1 // SUB R0, R0, #90
77 1 // DVF R0, R0, #54
78 1 __asm
79 1 {
80 1 LOOP:
81 1 SUB R0, R0, #1
82 1 CMP R0, #0
83 1 BLE LOOP
84 1 }
85 1 }
86
87 void OSClockInt(void) __arm __task
88 {
89 1 // 如果CPU或OS允许中断嵌套,应该在此判断是否是嵌套,是就退出
90 1 #if(OS_INT_COUNT)
91 1 __asm
92 1 {
93 1 LDR R8, =OSIrqCount
94 1 LDR R8,[R8]
95 1 CMP R8,#0
96 1 BEQ SaverTaskData
97 1 }
98 1 T0IR = 0x01;
99 1 VICVectAddr = 0;
100 1 return;
101 1 #endif
102 1 // 保存当前任务环境
103 1 __asm
104 1 {
105 1 SaverTaskData:
106 1 STMDB SP!,{R0-R1}
107 1 STMDB SP,{SP}^
108 1 LDMDB SP,{R0}
109 1 SUB LR,LR,#4
110 1 STMDB R0!,{LR}
111 1 STMDB R0!,{R2-R12,LR}^
112 1 MRS R1,SPSR
113 1 LDMIA SP!,{R2-R3}
114 1 STMDB R0!,{R1-R3}
115 1
116 1 LDR R1,=pOSTskNow
117 1 LDR R1,[R1]
118 1 STR R0,[R1,#4]
119 1 }
120 1
121 1 /*
122 1 __asm
123 1 {
124 1 //SaverTaskData:
ARM COMPILER V2.32a, GGT_CPU_c 28/02/08 23:05:54 PAGE 3
125 1 STMDB SP,{SP}^
126 1 LDMDB SP,{R8}
127 1 MOV R9,R8
128 1 SUB LR,LR,#4
129 1 STMDB R8!,{LR}
130 1 STMDB R8!,{LR}^
131 1 STMDB R8!,{R9}
132 1 STMDB R8!,{R0-R12}^
133 1 MRS R9,SPSR
134 1 STMDB R8!,{R9}
135 1
136 1 LDR R1,=pOSTskNow
137 1 LDR R1,[R1]
138 1 STR R0,[R1,#4]
139 1 }
140 1 */
141 1
142 1 //进行任务调度
143 1 OSTaskDispatch();
144 1
145 1 //定时器计数
146 1 OSTimerCheck();
147 1
148 1 //中断结束
149 1 T0IR = 0x01;
150 1 VICVectAddr = 0;
151 1
152 1 //就绪任务出列,并加载执行
153 1 __asm
154 1 {
155 1 LDR R4,=pOSTskNow ;当前任务变量地址
156 1 LDR R3,=pOSTskReady ;就绪任务变量地址
157 1 MOV R5, R3 ;保存就绪任务变量地址
158 1 LDR R3,[R3] ;R3=就绪任务数据区地址
159 1 STR R3,[R4] ;pOSTskNow = pOSTskReady
160 1 LDR R3,[R3] ;R3=pOSTskReady-pNext
161 1 STR R3,[R5] ;pOSTskReady = pOSTskReady-pNext
162 1
163 1 LDR R4,[R4]
164 1 LDR LR,[R4,#4]
165 1 LDMIA LR!,{R2}
166 1 MSR SPSR_cxsf,R2
167 1 ADD R0,LR,#60
168 1 STMDB SP,{R0}
169 1 LDMDB SP,{SP}^
170 1 LDMIA LR!,{R0-R12,LR}^
171 1 LDMIA LR!,{LR}
172 1 MOVS PC, LR
173 1 }
174 1
175 1 /*
176 1 __asm
177 1 {
178 1 LDR R8,=pOSTskNow ;当前任务变量地址
179 1 LDR R9,=pOSTskReady ;就绪任务变量地址
180 1 MOV R10, R9 ;保存就绪任务变量地址
181 1 LDR R9,[R9] ;R3=就绪任务数据区地址
182 1 STR R9,[R8] ;pOSTskNow = pOSTskReady
183 1 LDR R9,[R9] ;R3=pOSTskReady-pNext
184 1 STR R9,[R10] ;pOSTskReady = pOSTskReady-pNext
185 1
186 1 LDR R8,[R8]
187 1 LDR R8,[R8,#4]
188 1 LDMIA R8!,{R9}
189 1 MSR SPSR_cxsf,R9
190 1 LDMIA R8!,{R0-R12,SP,LR,PC}^
ARM COMPILER V2.32a, GGT_CPU_c 28/02/08 23:05:54 PAGE 4
191 1 }
192 1 */
193 1 }
194
195 /****************************************************************************************************
196 ** 函数名: OSClockInit
197 ** 描 述: 打开系统节拍时钟
198 ** 输 入: 无
199 ** 输 出: 无
200 ** 创建人: 卢益贵
201 ** 日 期: 2007年12月8日
202
203 **------------------修改记录------------------------------------------------------------------------
204 ** 修改人:
205 ** 日 期:
206 ** 说 明:
207 ** 原代码:
208 **--------------------------------------------------------------------------------------------------
209 ****************************************************************************************************/
210 void OSClockInit(void)
211 {
212 1 T0IR = 1;
213 1 T0TC = 0;
214 1 T0TCR = 0x01;
215 1 T0MCR = 0x03;
216 1 T0MR0 = OSGetFPCLK() / OSGetTick();
217 1 VICVectAddr0 = (UINT32)OSClockInt;
218 1 VICVectCntl0 = 0x20 | 4;
219 1 VICIntEnable |= (1 << 4);
220 1 }
221
222 /****************************************************************************************************
223 ** 函数名: OSStackAlloc
224 ** 描 述: 分配任务堆栈的函数
225 ** 输 入: 无
226 ** 输 出: 返回堆栈地址
227 ** 创建人: 卢益贵
228 ** 日 期: 2007年12月8日
229
230 **------------------修改记录------------------------------------------------------------------------
231 ** 修改人:
232 ** 日 期:
233 ** 说 明:
234 ** 原代码:
235 **--------------------------------------------------------------------------------------------------
236 ****************************************************************************************************/
237 UINT32* OSStackAlloc(void)
238 {
239 1 // 满降序堆栈
240 1 return((UINT32*)(((UINT32)BoxAlloc(OSGetBoxStack())) + OSGetSizeStack()));
241 1 }
242
243 /****************************************************************************************************
244 ** 函数名: OSStackInit
245 ** 描 述: 初始化任务堆栈
246 ** 输 入: 无
247 ** 输 出: 返回堆栈地址
248 ** 创建人: 卢益贵
249 ** 日 期: 2007年12月8日
250
251 **------------------修改记录------------------------------------------------------------------------
252 ** 修改人:
253 ** 日 期:
254 ** 说 明:
255 ** 原代码:
256 **--------------------------------------------------------------------------------------------------
ARM COMPILER V2.32a, GGT_CPU_c 28/02/08 23:05:54 PAGE 5
257 ****************************************************************************************************/
258 UINT32* OSStackInit(void *pTaskBody, UINT32 *pStack, UINT32 Mode, UINT32 TaskParam)
259 {
260 1 // 满降序堆栈
261 1 *--pStack = (UINT32 *)pTaskBody; /* pc */
262 1 *--pStack = (UINT32 *)pTaskBody; /* lr */
263 1 *--pStack = 0; /* r12 */
264 1 *--pStack = 0; /* r11 */
265 1 *--pStack = 0; /* r10 */
266 1 *--pStack = 0; /* r9 */
267 1 *--pStack = 0; /* r8 */
268 1 *--pStack = 0; /* r7 */
269 1 *--pStack = 0; /* r6 */
270 1 *--pStack = 0; /* r5 */
271 1 *--pStack = 0; /* r4 */
272 1 *--pStack = 0; /* r3 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -