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

📄 os_core.lis

📁 1.将uC/OS-II操作系统移植到Mega16上 2.建立两个任务
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 03BA           ; */
 03BA           ; 
 03BA           ; void OSStart (void)
 03BA           ; {
 03BA           ;     INT8U y;
 03BA           ;     INT8U x;
 03BA           ; 
 03BA           ; 
 03BA           ;     if (OSRunning == FALSE) {
 03BA           ;         y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */
 03BA           ;         x             = OSUnMapTbl[OSRdyTbl[y]];
 03BA           ;         OSPrioHighRdy = (INT8U)((y << 3) + x);
 03BA           ;         OSPrioCur     = OSPrioHighRdy;
 03BA           ;         OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
 03BA           ;         OSTCBCur      = OSTCBHighRdy;
 03BA           ;         OSStartHighRdy();                            /* Execute target specific code to start task     */
 03BA           ;     }
 03BA           ; }
 03BA           L34:
 03BA 0E940000          xcall pop_gset2
 03BE                   .dbline 0 ; func end
 03BE 0895              ret
 03C0                   .dbsym r x 22 c
 03C0                   .dbsym r y 20 c
 03C0                   .dbend
 03C0                   .dbfunc e OSTaskIdle _OSTaskIdle fV
 03C0           ;          pdata -> R16,R17
                        .even
 03C0           _OSTaskIdle::
 03C0                   .dbline -1
 03C0                   .dbline 244
 03C0           ; /*$PAGE*/
 03C0           ; /*
 03C0           ; *********************************************************************************************************
 03C0           ; *                                              IDLE TASK
 03C0           ; *
 03C0           ; * Description: This task is internal to uC/OS-II and executes whenever no other higher priority tasks
 03C0           ; *              executes because they are waiting for event(s) to occur.
 03C0           ; *
 03C0           ; * Arguments  : none
 03C0           ; *
 03C0           ; * Returns    : none
 03C0           ; *********************************************************************************************************
 03C0           ; */
 03C0           ; 
 03C0           ; void OSTaskIdle (void *pdata)
 03C0           ; {
 03C0                   .dbline 245
 03C0           ;     pdata = pdata;                               /* Prevent compiler warning for not using 'pdata'     */
 03C0                   .dbline 246
 03C0           L38:
 03C0                   .dbline 246
 03C0                   .dbline 247
 03C0 0A93              st -y,r16
 03C2 0FB7              in r16,0x3f
 03C4 F894              cli
 03C6 0F93              push r16
 03C8 0991              ld r16,y+
 03CA                   .dbline 247
 03CA                   .dbline 248
 03CA 81E0              ldi R24,1
 03CC 90E0              ldi R25,0
 03CE A0E0              ldi R26,0
 03D0 B0E0              ldi R27,0
 03D2 4090F000          lds R4,_OSIdleCtr+2
 03D6 5090F100          lds R5,_OSIdleCtr+2+1
 03DA 2090EE00          lds R2,_OSIdleCtr
 03DE 3090EF00          lds R3,_OSIdleCtr+1
 03E2 280E              add R2,R24
 03E4 391E              adc R3,R25
 03E6 4A1E              adc R4,R26
 03E8 5B1E              adc R5,R27
 03EA 3092EF00          sts _OSIdleCtr+1,R3
 03EE 2092EE00          sts _OSIdleCtr,R2
 03F2 5092F100          sts _OSIdleCtr+2+1,R5
 03F6 4092F000          sts _OSIdleCtr+2,R4
 03FA                   .dbline 249
 03FA 0A93              st -y,r16
 03FC 0F91              pop r16
 03FE 0FBF              out 0x3F,r16
 0400 0991              ld r16,y+
 0402                   .dbline 249
 0402                   .dbline 250
 0402                   .dbline 246
 0402                   .dbline 246
 0402 DECF              xjmp L38
 0404           X3:
 0404                   .dbline -2
 0404           L37:
 0404                   .dbline 0 ; func end
 0404 0895              ret
 0406                   .dbsym r pdata 16 pV
 0406                   .dbend
 0406                   .dbfunc e OSTCBInit _OSTCBInit fc
 0406           ;           ptcb -> R20,R21
 0406           ;            opt -> y+10
 0406           ;           pext -> y+8
 0406           ;       stk_size -> y+6
 0406           ;             id -> y+4
 0406           ;           pbos -> y+2
 0406           ;           ptos -> R18,R19
 0406           ;           prio -> R16
                        .even
 0406           _OSTCBInit::
 0406 0E940000          xcall push_gset1
 040A                   .dbline -1
 040A                   .dbline 297
 040A           ;     for (;;) {
 040A           ;         OS_ENTER_CRITICAL();
 040A           ;         OSIdleCtr++;
 040A           ;         OS_EXIT_CRITICAL();
 040A           ;     }
 040A           ; }
 040A           ; /*$PAGE*/
 040A           ; /*
 040A           ; *********************************************************************************************************
 040A           ; *                                            INITIALIZE TCB
 040A           ; *
 040A           ; * Description: This function is internal to uC/OS-II and is used to initialize a Task Control Block when
 040A           ; *              a task is created (see OSTaskCreate() and OSTaskCreateExt()).
 040A           ; *
 040A           ; * Arguments  : prio          is the priority of the task being created
 040A           ; *
 040A           ; *              ptos          is a pointer to the task's top-of-stack assuming that the CPU registers
 040A           ; *                            have been placed on the stack.  Note that the top-of-stack corresponds to a 
 040A           ; *                            'high' memory location is OS_STK_GROWTH is set to 1 and a 'low' memory
 040A           ; *                            location if OS_STK_GROWTH is set to 0.  Note that stack growth is CPU
 040A           ; *                            specific.
 040A           ; *
 040A           ; *              pbos          is a pointer to the bottom of stack.  A NULL pointer is passed if called by
 040A           ; *                            'OSTaskCreate()'.
 040A           ; *
 040A           ; *              id            is the task's ID (0..65535)
 040A           ; *
 040A           ; *              stk_size      is the size of the stack (in 'stack units').  If the stack units are INT8Us
 040A           ; *                            then, 'stk_size' contains the number of bytes for the stack.  If the stack
 040A           ; *                            units are INT32Us then, the stack contains '4 * stk_size' bytes.  The stack
 040A           ; *                            units are established by the #define constant OS_STK which is CPU
 040A           ; *                            specific.  'stk_size' is 0 if called by 'OSTaskCreate()'.
 040A           ; *
 040A           ; *              pext          is a pointer to a user supplied memory area that is used to extend the task
 040A           ; *                            control block.  This allows you to store the contents of floating-point
 040A           ; *                            registers, MMU registers or anything else you could find useful during a 
 040A           ; *                            context switch.  You can even assign a name to each task and store this name
 040A           ; *                            in this TCB extension.  A NULL pointer is passed if called by OSTaskCreate().
 040A           ; *
 040A           ; *              opt           options as passed to 'OSTaskCreateExt()' or, 
 040A           ; *                            0 if called from 'OSTaskCreate()'.
 040A           ; *
 040A           ; * Returns    : OS_NO_ERR         if the call was successful
 040A           ; *              OS_NO_MORE_TCB    if there are no more free TCBs to be allocated and thus, the task cannot
 040A           ; *                                be created.
 040A           ; *
 040A           ; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
 040A           ; *********************************************************************************************************
 040A           ; */
 040A           ; 
 040A           ; INT8U OSTCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt)
 040A           ; {
 040A                   .dbline 301
 040A           ;     OS_TCB *ptcb;
 040A           ; 
 040A           ; 
 040A           ;     OS_ENTER_CRITICAL();
 040A 0A93              st -y,r16
 040C 0FB7              in r16,0x3f
 040E F894              cli
 0410 0F93              push r16
 0412 0991              ld r16,y+
 0414                   .dbline 301
 0414                   .dbline 302
 0414           ;     ptcb = OSTCBFreeList;                                  /* Get a free TCB from the free TCB list    */
 0414 4091E100          lds R20,_OSTCBFreeList
 0418 5091E200          lds R21,_OSTCBFreeList+1
 041C                   .dbline 303
 041C           ;     if (ptcb != (OS_TCB *)0) {
 041C 4030              cpi R20,0
 041E 4507              cpc R20,R21
 0420 09F4              brne X6
 0422 73C0              xjmp L43
 0424           X6:
 0424           X4:
 0424                   .dbline 303
 0424                   .dbline 304
 0424           ;         OSTCBFreeList        = ptcb->OSTCBNext;            /* Update pointer to free TCB list          */
 0424 FA01              movw R30,R20
 0426 2280              ldd R2,z+2
 0428 3380              ldd R3,z+3
 042A 3092E200          sts _OSTCBFreeList+1,R3
 042E 2092E100          sts _OSTCBFreeList,R2
 0432                   .dbline 305
 0432           ;         OS_EXIT_CRITICAL();
 0432 0A93              st -y,r16
 0434 0F91              pop r16
 0436 0FBF              out 0x3F,r16
 0438 0991              ld r16,y+
 043A                   .dbline 305
 043A                   .dbline 306
 043A           ;         ptcb->OSTCBStkPtr    = ptos;                       /* Load Stack pointer in TCB                */
 043A 2083              std z+0,R18
 043C 3183              std z+1,R19
 043E                   .dbline 307
 043E           ;         ptcb->OSTCBPrio      = (INT8U)prio;                /* Load task priority into TCB              */
 043E 0187              std z+9,R16
 0440                   .dbline 308
 0440           ;         ptcb->OSTCBStat      = OS_STAT_RDY;                /* Task is ready to run                     */
 0440 2224              clr R2
 0442 2086              std z+8,R2
 0444                   .dbline 309
 0444           ;         ptcb->OSTCBDly       = 0;                          /* Task is not delayed                      */
 0444 3324              clr R3
 0446 2682              std z+6,R2
 0448 3782              std z+7,R3
 044A                   .dbline 311
 044A           ; 
 044A           ;         pext                 = pext;                       /* Prevent compiler warning if not used     */
 044A                   .dbline 312
 044A           ;         stk_size             = stk_size;
 044A                   .dbline 313
 044A           ;         pbos                 = pbos;
 044A                   .dbline 314
 044A           ;         opt                  = opt;
 044A                   .dbline 315
 044A           ;         id                   = id;
 044A                   .dbline 317
 044A           ; 
 044A           ;         ptcb->OSTCBY         = prio >> 3;                  /* Pre-compute X, Y, BitX and BitY          */
 044A 202E              mov R2,R16
 044C 2694              lsr R2
 044E 2694              lsr R2
 0450 2694              lsr R2
 0452 2386              std z+11,R2
 0454                   .dbline 318
 0454           ;         ptcb->OSTCBBitY      = OSMapTbl[ptcb->OSTCBY];
 0454 80E0              ldi R24,<_OSMapTbl
 0456 90E0              ldi R25,>_OSMapTbl
 0458 E385              ldd R30,z+11
 045A FF27              clr R31
 045C E80F              add R30,R24
 045E F91F              adc R31,R25
 0460 E491              lpm R30,Z
 0462 DA01              movw R26,R20
 0464 1D96              adiw R26,13
 0466 EC93              st x,R30
 0468                   .dbline 319
 0468           ;         ptcb->OSTCBX         = prio & 0x07;
 0468 802F              mov R24,R16
 046A 8770              andi R24,7
 046C FA01              movw R30,R20
 046E 8287              std z+10,R24
 0470                   .dbline 320
 0470           ;         ptcb->OSTCBBitX      = OSMapTbl[ptcb->OSTCBX];
 0470 80E0              ldi R24,<_OSMapTbl
 0472 90E0              ldi R25,>_OSMapTbl
 0474 E285              ldd R30,z+10
 0476 FF27              clr R31
 0478 E80F              add R30,R24
 047A F91F              adc R31,R25
 047C E491              lpm R30,Z
 047E DA01              movw R26,R20
 0480 1C96              adiw R26,12
 0482 EC93              st x,R30
 0484                   .dbline 322
 0484           ; 
 0484           ;         OS_ENTER_CRITICAL();
 0484 0A93              st -y,r16
 0486 0FB7              in r16,0x3f
 0488 F894              cli
 048A 0F93              push r16
 048C 0991              ld r16,y+
 048E                   .dbline 322
 048E                   .dbline 323
 048E           ;         OSTCBPrioTbl[prio]   = ptcb;
 048E 82E0              ldi R24,2
 0490 809F              mul R24,R16
 0492 F001              movw R30,R0
 0494 80E0              ldi R24,<_OSTCBPrioTbl
 0496 90E0              ldi R25,>_OSTCBPrioTbl
 0498 E80F              add R30,R24
 049A F91F              adc R31,R25
 049C 4083              std z+0,R20
 049E 5183              std z+1,R21
 04A0                   .dbline 324
 04A0           ;         ptcb->OSTCBNext      = OSTCBList;                  /* Link into TCB chain                      */
 04A0 2090DD00          lds R2,_OSTCBList
 04A4 3090DE00          lds R3,_OSTCBList+1
 04A8 FA01              movw R30,R20
 04AA 2282              std z+2,R2
 04AC 3382              std z+3,R3
 04AE                   .dbline 325
 04AE           ;         ptcb->OSTCBPrev      = (OS_TCB *)0;
 04AE 2224              clr R2
 04B0 3324              clr R3
 04B2 2482              std z+4,R2
 04B4 3582              std z+5,R3

⌨️ 快捷键说明

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