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

📄 ucosii.lst

📁 1.将uC/OS-II操作系统移植到Mega16上 2.建立两个任务
💻 LST
📖 第 1 页 / 共 5 页
字号:
_OSTaskIdle:
  pdata                --> R16
    02C8 930A      ST	R16,-Y
    02C9 B70F      IN	R16,P3F
    02CA 94F8      BCLR	7
    02CB 930F      PUSH	R16
    02CC 9109      LD	R16,Y+
(0248)         OSIdleCtr++;
    02CD E081      LDI	R24,1
    02CE E090      LDI	R25,0
    02CF E0A0      LDI	R26,0
    02D0 E0B0      LDI	R27,0
    02D1 90400150  LDS	R4,_OSIdleCtr+2
    02D3 90500151  LDS	R5,_OSIdleCtr+3
    02D5 9020014E  LDS	R2,_OSIdleCtr
    02D7 9030014F  LDS	R3,_OSIdleCtr+1
    02D9 0E28      ADD	R2,R24
    02DA 1E39      ADC	R3,R25
    02DB 1E4A      ADC	R4,R26
    02DC 1E5B      ADC	R5,R27
    02DD 9230014F  STS	R3,_OSIdleCtr+1
    02DF 9220014E  STS	R2,_OSIdleCtr
    02E1 92500151  STS	R5,_OSIdleCtr+3
    02E3 92400150  STS	R4,_OSIdleCtr+2
(0249)         OS_EXIT_CRITICAL();
    02E5 930A      ST	R16,-Y
    02E6 910F      POP	R16
    02E7 BF0F      OUT	P3F,R16
    02E8 9109      LD	R16,Y+
    02E9 CFDE      RJMP	_OSTaskIdle
    02EA 9508      RET
_OSTCBInit:
  ptcb                 --> R20
  opt                  --> Y+10
  pext                 --> Y+8
  stk_size             --> Y+6
  id                   --> Y+4
  pbos                 --> Y+2
  ptos                 --> R18
  prio                 --> R16
    02EB 940E0878  CALL	push_gset1
(0250)     }
(0251) }
(0252) /*$PAGE*/
(0253) /*
(0254) *********************************************************************************************************
(0255) *                                            INITIALIZE TCB
(0256) *
(0257) * Description: This function is internal to uC/OS-II and is used to initialize a Task Control Block when
(0258) *              a task is created (see OSTaskCreate() and OSTaskCreateExt()).
(0259) *
(0260) * Arguments  : prio          is the priority of the task being created
(0261) *
(0262) *              ptos          is a pointer to the task's top-of-stack assuming that the CPU registers
(0263) *                            have been placed on the stack.  Note that the top-of-stack corresponds to a 
(0264) *                            'high' memory location is OS_STK_GROWTH is set to 1 and a 'low' memory
(0265) *                            location if OS_STK_GROWTH is set to 0.  Note that stack growth is CPU
(0266) *                            specific.
(0267) *
(0268) *              pbos          is a pointer to the bottom of stack.  A NULL pointer is passed if called by
(0269) *                            'OSTaskCreate()'.
(0270) *
(0271) *              id            is the task's ID (0..65535)
(0272) *
(0273) *              stk_size      is the size of the stack (in 'stack units').  If the stack units are INT8Us
(0274) *                            then, 'stk_size' contains the number of bytes for the stack.  If the stack
(0275) *                            units are INT32Us then, the stack contains '4 * stk_size' bytes.  The stack
(0276) *                            units are established by the #define constant OS_STK which is CPU
(0277) *                            specific.  'stk_size' is 0 if called by 'OSTaskCreate()'.
(0278) *
(0279) *              pext          is a pointer to a user supplied memory area that is used to extend the task
(0280) *                            control block.  This allows you to store the contents of floating-point
(0281) *                            registers, MMU registers or anything else you could find useful during a 
(0282) *                            context switch.  You can even assign a name to each task and store this name
(0283) *                            in this TCB extension.  A NULL pointer is passed if called by OSTaskCreate().
(0284) *
(0285) *              opt           options as passed to 'OSTaskCreateExt()' or, 
(0286) *                            0 if called from 'OSTaskCreate()'.
(0287) *
(0288) * Returns    : OS_NO_ERR         if the call was successful
(0289) *              OS_NO_MORE_TCB    if there are no more free TCBs to be allocated and thus, the task cannot
(0290) *                                be created.
(0291) *
(0292) * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
(0293) *********************************************************************************************************
(0294) */
(0295) 
(0296) INT8U OSTCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt)
(0297) {
(0298)     OS_TCB *ptcb;
(0299) 
(0300) 
(0301)     OS_ENTER_CRITICAL();
    02ED 930A      ST	R16,-Y
    02EE B70F      IN	R16,P3F
    02EF 94F8      BCLR	7
    02F0 930F      PUSH	R16
    02F1 9109      LD	R16,Y+
(0302)     ptcb = OSTCBFreeList;                                  /* Get a free TCB from the free TCB list    */
    02F2 91400141  LDS	R20,_OSTCBFreeList
    02F4 91500142  LDS	R21,_OSTCBFreeList+1
(0303)     if (ptcb != (OS_TCB *)0) {
    02F6 3040      CPI	R20,0
    02F7 0745      CPC	R20,R21
    02F8 F409      BNE	0x02FA
    02F9 C073      RJMP	0x036D
(0304)         OSTCBFreeList        = ptcb->OSTCBNext;            /* Update pointer to free TCB list          */
    02FA 01FA      MOVW	R30,R20
    02FB 8022      LDD	R2,2+Z
    02FC 8033      LDD	R3,3+Z
    02FD 92300142  STS	R3,_OSTCBFreeList+1
    02FF 92200141  STS	R2,_OSTCBFreeList
(0305)         OS_EXIT_CRITICAL();
    0301 930A      ST	R16,-Y
    0302 910F      POP	R16
    0303 BF0F      OUT	P3F,R16
    0304 9109      LD	R16,Y+
(0306)         ptcb->OSTCBStkPtr    = ptos;                       /* Load Stack pointer in TCB                */
    0305 8320      STD	R18,0+Z
    0306 8331      STD	R19,1+Z
(0307)         ptcb->OSTCBPrio      = (INT8U)prio;                /* Load task priority into TCB              */
    0307 8701      STD	R16,9+Z
(0308)         ptcb->OSTCBStat      = OS_STAT_RDY;                /* Task is ready to run                     */
    0308 2422      CLR	R2
    0309 8620      STD	R2,8+Z
(0309)         ptcb->OSTCBDly       = 0;                          /* Task is not delayed                      */
    030A 2433      CLR	R3
    030B 8226      STD	R2,6+Z
    030C 8237      STD	R3,7+Z
(0310) 
(0311)         pext                 = pext;                       /* Prevent compiler warning if not used     */
(0312)         stk_size             = stk_size;
(0313)         pbos                 = pbos;
(0314)         opt                  = opt;
(0315)         id                   = id;
(0316) 
(0317)         ptcb->OSTCBY         = prio >> 3;                  /* Pre-compute X, Y, BitX and BitY          */
    030D 2E20      MOV	R2,R16
    030E 9426      LSR	R2
    030F 9426      LSR	R2
    0310 9426      LSR	R2
    0311 8623      STD	R2,11+Z
(0318)         ptcb->OSTCBBitY      = OSMapTbl[ptcb->OSTCBY];
    0312 E686      LDI	R24,0x66
    0313 E090      LDI	R25,0
    0314 85E3      LDD	R30,11+Z
    0315 27FF      CLR	R31
    0316 0FE8      ADD	R30,R24
    0317 1FF9      ADC	R31,R25
    0318 91E4      LD	R30,R30
    0319 01DA      MOVW	R26,R20
    031A 961D      ADIW	R26,0xD
    031B 93EC      ST	R30,0(X)
(0319)         ptcb->OSTCBX         = prio & 0x07;
    031C 2F80      MOV	R24,R16
    031D 7087      ANDI	R24,7
    031E 01FA      MOVW	R30,R20
    031F 8782      STD	R24,10+Z
(0320)         ptcb->OSTCBBitX      = OSMapTbl[ptcb->OSTCBX];
    0320 E686      LDI	R24,0x66
    0321 E090      LDI	R25,0
    0322 85E2      LDD	R30,10+Z
    0323 27FF      CLR	R31
    0324 0FE8      ADD	R30,R24
    0325 1FF9      ADC	R31,R25
    0326 91E4      LD	R30,R30
    0327 01DA      MOVW	R26,R20
    0328 961C      ADIW	R26,0xC
    0329 93EC      ST	R30,0(X)
(0321) 
(0322)         OS_ENTER_CRITICAL();
    032A 930A      ST	R16,-Y
    032B B70F      IN	R16,P3F
    032C 94F8      BCLR	7
    032D 930F      PUSH	R16
    032E 9109      LD	R16,Y+
(0323)         OSTCBPrioTbl[prio]   = ptcb;
    032F E082      LDI	R24,2
    0330 9F80      MUL	R24,R16
    0331 01F0      MOVW	R30,R0
    0332 E18D      LDI	R24,0x1D
    0333 E091      LDI	R25,1
    0334 0FE8      ADD	R30,R24
    0335 1FF9      ADC	R31,R25
    0336 8340      STD	R20,0+Z
    0337 8351      STD	R21,1+Z
(0324)         ptcb->OSTCBNext      = OSTCBList;                  /* Link into TCB chain                      */
    0338 9020013D  LDS	R2,_OSTCBList
    033A 9030013E  LDS	R3,_OSTCBList+1
    033C 01FA      MOVW	R30,R20
    033D 8222      STD	R2,2+Z
    033E 8233      STD	R3,3+Z
(0325)         ptcb->OSTCBPrev      = (OS_TCB *)0;
    033F 2422      CLR	R2
    0340 2433      CLR	R3
    0341 8224      STD	R2,4+Z
    0342 8235      STD	R3,5+Z
(0326)         if (OSTCBList != (OS_TCB *)0) {
    0343 9020013D  LDS	R2,_OSTCBList
    0345 9030013E  LDS	R3,_OSTCBList+1
    0347 2022      TST	R2
    0348 F411      BNE	0x034B
    0349 2033      TST	R3
    034A F031      BEQ	0x0351
(0327)             OSTCBList->OSTCBPrev = ptcb;
    034B 91E0013D  LDS	R30,_OSTCBList
    034D 91F0013E  LDS	R31,_OSTCBList+1
    034F 8344      STD	R20,4+Z
    0350 8355      STD	R21,5+Z
(0328)         }
(0329)         OSTCBList               = ptcb;
    0351 9350013E  STS	R21,_OSTCBList+1
    0353 9340013D  STS	R20,_OSTCBList
(0330)         OSRdyGrp               |= ptcb->OSTCBBitY;         /* Make task ready to run                   */
    0355 01FA      MOVW	R30,R20
    0356 8425      LDD	R2,13+Z
    0357 90300149  LDS	R3,_OSRdyGrp
    0359 2832      OR	R3,R2
    035A 92300149  STS	R3,_OSRdyGrp
(0331)         OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
    035C E487      LDI	R24,0x47
    035D E091      LDI	R25,1
    035E 8423      LDD	R2,11+Z
    035F 2433      CLR	R3
    0360 0E28      ADD	R2,R24
    0361 1E39      ADC	R3,R25
    0362 8444      LDD	R4,12+Z
    0363 01F1      MOVW	R30,R2
    0364 8050      LDD	R5,0+Z
    0365 2854      OR	R5,R4
    0366 8250      STD	R5,0+Z
(0332)         OS_EXIT_CRITICAL();
    0367 930A      ST	R16,-Y
    0368 910F      POP	R16
    0369 BF0F      OUT	P3F,R16
    036A 9109      LD	R16,Y+
(0333)         return (OS_NO_ERR);
    036B 2700      CLR	R16
    036C C005      RJMP	0x0372
(0334)     } else {
(0335)         OS_EXIT_CRITICAL();
    036D 930A      ST	R16,-Y
    036E 910F      POP	R16
    036F BF0F      OUT	P3F,R16
    0370 9109      LD	R16,Y+
(0336)         return (OS_NO_MORE_TCB);
    0371 E406      LDI	R16,0x46
    0372 940E087B  CALL	pop_gset1
    0374 9508      RET
(0337)     }
(0338) }
(0339) /*$PAGE*/
(0340) /*
(0341) *********************************************************************************************************
(0342) *                                         PROCESS SYSTEM TICK
(0343) *
(0344) * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
(0345) *              as a 'clock tick').  This function should be called by the ticker ISR but, can also be
(0346) *              called by a high priority task.
(0347) *
(0348) * Arguments  : none
(0349) *
(0350) * Returns    : none
(0351) *********************************************************************************************************
(0352) */
(0353) 
(0354) void OSTimeTick (void)
(0355) {
(0356)     OS_TCB *ptcb;
(0357) 
(0358)     ptcb = OSTCBList;                                      /* Point at first TCB in TCB list           */
_OSTimeTick:
  ptcb                 --> R16
    0375 9100013D  LDS	R16,_OSTCBList
    0377 9110013E  LDS	R17,_OSTCBList+1
    0379 C03B      RJMP	0x03B5
(0359)     while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {              /* Go through all TCBs in TCB list          */
(0360)         OS_ENTER_CRITICAL();
    037A 930A      ST	R16,-Y
    037B B70F      IN	R16,P3F
    037C 94F8      BCLR	7
    037D 930F      PUSH	R16
    037E 9109      LD	R16,Y+
(0361)         if (ptcb->OSTCBDly != 0) {                         /* Delayed or waiting for event with TO     */
    037F 01F8      MOVW	R30,R16
    0380 8026      LDD	R2,6+Z
    0381 8037      LDD	R3,7+Z
    0382 2022      TST	R2
    0383 F419      BNE	0x0387
    0384 2033      TST	R3
    0385 F409      BNE	0x0387
    0386 C027      RJMP	0x03AE
(0362)             if (--ptcb->OSTCBDly == 0) {                   /* Decrement nbr of ticks to end of delay   */
    0387 01C8      MOVW	R24,R16
    0388 9606      ADIW	R24,6
    0389 01FC      MOVW	R30,R24
    038A 8180      LDD	R24,0+Z
    038B 8191      LDD	R25,1+Z
    038C 9701      SBIW	R24,1
    038D 012C      MOVW	R4,R24
    038E 8240      STD	R4,0+Z
    038F 8251      STD	R5,1+Z
    0390 3080      CPI	R24,0
    0391 0789      CPC	R24,R25
    0392 F4D9      BNE	0x03AE
(0363)                 if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {    /* Is task suspended?                   */
    0393 01F8      MOVW	R30,R16
    0394 8420      LDD	R2,8+Z
    0395 FC23      SBRC	R2,3
    0396 C012      RJMP	0x03A9
(0364)                     OSRdyGrp               |= ptcb->OSTCBBitY; /* No,  Make task Rdy to Run (timed out)*/
    0397 8425      LDD	R2,13+Z
    0398 90300149  LDS	R3,_OSRdyGrp
    039A 2832      OR	R3,R2
    039B 92300149  STS	R3,_OSRdyGrp
(0365)                     OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
    039D E487      LDI	R24,0x47
    039E E091      LDI	R25,1
    039F 8423      LDD	R2,11+Z
    03A0 2433      CLR	R3
    03A1 0E28      ADD	R2,R24
    03A2 1E39      ADC	R3,R25
    03A3 8444      LDD	R4,12+Z
    03A4 01F1      MOVW	R30,R2
    03A5 8050      LDD	R5,0+Z
    03A6 2854      OR	R5,R4
    03A7 8250      STD	R5,0+Z
(0366)                 } else {                                       /* Yes, Leave 1 tick to prevent ...     */
    03A8 C005      RJMP	0x03AE
(0367)                     ptcb->OSTCBDly = 1;                        /* ... loosing the task when the ...    */
    03A9 E081      LDI	R24,1
    03AA E090      LDI	R25,0
    03AB 01F8      MOVW	R30,R16
    03AC 8386      STD	R24,6+Z
    03AD 8397      STD	R25,7+Z
(0368)                 }                                              /* ... suspension is removed.           */
(0369)             }
(0370)         }
(0371)         ptcb = ptcb->OSTCBNext;                            /* Point at next TCB in TCB list            */
    03AE 01F8      MOVW	R30,R16
    03AF 8102      LDD	R16,2+Z

⌨️ 快捷键说明

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