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