⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os-task-sem.lst

📁 ucos-ii-at90S-icc-avr
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -