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