os_cpu_a.lst
来自「一个分选系统的软件:用SmallRtos操作系统」· LST 代码 · 共 797 行 · 第 1/3 页
LST
797 行
+1 239
+1 240
+1 241
+1 242
+1 243
A51 MACRO ASSEMBLER OS_CPU_A 06/20/2005 15:36:07 PAGE 5
+1 244
+1 245
+1 246
+1 247
+1 248
+1 249
+1 250
+1 251
+1 252
+1 253
+1 254
+1 255
+1 256
+1 257
+1 258
+1 259
+1 260
+1 261
+1 262
+1
+1
+1 265
+1
+1
+1
+1
+1
+1 271
+1 272
+1 273
274
275
276 NAME OS_CPU_A_ASM
277
278 ?PR?OSCtxSw?OS_CPU_A SEGMENT CODE ;INBLOCK
279 ?PR?OSIntCtxSw?OS_CPU_A SEGMENT CODE ;INBLOCK
280 ?PR?LoadCtx?OS_CPU_A SEGMENT CODE ;INBLOCK
281 ?PR?C_OSCtxSw?OS_CPU_C SEGMENT CODE
282
283
284 EXTRN CODE (OSMapTbl)
285 EXTRN DATA (OSFastSwap)
286 EXTRN DATA (OSTaskID)
287 EXTRN DATA (OSNextTaskID)
288 EXTRN DATA (OSTsakStackBotton)
289 EXTRN DATA (Os_Enter_Sum)
290 IF 0 <> 0
EXTRN IDATA (Sp2)
ENDIF
293
294
295 PUBLIC LoadCtx
296 PUBLIC OSIntCtxSw
297 PUBLIC OSCtxSw
298 PUBLIC STACK
299
300 ;****************************************************************************************
301 ;?STACK SEGMENT IDATA
302
303 ?STACK SEGMENT IDATA
304
---- 305 RSEG ?STACK
0000 306 STACK: ;堆栈
0000 307 DS 1
308
309 ;****************************************************************************************
A51 MACRO ASSEMBLER OS_CPU_A 06/20/2005 15:36:07 PAGE 6
310 ;/*****************************************************************************************
****************
311 ;** 函数名称: LoadCtx
312 ;** 功能描述: 任务环境恢复函数
313 ;** 输 入: OSTaskID,OSFastSwap
314 ;** 输 出 : 无
315 ;** 全局变量: 无
316 ;** 调用模块: 无
317 ;**
318 ;** 作 者: 陈明计
319 ;** 日 期: 2002年2月22日
320 ;**----------------------------------------------------------------------------------------
---------------
321 ;** 修 改: 陈明计
322 ;** 日 期: 2002年12月2日
323 ;**----------------------------------------------------------------------------------------
---------------
324 ;** 修 改: 陈明计
325 ;** 日 期: 2003年2月5日
326 ;**----------------------------------------------------------------------------------------
---------------
327 ;** 修 改:
328 ;** 日 期:
329 ;**----------------------------------------------------------------------------------------
---------------
330 ;******************************************************************************************
**************/
331
---- 332 RSEG ?PR?LoadCtx?OS_CPU_A
0000 333 LoadCtx:
334 USING 0
335
0000 D000 F 336 POP Os_Enter_Sum ;恢复关中断计数器
337 ;判断是否需要恢复所有寄存器
0002 E500 F 338 MOV A,OSTaskID
0004 B40802 339 CJNE A,#8,LoadCtx_0
0007 8022 340 SJMP LoadCtx_2
0009 341 LoadCtx_0:
0009 900000 F 342 MOV DPTR,#OSMapTbl
343
000C 93 344 MOVC A,@A+DPTR
000D 5500 F 345 ANL A,OSFastSwap
000F 701A 357 JNZ LoadCtx_2
358 ;恢复寄存器
0011 D007 359 POP 7
0013 D006 360 POP 6
0015 D005 361 POP 5
0017 D004 362 POP 4
0019 D003 363 POP 3
001B D002 364 POP 2
001D D001 365 POP 1
001F D000 366 POP 0
0021 D0D0 367 POP PSW
0023 D082 368 POP DPL
0025 D083 369 POP DPH
A51 MACRO ASSEMBLER OS_CPU_A 06/20/2005 15:36:07 PAGE 7
0027 D0F0 370 POP B
0029 D0E0 371 POP ACC
002B 372 LoadCtx_2:
373 ;判断是否需要开中断
002B 0500 F 374 INC Os_Enter_Sum
002D D50002 F 375 djnz Os_Enter_Sum,LoadCtx_3
376 SET_EA ;开中断
0032 378 LoadCtx_3:
0032 22 379 RET
380
381 ;****************************************************************************************
382 ;/*****************************************************************************************
****************
383 ;** 函数名称: OSCtxSw
384 ;** 功能描述: 任务主动放弃CPU环境保存函数
385 ;** 输 入: OSTaskID
386 ;** 输 出 : 无
387 ;** 全局变量: OSFastSwap
388 ;** 调用模块: 无
389 ;**
390 ;** 作 者: 陈明计
391 ;** 日 期: 2002年2月22日
392 ;**----------------------------------------------------------------------------------------
---------------
393 ;** 修 改:
394 ;** 日 期:
395 ;**----------------------------------------------------------------------------------------
---------------
396 ;******************************************************************************************
**************/
---- 397 RSEG ?PR?OSCtxSw?OS_CPU_A
0000 398 OSCtxSw:
399 USING 0
400 ;设置标志:任务再次恢复运行时不必恢复所有寄存器
0000 900000 F 401 MOV DPTR,#OSMapTbl
0003 E500 F 402 MOV A,OSTaskID
403
0005 93 404 MOVC A,@A+DPTR
0006 4500 F 405 ORL A,OSFastSwap
0008 F500 F 406 MOV OSFastSwap,A
000A 020000 F 421 LJMP C_OSCtxSw
422 ;****************************************************************************************
423 ;/*****************************************************************************************
****************
424 ;** 函数名称: C_OSCtxSw
425 ;** 功能描述: 堆栈处理函数
426 ;** 输 入: 无
427 ;** 输 出 : 无
428 ;** 全局变量: OSTaskID,OSTsakStackBotton,SP
429 ;** 调用模块: LoadCtx
430 ;**
431 ;** 作 者: 陈明计
A51 MACRO ASSEMBLER OS_CPU_A 06/20/2005 15:36:07 PAGE 8
432 ;** 日 期: 2002年2月22日
433 ;**----------------------------------------------------------------------------------------
---------------
434 ;** 修 改: 陈明计
435 ;** 日 期: 2002年12月2日
436 ;**----------------------------------------------------------------------------------------
---------------
437 ;** 修 改:
438 ;** 日 期:
439 ;**----------------------------------------------------------------------------------------
---------------
440 ;******************************************************************************************
**************/
---- 441 RSEG ?PR?C_OSCtxSw?OS_CPU_C
0000 442 C_OSCtxSw:
0000 C000 F 443 PUSH Os_Enter_Sum ;保存关中断计数器
0002 AA81 444 mov r2,sp
445
446 ; cp1 = (unsigned char idata *)SP +1;
0004 A881 447 MOV R0,SP
448
449 IF 0 <> 0
mov sp,#(Sp2-1) ;堆栈指向临时空间,允许“软非屏蔽中断”
ENDIF
452
0006 08 453 INC R0
454 ; temp = (unsigned char )OSTsakStackBotton[OSNextTaskID+1];
0007 7400 F 455 MOV A,#LOW (OSTsakStackBotton+01H)
0009 2500 F 456 ADD A,OSNextTaskID
000B F9 457 MOV R1,A
000C E7 458 MOV A,@R1
000D FF 459 MOV R7,A
460 ; cp2 = OSTsakStackBotton[OSTaskID+1];
000E 7400 F 461 MOV A,#LOW (OSTsakStackBotton+01H)
0010 2500 F 462 ADD A,OSTaskID
0012 F9 463 MOV R1,A
0013 E7 464 MOV A,@R1
0014 F9 465 MOV R1,A
466 ; if( OSNextTaskID > OSTaskID)
0015 E500 F 467 MOV A,OSNextTaskID
0017 D3 468 SETB C
0018 9500 F 469 SUBB A,OSTaskID
001A 4033 470 JC ?C0001
471 ; {
472 ; while(cp2 != (unsigned char idata *)temp)
473 ; {
474 ; *cp1++ = *cp2++;
475 ; }
001C EF 476 MOV A,R7
001D C3 477 CLR C
001E 99 478 SUBB A,R1
001F FE 479 MOV R6,A
0020 480 ?C0002:
0020 E7 481 MOV A,@R1
0021 F6 482 MOV @R0,A
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?