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

📄 ucos.lst

📁 这是一个UCOS程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0380 8222      STD	Z+2,R2
(0682)     bitx                   = OSMapTbl[x];
    0381 9230037A  STS	OSTCBList+1,R3
    0383 92200379  STS	OSTCBList,R2
    0385 E880      LDI	R24,0x80
    0386 E092      LDI	R25,2
    0387 9390037E  STS	OSTCBFreeList+1,R25
(0683)     prio                   = (INT8U)((y << 3) + x);     /* Find priority of task getting the msg       */
    0389 9380037D  STS	OSTCBFreeList,R24
    038B 940E09C2  CALL	pop_gset3
    038D 9508      RET
_OS_MemClr:
  size                 --> R18
  pdest                --> R16
    038E C006      RJMP	0x0395
    038F 2422      CLR	R2
    0390 01F8      MOVW	R30,R16
    0391 9221      ST	R2,Z+
    0392 018F      MOVW	R16,R30
    0393 5021      SUBI	R18,1
(0684)     pevent->OSEventTbl[y] &= ~bitx;                     /* Remove this task from the waiting list      */
    0394 4030      SBCI	R19,0
    0395 3020      CPI	R18,0
    0396 0723      CPC	R18,R19
    0397 F7B9      BNE	0x038F
    0398 9508      RET
_OS_MemCopy:
  size                 --> R20
  psrc                 --> R18
  pdest                --> R16
    0399 940E09D3  CALL	push_gset1
    039B 814A      LDD	R20,Y+2
    039C 815B      LDD	R21,Y+3
    039D C008      RJMP	0x03A6
    039E 01F9      MOVW	R30,R18
    039F 01D8      MOVW	R26,R16
(0685)     if (pevent->OSEventTbl[y] == 0x00) {                
    03A0 9001      LD	R0,Z+
    03A1 019F      MOVW	R18,R30
    03A2 920D      ST	R0,X+
    03A3 018D      MOVW	R16,R26
    03A4 5041      SUBI	R20,1
    03A5 4050      SBCI	R21,0
    03A6 3040      CPI	R20,0
    03A7 0745      CPC	R20,R21
    03A8 F7A9      BNE	0x039E
(0686)         pevent->OSEventGrp &= ~bity;                    /* Clr group bit if this was only task pending */
    03A9 940E09D6  CALL	pop_gset1
    03AB 9508      RET
_OS_Sched:
  y                    --> R12
  cpu_sr               --> R10
    03AC 940E09CD  CALL	push_gset4
    03AE 24AA      CLR	R10
    03AF 940E06D4  CALL	_OS_CPU_SR_Save
(0687)     }
(0688)     ptcb                 =  OSTCBPrioTbl[prio];         /* Point to this task's OS_TCB                 */
    03B1 2EA0      MOV	R10,R16
    03B2 9020040D  LDS	R2,OSIntNesting
    03B4 2022      TST	R2
    03B5 F009      BEQ	0x03B7
    03B6 C067      RJMP	0x041E
    03B7 9020040C  LDS	R2,OSLockNesting
    03B9 2022      TST	R2
(0689)     ptcb->OSTCBDly       =  0;                          /* Prevent OSTimeTick() from readying task     */
    03BA F009      BEQ	0x03BC
    03BB C062      RJMP	0x041E
    03BC E98C      LDI	R24,0x9C
    03BD E090      LDI	R25,0
    03BE 91E00409  LDS	R30,OSRdyGrp
(0690)     ptcb->OSTCBEventPtr  = (OS_EVENT *)0;               /* Unlink ECB from this task                   */
    03C0 27FF      CLR	R31
    03C1 0FE8      ADD	R30,R24
(0691) #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
(0692)     ptcb->OSTCBMsg       = msg;                         /* Send message directly to waiting task       */
(0693) #else
(0694)     msg                  = msg;                         /* Prevent compiler warning if not used        */
(0695) #endif
(0696)     ptcb->OSTCBPendTO    = FALSE;                       /* Cancel 'any' timeout because of post        */
    03C2 1FF9      ADC	R31,R25
    03C3 90C4      LPM	R12,0(Z)
(0697)     ptcb->OSTCBStat     &= ~msk;                        /* Clear bit associated with event type        */
    03C4 E087      LDI	R24,7
    03C5 E094      LDI	R25,4
    03C6 2DEC      MOV	R30,R12
    03C7 27FF      CLR	R31
    03C8 0FE8      ADD	R30,R24
    03C9 1FF9      ADC	R31,R25
    03CA 81E0      LDD	R30,Z+0
    03CB 27FF      CLR	R31
(0698)     if (ptcb->OSTCBStat == OS_STAT_RDY) {               /* See if task is ready (could be susp'd)      */
    03CC E98C      LDI	R24,0x9C
    03CD E090      LDI	R25,0
    03CE 0FE8      ADD	R30,R24
    03CF 1FF9      ADC	R31,R25
(0699)         OSRdyGrp        |=  bity;                       /* Put task in the ready to run list           */
    03D0 9024      LPM	R2,0(Z)
    03D1 2433      CLR	R3
    03D2 2C4C      MOV	R4,R12
    03D3 2455      CLR	R5
    03D4 0C44      LSL	R4
(0700)         OSRdyTbl[y]     |=  bitx;
    03D5 1C55      ROL	R5
    03D6 0C44      LSL	R4
    03D7 1C55      ROL	R5
    03D8 0C44      LSL	R4
    03D9 1C55      ROL	R5
    03DA 0C42      ADD	R4,R2
    03DB 1C53      ADC	R5,R3
    03DC 9240040A  STS	OSPrioHighRdy,R4
    03DE 9020040B  LDS	R2,OSPrioCur
(0701)     }
(0702)     return (prio);
    03E0 1442      CP	R4,R2
    03E1 F409      BNE	0x03E3
    03E2 C03B      RJMP	0x041E
_OS_EventTaskWait:
  y                    --> R20
  pevent               --> R16
    03E3 2C24      MOV	R2,R4
    03E4 E082      LDI	R24,2
(0703) }
(0704) #endif
(0705) /*$PAGE*/
(0706) /*
(0707) *********************************************************************************************************
(0708) *                                   MAKE TASK WAIT FOR EVENT TO OCCUR
(0709) *
(0710) * Description: This function is called by other uC/OS-II services to suspend a task because an event has
(0711) *              not occurred.
(0712) *
(0713) * Arguments  : pevent   is a pointer to the event control block for which the task will be waiting for.
(0714) *
(0715) * Returns    : none
(0716) *
(0717) * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
(0718) *********************************************************************************************************
(0719) */
(0720) #if OS_EVENT_EN
(0721) void  OS_EventTaskWait (OS_EVENT *pevent)
(0722) {
(0723)     INT8U  y;
(0724) 
(0725) 
(0726)     OSTCBCur->OSTCBEventPtr = pevent;             /* Store pointer to event control block in TCB       */
    03E5 9D82      MUL	R24,R2
    03E6 01F0      MOVW	R30,R0
    03E7 E687      LDI	R24,0x67
    03E8 E093      LDI	R25,3
    03E9 0FE8      ADD	R30,R24
    03EA 1FF9      ADC	R31,R25
(0727)     y                       = OSTCBCur->OSTCBY;   /* Task no longer ready                              */
    03EB 8020      LDD	R2,Z+0
(0728)     OSRdyTbl[y]            &= ~OSTCBCur->OSTCBBitX;
    03EC 8031      LDD	R3,Z+1
    03ED 9230037C  STS	OSTCBHighRdy+1,R3
    03EF 9220037B  STS	OSTCBHighRdy,R2
    03F1 01C1      MOVW	R24,R2
    03F2 960F      ADIW	R24,0xF
    03F3 E041      LDI	R20,1
    03F4 E050      LDI	R21,0
    03F5 E060      LDI	R22,0
    03F6 E070      LDI	R23,0
    03F7 01FC      MOVW	R30,R24
    03F8 8040      LDD	R4,Z+0
    03F9 8051      LDD	R5,Z+1
    03FA 8062      LDD	R6,Z+2
    03FB 8073      LDD	R7,Z+3
(0729)     if (OSRdyTbl[y] == 0x00) {                   
    03FC 0E44      ADD	R4,R20
    03FD 1E55      ADC	R5,R21
    03FE 1E66      ADC	R6,R22
    03FF 1E77      ADC	R7,R23
    0400 8240      STD	Z+0,R4
    0401 8251      STD	Z+1,R5
    0402 8262      STD	Z+2,R6
(0730)         OSRdyGrp &= ~OSTCBCur->OSTCBBitY;         /* Clear event grp bit if this was only task pending */
    0403 8273      STD	Z+3,R7
    0404 E041      LDI	R20,1
    0405 E050      LDI	R21,0
    0406 E060      LDI	R22,0
    0407 E070      LDI	R23,0
    0408 90400410  LDS	R4,OSCtxSwCtr+2
    040A 90500411  LDS	R5,OSCtxSwCtr+3
    040C 9020040E  LDS	R2,OSCtxSwCtr
(0731)     }
(0732)     pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;          /* Put task in waiting list  */
    040E 9030040F  LDS	R3,OSCtxSwCtr+1
    0410 0E24      ADD	R2,R20
    0411 1E35      ADC	R3,R21
    0412 1E46      ADC	R4,R22
    0413 1E57      ADC	R5,R23
    0414 9230040F  STS	OSCtxSwCtr+1,R3
    0416 9220040E  STS	OSCtxSwCtr,R2
    0418 92500411  STS	OSCtxSwCtr+3,R5
    041A 92400410  STS	OSCtxSwCtr+2,R4
    041C 940E070D  CALL	_OSCtxSw
    041E 2D0A      MOV	R16,R10
    041F 940E06D7  CALL	_OS_CPU_SR_Restore
(0733)     pevent->OSEventGrp                   |= OSTCBCur->OSTCBBitY;
    0421 940E09C5  CALL	pop_gset4
    0423 9508      RET
_OS_TaskIdle:
  cpu_sr               --> R10
  parg                 --> R12
    0424 940E09CD  CALL	push_gset4
    0426 0168      MOVW	R12,R16
    0427 24AA      CLR	R10
    0428 940E06D4  CALL	_OS_CPU_SR_Save
    042A 2EA0      MOV	R10,R16
    042B E041      LDI	R20,1
    042C E050      LDI	R21,0
    042D E060      LDI	R22,0
    042E E070      LDI	R23,0
_OS_EventTO:
  y                    --> R20
  pevent               --> R16
    042F 90400403  LDS	R4,OSIdleCtr+2
(0734) }
(0735) #endif
(0736) /*$PAGE*/
(0737) /*
(0738) *********************************************************************************************************
(0739) *                              MAKE TASK READY TO RUN BASED ON EVENT TIMEOUT
(0740) *
(0741) * Description: This function is called by other uC/OS-II services to make a task ready to run because a
(0742) *              timeout occurred.
(0743) *
(0744) * Arguments  : pevent   is a pointer to the event control block which is readying a task.
(0745) *
(0746) * Returns    : none
(0747) *
(0748) * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
(0749) *********************************************************************************************************
(0750) */
(0751) #if OS_EVENT_EN
(0752) void  OS_EventTO (OS_EVENT *pevent)
(0753) {
(0754)     INT8U  y;
(0755) 
(0756) 
(0757)     y                      = OSTCBCur->OSTCBY;
    0431 90500404  LDS	R5,OSIdleCtr+3
    0433 90200401  LDS	R2,OSIdleCtr
    0435 90300402  LDS	R3,OSIdleCtr+1
(0758)     pevent->OSEventTbl[y] &= ~OSTCBCur->OSTCBBitX;     /* Remove task from wait list                   */
    0437 0E24      ADD	R2,R20
    0438 1E35      ADC	R3,R21
    0439 1E46      ADC	R4,R22
    043A 1E57      ADC	R5,R23
    043B 92300402  STS	OSIdleCtr+1,R3
    043D 92200401  STS	OSIdleCtr,R2
    043F 92500404  STS	OSIdleCtr+3,R5
    0441 92400403  STS	OSIdleCtr+2,R4
    0443 940E06D7  CALL	_OS_CPU_SR_Restore
    0445 940E080A  CALL	_OSTaskIdleHook
(0759)     if (pevent->OSEventTbl[y] == 0x00) {
    0447 CFE0      RJMP	0x0428
    0448 940E09C5  CALL	pop_gset4
    044A 9508      RET
_OS_TCBInit:
  cpu_sr               --> R10
  ptcb                 --> R12
  opt                  --> Y+22
  pext                 --> Y+20
  stk_size             --> Y+16
  id                   --> Y+14
  pbos                 --> Y+12
  ptos                 --> Y+10
  prio                 --> R14
    044B 933A      ST	R19,-Y
    044C 932A      ST	R18,-Y
    044D 940E09CB  CALL	push_gset5
(0760)         pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
    044F 2EE0      MOV	R14,R16
    0450 24AA      CLR	R10
    0451 940E06D4  CALL	_OS_CPU_SR_Save
    0453 2EA0      MOV	R10,R16
    0454 90C0037D  LDS	R12,OSTCBFreeList
    0456 90D0037E  LDS	R13,OSTCBFreeList+1
    0458 20CC      TST	R12
    0459 F419      BNE	0x045D
    045A 20DD      TST	R13
(0761)     }
(0762)     OSTCBCur->OSTCBPendTO   = FALSE;                   /* Clear the Pend Timeout flag                  */
    045B F409      BNE	0x045D
    045C C0C0      RJMP	0x051D
    045D 01F6      MOVW	R30,R12
    045E 8022      LDD	R2,Z+2
    045F 8033      LDD	R3,Z+3
    0460 9230037E  STS	OSTCBFreeList+1,R3
(0763)     OSTCBCur->OSTCBStat     = OS_STAT_RDY;             /* Set status to ready                          */
    0462 9220037D  STS	OSTCBFreeList,R2
    0464 2D0A      MOV	R16,R10
    0465 940E06D7  CALL	_OS_CPU_SR_Restore
(0764)     OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;           /* No longer waiting for event                  */
    0467 01F6      MOVW	R30,R12
    0468 840A      LDD	R0,Y+10
    0469 841B      LDD	R1,Y+11
    046A 8211      STD	Z+1,R1
    046B 8200      STD	Z+0,R0
    046C 86E2      STD	Z+10,R14
    046D 2422      CLR	R2
    046E 01F6      MOVW	R30,R12
    046F 8620      STD	Z+8,R2
_OS_EventWaitListInit:
  ptbl                 --> R20
  pevent               --> R16
    0470 01F6      MOVW	R30,R12
    0471 8621      STD	Z+9,R2
(0765) }
(0766) #endif
(0767) /*$PAGE*/
(0768) /*
(0769) ****************************************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -