📄 os-task-sem.lst
字号:
02B7 E083 LDI R24,3
02B8 E092 LDI R25,2
02B9 2DE3 MOV R30,R3
02BA D34D RCALL 0x0608
02BB D35F RCALL 0x061B
(0340) #if OS_STRICT
(0341) if((0==OSTCBHighRdy)||(0==OSTCBCur)||
02BC 2022 TST R2
02BD F411 BNE 0x02C0
02BE 2033 TST R3
02BF F051 BEQ 0x02CA
02C0 D375 RCALL 0x0636
02C1 F411 BNE 0x02C4
02C2 2033 TST R3
02C3 F031 BEQ 0x02CA
02C4 D3AB RCALL 0x0670
02C5 F020 BCS 0x02CA
02C6 902001FF LDS R2,_OSPrioHighRdy
02C8 1582 CP R24,R2
02C9 F410 BCC 0x02CC
(0342) (OSPrioCur>OS_LOWEST_PRIO)||(OSPrioHighRdy>OS_LOWEST_PRIO))
(0343) OSError(0);
02CA 2700 CLR R16
02CB D1C5 RCALL _OSError
(0344) #endif
(0345) OSDebug();
02CC D006 RCALL _OSDebug
(0346) OSIntCtxSw(); /* Perform interrupt level context switch */
02CD DDF5 RCALL _OSIntCtxSw
(0347) }//end OSPrioHighRdy != OSPrioCur
(0348) }//end nesting==0
(0349) OS_EXIT_CRITICAL();
02CE 930A ST R16,-Y
02CF 910F POP R16
02D0 BF0F OUT P3F,R16
02D1 9109 LD R16,Y+
(0350) }
02D2 9508 RET
(0351)
(0352) void OSDebug(void)
(0353) {
(0354) INT8U port_a;
(0355) //debug
(0356) DDRA=0;port_a=PORTA;
_OSDebug:
port_a --> R16
02D3 2422 CLR R2
02D4 BA2A OUT P1A,R2
02D5 B30B IN R16,P1B
(0357) DDRA=0xff;PORTA=~port_a;
02D6 EF8F LDI R24,0xFF
02D7 BB8A OUT P1A,R24
02D8 2E20 MOV R2,R16
02D9 9420 COM R2
02DA BA2B OUT P1B,R2
(0358) //end debug
(0359) }
02DB 9508 RET
_OSEventInit:
i --> R20
pevent --> R16
02DC D2B0 RCALL push_gset1
(0360)
(0361) /*
(0362) *********************************************************************************************************
(0363) * MAKE TASK READY TO RUN BASED ON EVENT OCCURING
(0364) *
(0365) * Description: This function is called by other uC/OS-II services and is used to ready a task that was
(0366) * waiting for an event to occur.
(0367) *
(0368) * Arguments : pevent is a pointer to the event control block corresponding to the event.
(0369) *
(0370) * msg is a pointer to a message. This pointer is used by message oriented services
(0371) * such as MAILBOXEs and QUEUEs. The pointer is not used when called by other
(0372) * service functions.
(0373) *
(0374) * msk is a mask that is used to clear the status byte of the TCB. For example,
(0375) * OSSemPost() will pass OS_STAT_SEM, OSMboxPost() will pass OS_STAT_MBOX etc.
(0376) *
(0377) * Returns : none
(0378) *
(0379) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0380) *********************************************************************************************************
(0381) */
(0382) #if OS_EVENT_EN
(0383)
(0384) /*init event structure*/
(0385) void OSEventInit(OS_EVENT *pevent)
(0386) {
(0387) INT8U i;
(0388) if(0==pevent)
02DD 3000 CPI R16,0
02DE 0701 CPC R16,R17
02DF F409 BNE 0x02E1
(0389) return;
02E0 C013 RJMP 0x02F4
(0390) for(i=0;i<OS_TASK_COUNT;i++)
02E1 2744 CLR R20
02E2 C008 RJMP 0x02EB
(0391) pevent->OSTaskTbl[i]=0;
02E3 2FE4 MOV R30,R20
02E4 27FF CLR R31
02E5 0FEE LSL R30
02E6 1FFF ROL R31
02E7 0FE0 ADD R30,R16
02E8 1FF1 ADC R31,R17
02E9 D361 RCALL 0x064B
02EA 9543 INC R20
02EB 3043 CPI R20,3
02EC F3B0 BCS 0x02E3
(0392) pevent->OSEventCnt=0;
02ED 2422 CLR R2
02EE 2433 CLR R3
02EF 2FE0 MOV R30,R16
02F0 2FF1 MOV R31,R17
02F1 8226 STD R2,6+Z
02F2 8237 STD R3,7+Z
(0393) pevent->OSEventType=OS_EVENT_TYPE_INVALID; /* OS_EVENT_TYPE_MBOX, OS_EVENT_TYPE_Q or OS_EVENT_TYPE_SEM */
02F3 8620 STD R2,8+Z
(0394) }
02F4 D29B RCALL pop_gset1
02F5 9508 RET
_OSEventGetHighPrioRdy:
ptcb --> R20
i --> R22
pevent --> R16
02F6 D2AD RCALL push_gset2
(0395)
(0396) /*get highest prio from event's waiting task list,
(0397) ignore OSTCBStat and OSTCBDly.
(0398) Find first tcb in pevent->OSTaskTbl which is not null*/
(0399) INT8U OSEventGetHighPrioRdy(OS_EVENT *pevent)
(0400) {
(0401) INT8U i;
(0402) OS_TCB *ptcb;
(0403) if(0==pevent)
02F7 3000 CPI R16,0
02F8 0701 CPC R16,R17
02F9 F411 BNE 0x02FC
(0404) return OS_TASK_COUNT;//error
02FA E003 LDI R16,3
02FB C015 RJMP 0x0311
(0405) for(i=0;i<OS_TASK_COUNT;i++)
02FC 2766 CLR R22
02FD C010 RJMP 0x030E
(0406) {
(0407) ptcb=pevent->OSTaskTbl[i];
02FE 2FE6 MOV R30,R22
02FF 27FF CLR R31
0300 0FEE LSL R30
0301 1FFF ROL R31
0302 0FE0 ADD R30,R16
0303 1FF1 ADC R31,R17
0304 8140 LDD R20,0+Z
0305 8151 LDD R21,1+Z
(0408) if(ptcb)
0306 3040 CPI R20,0
0307 0745 CPC R20,R21
0308 F021 BEQ 0x030D
(0409) {
(0410) return ptcb->OSTCBPrio;
0309 2FE4 MOV R30,R20
030A 2FF5 MOV R31,R21
030B 8105 LDD R16,5+Z
030C C004 RJMP 0x0311
030D 9563 INC R22
030E 3063 CPI R22,3
030F F370 BCS 0x02FE
(0411) }
(0412) }
(0413) return OS_TASK_COUNT;//error
0310 E003 LDI R16,3
0311 D29B RCALL pop_gset2
0312 9508 RET
_OSEventTaskRdy:
prio --> R22
ptcb --> R22
msk --> R20
pevent --> R22
0313 D290 RCALL push_gset2
0314 2F42 MOV R20,R18
0315 2F60 MOV R22,R16
0316 2F71 MOV R23,R17
(0414) }
(0415)
(0416) /*when OSSemPend success,call OSEventTaskRdy to remove task from event waitting task list*/
(0417) void OSEventTaskRdy (OS_EVENT *pevent, INT8U msk)
(0418) {
(0419) OS_TCB *ptcb;
(0420) INT8U prio;
(0421)
(0422) prio=OSEventGetHighPrioRdy(pevent);
0317 2F06 MOV R16,R22
0318 2F17 MOV R17,R23
0319 DFDC RCALL _OSEventGetHighPrioRdy
031A 2F60 MOV R22,R16
(0423) #if OS_STRICT
(0424) if(prio>OS_LOWEST_PRIO)
031B E082 LDI R24,2
031C 1780 CP R24,R16
031D F410 BCC 0x0320
(0425) OSError(0);
031E 2700 CLR R16
031F D171 RCALL _OSError
(0426) #endif
(0427) ptcb = OSpTCBList[prio]; /* Point to this task's OS_TCB */
0320 E083 LDI R24,3
0321 E092 LDI R25,2
0322 2FE6 MOV R30,R22
0323 D2E4 RCALL 0x0608
0324 8160 LDD R22,0+Z
0325 8171 LDD R23,1+Z
(0428) #if OS_STRICT
(0429) if(0==ptcb)
0326 3060 CPI R22,0
0327 0767 CPC R22,R23
0328 F411 BNE 0x032B
(0430) OSError(0);
0329 2700 CLR R16
032A D166 RCALL _OSError
(0431) #endif
(0432) //clear event flags
(0433) ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
032B 2422 CLR R2
032C 2433 CLR R3
032D 2FE6 MOV R30,R22
032E 2FF7 MOV R31,R23
032F 8222 STD R2,2+Z
0330 8233 STD R3,3+Z
(0434) ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
0331 2F86 MOV R24,R22
0332 2F97 MOV R25,R23
0333 9604 ADIW R24,4
0334 2E44 MOV R4,R20
0335 9440 COM R4
0336 2FE8 MOV R30,R24
0337 2FF9 MOV R31,R25
0338 8050 LDD R5,0+Z
0339 2054 AND R5,R4
033A 8250 STD R5,0+Z
(0435) }
033B D271 RCALL pop_gset2
033C 9508 RET
_OSEventTaskWait:
pevent --> R20
033D D24F RCALL push_gset1
033E 2F40 MOV R20,R16
033F 2F51 MOV R21,R17
0340 D2F5 RCALL 0x0636
(0436)
(0437)
(0438) /*
(0439) *********************************************************************************************************
(0440) * MAKE TASK WAIT FOR EVENT TO OCCUR
(0441) *
(0442) * Description: This function is called by other uC/OS-II services to suspend a task because an event has
(0443) * not occurred.
(0444) *
(0445) * Arguments : pevent is a pointer to the event control block for which the task will be waiting for.
(0446) *
(0447) * Returns : none
(0448) *
(0449) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0450) *********************************************************************************************************
(0451) */
(0452) void OSEventTaskWait (OS_EVENT *pevent)
(0453) {
(0454) #if OS_STRICT
(0455) if(!OSTCBCur)
0341 F421 BNE 0x0346
0342 2033 TST R3
0343 F411 BNE 0x0346
(0456) OSError(0);
0344 2700 CLR R16
0345 D14B RCALL _OSError
(0457) #endif
(0458) }
0346 D249 RCALL pop_gset1
0347 9508 RET
(0459) /*
(0460) *********************************************************************************************************
(0461) * MAKE TASK READY TO RUN BASED ON EVENT TIMEOUT
(0462) *
(0463) * Description: This function is called by other uC/OS-II services to make a task ready to run because a
(0464) * timeout occurred.
(0465) *
(0466) * Arguments : pevent is a pointer to the event control block which is readying a task.
(0467) *
(0468) * Returns : none
(0469) *
(0470) * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
(0471) *********************************************************************************************************
(0472) */
(0473) void OSEventTO (OS_EVENT *pevent)
(0474) {
(0475) OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set status to ready */
_OSEventTO:
pevent --> R16
0348 E081 LDI R24,1
0349 D2C4 RCALL 0x060E
034A 8384 STD R24,4+Z
(0476) }
034B 9508 RET
_OSSemAccept:
cnt --> R20
pevent --> R16
034C D240 RCALL push_gset1
(0477) #endif//OS_EVENT_EN
(0478)
(0479) #if OS_SEM_EN
(0480) /*
(0481) *********************************************************************************************************
(0482) * ACCEPT SEMAPHORE
(0483) *
(0484) * Description: This function checks the semaphore to see if a resource is available or, if an event
(0485) * occurred. Unlike OSSemPend(), OSSemAccept() does not suspend the calling task if the
(0486) * resource is not available or the event did not occur.
(0487) *
(0488) * Arguments : pevent is a pointer to the event control block
(0489) *
(0490) * Returns : > 0 if the resource is available or the event did not occur the semaphore is
(0491) * decremented to obtain the resource.
(0492) * == 0 if the resource is not available or the event did not occur or,
(0493) * you didn't pass a pointer to a semaphore
(0494) *********************************************************************************************************
(0495) */
(0496) INT16U OSSemAccept (OS_EVENT *pevent)
(0497) {
(0498) INT16U cnt;
(0499)
(0500) OS_ENTER_CRITICAL();
034D 930A ST R16,-Y
034E B70F IN R16,P3F
034F 94F8 BCLR 7
0350 930F PUSH R16
0351 9109 LD R16,Y+
(0501) if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
0352 2FE0 MOV R30,R16
0353 2FF1 MOV R31,R17
0354 8580 LDD R24,8+Z
0355 3081 CPI R24,1
0356 F039 BEQ 0x035E
(0502) OS_EXIT_CRITICAL();
0357 930A ST R16,-Y
0358 910F POP R16
0359 BF0F OUT P3F,R16
035A 9109 LD R16,Y+
(0503) return (0);
035B 2700 CLR R16
035C 2711 CLR R17
035D C014 RJMP 0x0372
(0504) }
(0505) cnt = pev
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -