?? arm_00_os_core.lst
字號:
ARM COMPILER V2.00d, ARM_00_OS_Core 22/12/07 19:56:45 PAGE 1
ARM COMPILER V2.00d, COMPILATION OF MODULE ARM_00_OS_Core
OBJECT MODULE PLACED IN ARM_00_OS_Core.OBJ
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe ARM_00_OS_Core.c THUMB DEBUG TABS(4)
stmt level source
1 /**********************************************************************************************
2 本程序只供學習使用,不得用于其它任何用途,否則后果自負。
3
4 ARM_OS_main.c file
5
6 LPC213x上的操作系統——ARM_OS
7
8 作者:heciang
9 聯系電話:13811129591
10 QQ:176780142
11 Email:heciang@126.com
12 建立日期:2006-5-1
13 修改日期:2006-5-15
14 最后修改時間:2006-08-25
15 版本:V1.0
16
17 Copyright(C) Computer-lov 2006-2016
18 All rights reserved
19 **********************************************************************************************/
20
21 #include "CPU.H"
22
23 #include "interrupt.h"
24 #include "LED.H"
25 #include "ARM_00_OS_TaskSwitch.H"
26 #include "my_type.h"
27 #include "ARM_00_OS_Core.H"
28 #include "UART.H"
29 #include "KEYS.H"
30 #include "Task.h"
31
32 OSpcb * OSReadyList; //就緒態任務表表頭
33 OSpcb * OSSuspendList; //掛起態任務表表頭
34 OSpcb * OSDelayList; //延時態任務表表頭
35 OSpcb * OSCurrentPcb; //當前運行的任務
36
37
38 OSpcb OSSystemIdlePcb; //系統空閑任務
39 OSShortPcb OSSuspendListBottom; //掛起態列表表底
40 OSShortPcb OSDelayListBottom; //延時態列表表底
41
42
43 OSdevice OSDeviceBottom; //設備列表的底部
44 OSdevice * OSDeviceList; //設備列表
45
46 volatile uint32 CopyOfVICIntEnable; //用來備份CopyOfVICIntEnable的狀態
47
48 //volatile uint32 CopyOfIRQEN; //用來備份IRQEN的狀態
49 //volatile uint32 CopyOfFIQEN; //用來備份FIQEN的狀態
50
51
52 volatile uint32 OSEnCrCount; //用來統計進入臨界代碼段次數
53
54
55 volatile uint32 TaskAmount; //用來統計共有多少個任務
56
57
58 volatile uint32 TimeOfTaskStart; //用來保存一個任務剛被切換到運行態的時刻
59
ARM COMPILER V2.00d, ARM_00_OS_Core 22/12/07 19:56:45 PAGE 2
60 #define OSMemoryLack 0x0000000100000000 /*錯誤號:內存資源不足*/
61
62 /**********************************************************************************************
63 功能:內存管理。
64 入口參數1:Operation。操作方式。可以設置為MEMORY_ALLOCATION(分配)、MEMORY_FREE(釋放)、統計使用量(MEM
-ORY_STATISTIC)
65 入口參數2:StartAddr。起始地址,釋放內存時使用。
66 入口參數3:Length。申請內存或釋放內存時的長度,單位為字節。但實際分配時,是按塊分配的,所以分配時,
67 實際分配到的數量可能會比指定的多,所以分配時,最好按塊的整數倍大小來指定分配長度。
68
69 返回:32無符號型整數。
70 當操作為分配內存時,返回32位的內存首地址,返回0表示無足夠多的可以用內存。
71 當操作為釋放內存時,返回1表示釋放成功。返回0表示釋放出錯。
72 當操作為統計內存使用量時,返回的是內存被使用的字節數。
73 當操作為獲取緩沖池大小時,返回的是內存緩沖池大小。
74
75 備注:緩沖池大小由OSSizeOfMemoryPool指定。每塊的大小由OSSizePerBlock指定
76 **********************************************************************************************/
77 uint32 OSMemoryManage(uint32 Operation,uint32 StartAddr,uint32 Length)
78 {
79 1 //內存分配表
80 1 //內存分配表是32位整數的一維數組。用每一位來表示一塊是否被使用。當某位設置為1時,表示那一塊被使用。
81 1 //當某位為0時,表示那一塊可用。
82 1 static uint32 OSMemoryTable[OSSizeOfMemoryPool/OSSizePerBlock/32];
83 1
84 1 static uint32 OSMemoryPool[OSSizeOfMemoryPool/4]; //內存緩沖池。內存緩沖池為一個大是數組
85 1
86 1 uint32 BlankCount; //統計空塊的計數器
87 1 uint32 Mask; //分配內存時用的掩碼
88 1 volatile uint32 i,j; //循環用的變量
89 1
90 1 OSEnterCritical(); //進入臨界段
91 1
92 1 switch(Operation) //根據操作碼,選擇不同的操作
93 1 {
94 2 case MEMORY_INIT: //如果是內存初始化
95 2 {
96 3 for(i=0;i<OSSizeOfMemoryPool/OSSizePerBlock/32;i++)
97 3 {
98 4 OSMemoryTable[i]=0; //則將整張內存分配表清0
99 4 }
100 3 OSExitCritical(); //退出臨界段
101 3 return 1; //返回1
102 3 }
103 2
104 2 case MEMORY_ALLOCATION: //如果是內存分配,則
105 2 {
106 3 BlankCount=0; //先將內存空塊的數量清0
107 3 for(i=0;i<(OSSizeOfMemoryPool/OSSizePerBlock/32);i++) //掃描整個內存分配表
108 3 {
109 4 Mask=1; //掩碼被設置為1,即最低位為1,其它位為0。
110 4 if(OSMemoryTable[i]==0xFFFFFFFF) //如果該字中的所以位都為1,表示該字節對應的所有塊都被占用
111 4 {
112 5 BlankCount=0; //空塊計數器置0
113 5 continue; //退出本次循環,查找下一個字
114 5 }
115 4 for(j=0;j<32;j++) //掃描一個字的32個bit是否有空閑的RAM
116 4 {
117 5 if((Mask & OSMemoryTable[i])==0) //如果該位為0,表示該塊空閑
118 5 {
119 6 BlankCount++; //空塊計數器加1。
120 6 }
121 5 else
122 5 {
123 6 BlankCount=0; //如果遇到非空塊,則空塊計數器置0。
124 6 }
ARM COMPILER V2.00d, ARM_00_OS_Core 22/12/07 19:56:45 PAGE 3
125 5 if((BlankCount*OSSizePerBlock)>=Length) //如果空閑的RAM,大于或者等于需要的長度,那么分配成功
126 5 {
127 6 //計算被分配到的內存的起始地址,并將其保存在StartAddr中。
128 6 StartAddr=((uint32)OSMemoryPool)+(i*32+j+1)*OSSizePerBlock-OSSizePerBlock*BlankCount;
129 6 while(1) //設置被使用的塊為1
130 6 {
131 7 OSMemoryTable[i] |=Mask; //將已經被分配的標志為1
132 7 Mask>>=1; //調整掩碼的值
133 7 if(j==0) //如果已到最低位
134 7 {
135 8 Mask=0x80000000; //則掩碼調整為第31位為1
136 8 j=32;
137 8 i--; //移到下一位
138 8 }
139 7 BlankCount--; //空塊計數減1
140 7 j--; //移到下一個字
141 7 if(BlankCount==0) //如果空塊計數器減到0,則標志完畢
142 7 {
143 8 OSExitCritical();
144 8 return StartAddr; //將啟始地址StartAddr返回
145 8 }
146 7 }
147 6 }
148 5 Mask<<=1; //掩碼調整,移動到下一個塊
149 5 }
150 4 }
151 3 OSExitCritical();
152 3 return 0; //如果沒有足夠大的內存塊可用,則返回0,分配失敗
153 3 }
154 2
155 2 case MEMORY_FREE: //如果操作碼是釋放內存
156 2 {
157 3 if(Length==0) //如果要釋放的內存長度為0
158 3 {
159 4 OSExitCritical(); //退出臨界段
160 4 return 1; //返回1,釋放成功
161 4 }
162 3 i=(StartAddr-(uint32)OSMemoryPool)/(32*OSSizePerBlock); //計算出指定地址內存在內存分配表中的位置
163 3 j=(StartAddr-(uint32)OSMemoryPool-i*32*OSSizePerBlock)/OSSizePerBlock;
164 3 Mask=1<<j; //將掩碼調整到對應的值
165 3 while(Length) //直到全部被釋放為止
166 3 {
167 4 if((OSMemoryTable[i])&(Mask)==0) //如果該內存并未被分配,則說明發生了錯誤,
168 4 {
169 5 OSExitCritical(); //推出臨界段
170 5 return 0; //返回0,表示釋放失敗
171 5 }
172 4 OSMemoryTable[i] &=~Mask; //清除對應的位,即釋放該塊內存
173 4 j++; //調整到下一塊
174 4 Mask<<=1; //掩碼調整到下一塊的位置
175 4 if(j==32) //如果已經到最高位
176 4 {
177 5 Mask=1; //掩碼設置為1
178 5 j=0; //j回到最低位
179 5 i++; //調整下一個字
180 5 }
181 4 if(Length<=OSSizePerBlock) //如果釋放完畢
182 4 {
183 5 Length=0; //則Length設置為0,退出循環
184 5 }
185 4 else //如果沒釋放完畢
186 4 {
187 5 Length-=OSSizePerBlock; //則長度減小一個塊的量
188 5 }
189 4 }
190 3 OSExitCritical(); //退出臨界段
ARM COMPILER V2.00d, ARM_00_OS_Core 22/12/07 19:56:45 PAGE 4
191 3 return 1; //返回1,表示釋放成功
192 3 }
193 2
194 2 case MEMORY_STATISTIC: //如果操作碼是統計內存使用量
195 2 {
196 3 Length=0; //清Length
197 3 for(i=0;i<OSSizeOfMemoryPool/OSSizePerBlock/32;i++) //掃描整張內存分配表
198 3 {
199 4 if(OSMemoryTable[i]==0) //如果當前字是全0,則該字對應的內存都未被分配,
200 4 {
201 5 continue; //則跳過本次循環
202 5 }
203 4 if(OSMemoryTable[i]==0xFFFFFFFF) //如果當前字是全1,則該字對應的內存全部被分配
204 4 {
205 5 Length+=32*OSSizePerBlock; //Length累加上32塊的長度
206 5 continue; //退出本次循環
207 5 }
208 4 Mask=1; //掩碼設置為1
209 4 for(j=0;j<32;j++) //掃描當前字的32bit,看是否有內存被使用
210 4 {
211 5 if(OSMemoryTable[i]&Mask) //如果該塊被使用
212 5 {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -