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