📄 os_core.lis
字号:
01A6 ; * Arguments : none
01A6 ; *
01A6 ; * Returns : none
01A6 ; *********************************************************************************************************
01A6 ; */
01A6 ;
01A6 ; void OSTimeTick (void)
01A6 ; {
01A6 .dbline 372
01A6 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
01A6 ; OS_CPU_SR cpu_sr;
01A6 ; #endif
01A6 ; OS_TCB *ptcb;
01A6 ;
01A6 ;
01A6 ; OSTimeTickHook(); /* Call user definable hook */
01A6 0E940000 xcall _OSTimeTickHook
01AA .dbline 378
01AA ; #if OS_TIME_GET_SET_EN > 0
01AA ; OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
01AA ; OSTime++;
01AA ; OS_EXIT_CRITICAL();
01AA ; #endif
01AA ; if (OSRunning == TRUE) {
01AA 80912301 lds R24,_OSRunning
01AE 8130 cpi R24,1
01B0 09F0 breq X6
01B2 49C0 xjmp L22
01B4 X6:
01B4 .dbline 378
01B4 .dbline 379
01B4 ; ptcb = OSTCBList; /* Point at first TCB in TCB list */
01B4 40919600 lds R20,_OSTCBList
01B8 50919700 lds R21,_OSTCBList+1
01BC 3FC0 xjmp L25
01BE L24:
01BE .dbline 380
01BE ; while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
01BE .dbline 381
01BE ; OS_ENTER_CRITICAL();
01BE 0A93 st -y,r16
01C0 0FB7 in r16,0x3F
01C2 F894 cli
01C4 0F93 push r16
01C6 0991 ld r16,y+
01C8 .dbline 381
01C8 .dbline 382
01C8 ; if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
01C8 FA01 movw R30,R20
01CA 2184 ldd R2,z+9
01CC 3284 ldd R3,z+10
01CE 2220 tst R2
01D0 19F4 brne X4
01D2 3320 tst R3
01D4 09F4 brne X7
01D6 2BC0 xjmp L27
01D8 X7:
01D8 X4:
01D8 .dbline 382
01D8 .dbline 383
01D8 ; if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
01D8 CA01 movw R24,R20
01DA 0996 adiw R24,9
01DC FC01 movw R30,R24
01DE 8081 ldd R24,z+0
01E0 9181 ldd R25,z+1
01E2 0197 sbiw R24,1
01E4 2C01 movw R4,R24
01E6 5182 std z+1,R5
01E8 4082 std z+0,R4
01EA 8030 cpi R24,0
01EC 8907 cpc R24,R25
01EE 09F0 breq X8
01F0 1EC0 xjmp L29
01F2 X8:
01F2 X5:
01F2 .dbline 383
01F2 .dbline 384
01F2 ; if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
01F2 FA01 movw R30,R20
01F4 2384 ldd R2,z+11
01F6 23FC sbrc R2,3
01F8 15C0 rjmp L31
01FA .dbline 384
01FA .dbline 385
01FA ; OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
01FA FA01 movw R30,R20
01FC 2088 ldd R2,z+16
01FE 30902701 lds R3,_OSRdyGrp
0202 3228 or R3,R2
0204 30922701 sts _OSRdyGrp,R3
0208 .dbline 386
0208 ; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
0208 80E0 ldi R24,<_OSRdyTbl
020A 90E0 ldi R25,>_OSRdyTbl
020C FA01 movw R30,R20
020E 2684 ldd R2,z+14
0210 3324 clr R3
0212 280E add R2,R24
0214 391E adc R3,R25
0216 FA01 movw R30,R20
0218 4784 ldd R4,z+15
021A F101 movw R30,R2
021C 5080 ldd R5,z+0
021E 5428 or R5,R4
0220 5082 std z+0,R5
0222 .dbline 387
0222 05C0 xjmp L32
0224 L31:
0224 .dbline 387
0224 ; } else { /* Yes, Leave 1 tick to prevent ... */
0224 .dbline 388
0224 ; ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
0224 81E0 ldi R24,1
0226 90E0 ldi R25,0
0228 FA01 movw R30,R20
022A 9287 std z+10,R25
022C 8187 std z+9,R24
022E .dbline 389
022E ; } /* ... suspension is removed. */
022E L32:
022E .dbline 390
022E ; }
022E L29:
022E .dbline 391
022E ; }
022E L27:
022E .dbline 392
022E FA01 movw R30,R20
0230 4281 ldd R20,z+2
0232 5381 ldd R21,z+3
0234 .dbline 393
0234 0A93 st -y,r16
0236 0F91 pop r16
0238 0FBF out 0x3F,r16
023A 0991 ld r16,y+
023C .dbline 393
023C .dbline 394
023C L25:
023C .dbline 380
023C FA01 movw R30,R20
023E 8485 ldd R24,z+12
0240 8431 cpi R24,20
0242 09F0 breq X9
0244 BCCF xjmp L24
0246 X9:
0246 .dbline 395
0246 L22:
0246 .dbline -2
0246 L21:
0246 0E940000 xcall pop_gset1
024A .dbline 0 ; func end
024A 0895 ret
024C .dbsym r ptcb 20 pS[os_tcb]
024C .dbend
024C .dbfunc e OSVersion _OSVersion fi
.even
024C _OSVersion::
024C .dbline -1
024C .dbline 413
024C ; ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
024C ; OS_EXIT_CRITICAL();
024C ; }
024C ; }
024C ; }
024C ;
024C ; /*
024C ; *********************************************************************************************************
024C ; * GET VERSION
024C ; *
024C ; * Description: This function is used to return the version number of uC/OS-II. The returned value
024C ; * corresponds to uC/OS-II's version number multiplied by 100. In other words, version 2.00
024C ; * would be returned as 200.
024C ; *
024C ; * Arguments : none
024C ; *
024C ; * Returns : the version number of uC/OS-II multiplied by 100.
024C ; *********************************************************************************************************
024C ; */
024C ;
024C ; INT16U OSVersion (void)
024C ; {
024C .dbline 414
024C ; return (OS_VERSION);
024C 0CEF ldi R16,252
024E 10E0 ldi R17,0
0250 .dbline -2
0250 L33:
0250 .dbline 0 ; func end
0250 0895 ret
0252 .dbend
0252 .dbfunc e OS_Dummy _OS_Dummy fV
.even
0252 _OS_Dummy::
0252 .dbline -1
0252 .dbline 432
0252 ; }
0252 ;
0252 ;
0252 ; /*
0252 ; *********************************************************************************************************
0252 ; * DUMMY FUNCTION
0252 ; *
0252 ; * Description: This function doesn't do anything. It is called by OSTaskDel().
0252 ; *
0252 ; * Arguments : none
0252 ; *
0252 ; * Returns : none
0252 ; *********************************************************************************************************
0252 ; */
0252 ;
0252 ; #if OS_TASK_DEL_EN > 0
0252 ; void OS_Dummy (void)
0252 ; {
0252 .dbline -2
0252 L34:
0252 .dbline 0 ; func end
0252 0895 ret
0254 .dbend
0254 .dbfunc s OS_InitEventList _OS_InitEventList fV
.even
0254 _OS_InitEventList:
0254 .dbline -1
0254 .dbline 615
0254 ; }
0254 ; #endif
0254 ;
0254 ;
0254 ; /*
0254 ; *********************************************************************************************************
0254 ; * MAKE TASK READY TO RUN BASED ON EVENT OCCURING
0254 ; *
0254 ; * Description: This function is called by other uC/OS-II services and is used to ready a task that was
0254 ; * waiting for an event to occur.
0254 ; *
0254 ; * Arguments : pevent is a pointer to the event control block corresponding to the event.
0254 ; *
0254 ; * msg is a pointer to a message. This pointer is used by message oriented services
0254 ; * such as MAILBOXEs and QUEUEs. The pointer is not used when called by other
0254 ; * service functions.
0254 ; *
0254 ; * msk is a mask that is used to clear the status byte of the TCB. For example,
0254 ; * OSSemPost() will pass OS_STAT_SEM, OSMboxPost() will pass OS_STAT_MBOX etc.
0254 ; *
0254 ; * Returns : none
0254 ; *
0254 ; * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
0254 ; *********************************************************************************************************
0254 ; */
0254 ; #if OS_EVENT_EN > 0
0254 ; INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
0254 ; {
0254 ; OS_TCB *ptcb;
0254 ; INT8U x;
0254 ; INT8U y;
0254 ; INT8U bitx;
0254 ; INT8U bity;
0254 ; INT8U prio;
0254 ;
0254 ;
0254 ; y = OSUnMapTbl[pevent->OSEventGrp]; /* Find highest prio. task waiting for message */
0254 ; bity = OSMapTbl[y];
0254 ; x = OSUnMapTbl[pevent->OSEventTbl[y]];
0254 ; bitx = OSMapTbl[x];
0254 ; prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -