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