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