📄 arm_00_os_core.lst
字号:
212 5 }
213 4 }
214 3 OSExitCritical(); //退出临界段
215 3 return Length; //返回使用的内存数量
216 3 }
217 2
218 2 case GET_MEMORY_POOL_SIZE: //如果是获取缓冲池大小,
219 2 {
220 3 OSExitCritical(); //退出临界段
221 3 return OSSizeOfMemoryPool; //返回缓冲池的字节数
222 3 }
223 2
224 2 case MEMORY_TEST: //如果是内存检测
225 2 {
226 3 j=0xFF; //标志j为非0,即初始化成功
227 3 prints("Memory testing. ",1); //显示信息
228 3 for(i=0;i<OSSizeOfMemoryPool/4;i++) //检测整个内存缓冲池
229 3 {
230 4 OSMemoryPool[i]=0x55555555; //写入0x55555555
231 4 if(OSMemoryPool[i]!=0x55555555) //如果读回的不是0x55555555
232 4 {
233 5 j=0; //则测试失败
234 5 }
235 4 OSMemoryPool[i]=0xAAAAAAAA; //写入0xAAAAAAAA
236 4 if(OSMemoryPool[i]!=0xAAAAAAAA) //如果读回的不是0xAAAAAAAA
237 4 {
238 5 j=0; //则测试失败
239 5 }
240 4 OSMemoryPool[i]=0; //写入0
241 4 if(OSMemoryPool[i]!=0) //如果读回的不是0
242 4 {
243 5 j=0; //则测试失败
244 5 }
245 4 if(i%(OSSizeOfMemoryPool/4/80)==0) //显示测试进度。共显示80个>
246 4 {
247 5 prints(">",0);
248 5 }
249 4 }
250 3 prints("",1);
251 3 if(j) //如果测试成功
252 3 {
253 4 prints("Memory test passed.",1); //显示成功
254 4 }
255 3 else //否则,
256 3 {
ARM COMPILER V2.50a, ARM_00_OS_Core 28/08/06 09:18:53 PAGE 5
257 4 prints("Memroy test failed.",1); //显示测试失败
258 4 }
259 3 OSExitCritical(); //退出临界段
260 3 return j; //返回是否成功
261 3 }
262 2 default: OSExitCritical();return 0;
263 2 }
264 1 }
265 //////////////////////////////////End of function//////////////////////////////////////////////
266
267
268 /**********************************************************************************************
269 功能:进入临界段。
270 入口参数:无。
271 返回:无。
272 备注:该函数使用的是将中断分配寄存器清0的方法来关中断。比起用软中断,运行速度要快。
273 如果要开某个中断,则应该先调用一次该函数,然后再修改中断备份变量CopyOfVICIntEnable
274 的值,而不能直接修改VICIntEnable的值。否则会出错。
275 **********************************************************************************************/
276 void OSEnterCritical(void)
277 {
278 1 if(OSEnCrCount==0) //如果前面未关中断
279 1 {
280 2 // CopyOfVICIntEnable=VICIntEnable; //则将VICIntEnable值保存到备份中/*可能有潜在的bug,所以将其删除了*
-/
281 2 VICIntEnClr=0xFFFFFFFF; //将VICIntEnable清除,禁止中断
282 2 }
283 1 OSEnCrCount++; //进入临界段次数加1
284 1 }
285 //////////////////////////////////End of function//////////////////////////////////////////////
286
287
288 /**********************************************************************************************
289 功能:退出临界段
290 入口参数:无。
291 返回:无。
292 备注:无。
293 **********************************************************************************************/
294 void OSExitCritical(void)
295 {
296 1 if(OSEnCrCount>=1) //如果进入临界段的次数大于等于1次
297 1 {
298 2 OSEnCrCount--; //则次数减1
299 2 if(OSEnCrCount==0) //如果减次数减到0,则要开中断
300 2 {
301 3 VICIntEnable=CopyOfVICIntEnable; //打开所需要开的中断
302 3 }
303 2 }
304 1 }
305 //////////////////////////////////End of function//////////////////////////////////////////////
306
307
308 /**********************************************************************************************
309 功能:将pcb指向的任务从延时列表中删除
310 入口参数1:pcb。被指定的任务。
311 返回:0:删除失败。非0:删除成功。
312 备注:该函数使用前,应先进入临界段。
313 **********************************************************************************************/
314 uint32 DeleteFromDelayList(OSpcb *pcb)
315 {
316 1 if(pcb->Next==0){return 0;} //如果被删除的任务为表底,则不能删除,返回删除失败
317 1 if(pcb==OSDelayList) //如果被删除的pcb处于表头
318 1 {
319 2 OSDelayList=pcb->Next; //则延时表指向被删除任务pcb的下一个
320 2 OSDelayList->Prior=OSDelayList; //延时表的前趋指向它本身
321 2 }
ARM COMPILER V2.50a, ARM_00_OS_Core 28/08/06 09:18:53 PAGE 6
322 1 else //如果被删除的任务pcb处于中间,则
323 1 {
324 2 pcb->Prior->Next=pcb->Next; //pcb的前趋的后趋,设置为pcb的后趋
325 2 pcb->Next->Prior=pcb->Prior; //pcb的后趋的前趋,设置为pcb的前趋
326 2 }
327 1 return (uint32)pcb; //返回被删除的任务pcb
328 1 }
329 //////////////////////////////////End of function//////////////////////////////////////////////
330
331
332 /**********************************************************************************************
333 功能:将pcb指向的任务从就绪态列表中删除
334 入口参数1:pcb。被指定的任务。
335 返回:0:删除失败。非0:删除成功。
336 备注:该函数使用前,应先进入临界段。
337 **********************************************************************************************/
338 uint32 DeleteFromReadyList(OSpcb * pcb)
339 {
340 1 if(pcb->Next==0)return 0; //如果被删除的任务为表底,则不能删除,返回删除失败
341 1 if(pcb==OSReadyList) //如果被删除的pcb处于表头
342 1 {
343 2 OSReadyList=pcb->Next; //则就绪表指向被删除任务pcb的下一个
344 2 OSReadyList->Prior=OSReadyList; //就绪表的前趋指向它本身
345 2 }
346 1 else //如果被删除的任务pcb处于中间,则
347 1 {
348 2 pcb->Prior->Next=pcb->Next; //pcb的前趋的后趋,设置为pcb的后趋
349 2 pcb->Next->Prior=pcb->Prior; //pcb的后趋的前趋,设置为pcb的前趋
350 2 }
351 1 return (uint32)pcb; //返回被删除的任务pcb
352 1 }
353 //////////////////////////////////End of function//////////////////////////////////////////////
354
355
356 /**********************************************************************************************
357 功能:将pcb指向的任务从挂起列表中删除
358 入口参数1:pcb。被指定的任务。
359 返回:0:删除失败。非0:删除成功。
360 备注:该函数使用前,应先进入临界段。
361 **********************************************************************************************/
362 uint32 DeleteFromSuspendList(OSpcb *pcb)
363 {
364 1 if(pcb->Next==0)return 0; //如果被删除的任务为表底,则不能删除,返回删除失败
365 1 if(pcb==OSSuspendList) //如果被删除的pcb处于表头
366 1 {
367 2 OSSuspendList=pcb->Next; //则挂起态表指向被删除任务pcb的下一个
368 2 OSSuspendList->Prior=OSSuspendList; //挂起态表的前趋指向它本身
369 2 }
370 1 else //如果被删除的任务pcb处于中间,则
371 1 {
372 2 pcb->Prior->Next=pcb->Next; //pcb的前趋的后趋,设置为pcb的后趋
373 2 pcb->Next->Prior=pcb->Prior; //pcb的后趋的前趋,设置为pcb的前趋
374 2 }
375 1 return (uint32)pcb; //返回被删除的任务pcb
376 1 }
377 //////////////////////////////////End of function//////////////////////////////////////////////
378
379
380 /**********************************************************************************************
381 功能:将pcb指向的任务插入到挂起列表中
382 入口参数1:pcb。被指定的任务。
383 返回:无。
384 备注:该函数使用前,应先进入临界段。
385 **********************************************************************************************/
386 void InsertToSuspendList(OSpcb * pcb)
387 {
ARM COMPILER V2.50a, ARM_00_OS_Core 28/08/06 09:18:53 PAGE 7
388 1 pcb->Status=OSInSuspendStatus; //指定任务的状态设置为挂起状态
389 1 pcb->Next=OSSuspendList; //指定任务的后趋指向挂起态列表的表头
390 1 OSSuspendList->Prior=pcb; //挂起态任务列表的前趋指向指定任务pcb
391 1 OSSuspendList=pcb; //挂起态列表的表头设置为刚插入的指定任务
392 1 OSSuspendList->Prior=OSSuspendList; //挂起态列表表头的前趋指向它本身
393 1 }
394 //////////////////////////////////End of function//////////////////////////////////////////////
395
396
397 /**********************************************************************************************
398 功能:将pcb指向的任务插入到延时列表中
399 入口参数1:pcb。被指定的任务。
400 返回:无。
401 备注:该函数使用前,应先进入临界段。
402 **********************************************************************************************/
403 void InsertToDelayList(OSpcb * pcb)
404 {
405 1 pcb->Status=OSInDelayStatus; //指定任务的状态设置为延时状态
406 1 pcb->Next=OSDelayList; //指定任务的后趋指向延时态列表的表头
407 1 OSDelayList->Prior=pcb; //延时态任务列表的前趋指向指定任务pcb
408 1 OSDelayList=pcb; //延时态列表的表头设置为刚插入的指定任务
409 1 OSDelayList->Prior=OSDelayList; //延时态列表表头的前趋指向它本身
410 1 }
411 //////////////////////////////////End of function//////////////////////////////////////////////
412
413
414 /**********************************************************************************************
415 功能:将pcb指向的任务插入到就绪表中
416 入口参数1:pcb。被指定的任务。
417 返回:无。
418 备注:该函数使用前,应先进入临界段。
419 **********************************************************************************************/
420 void InsertToReadyList(OSpcb *pcb)
421 {
422 1 OSpcb * TempPcb; //用来查找就绪表,确定该插入到何处
423 1
424 1 pcb->Status=OSInReadyStatus; //指定任务的状态设置为就绪态
425 1
426 1 TempPcb=OSReadyList; //设置为就绪表表头
427 1
428 1 do
429 1 {
430 2 if((pcb->Priority)<=(TempPcb->Priority)) //如果要插入的任务优先级高于或者等于被查找到的任务,则将其
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -