📄 os_core.s
字号:
; *
; * id is the task's ID (0..65535)
; *
; * stk_size is the size of the stack (in 'stack units'). If the stack units are INT8Us
; * then, 'stk_size' contains the number of bytes for the stack. If the stack
; * units are INT32Us then, the stack contains '4 * stk_size' bytes. The stack
; * units are established by the #define constant OS_STK which is CPU
; * specific. 'stk_size' is 0 if called by 'OSTaskCreate()'.
; *
; * pext is a pointer to a user supplied memory area that is used to extend the task
; * control block. This allows you to store the contents of floating-point
; * registers, MMU registers or anything else you could find useful during a
; * context switch. You can even assign a name to each task and store this name
; * in this TCB extension. A NULL pointer is passed if called by OSTaskCreate().
; *
; * opt options as passed to 'OSTaskCreateExt()' or,
; * 0 if called from 'OSTaskCreate()'.
; *
; * Returns : OS_NO_ERR if the call was successful
; * OS_NO_MORE_TCB if there are no more free TCBs to be allocated and thus, the task cannot
; * be created.
; *
; * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
;
; INT8U OSTCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt)
; {
.dbline 301
; OS_TCB *ptcb;
;
;
; OS_ENTER_CRITICAL();
st -y,r16
in r16,0x3F
cli
push r16
ld r16,y+
.dbline 301
.dbline 302
; ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */
lds R10,_OSTCBFreeList
lds R11,_OSTCBFreeList+1
.dbline 303
; if (ptcb != (OS_TCB *)0) {
tst R10
brne X4
tst R11
brne X6
rjmp L43
X6:
X4:
.dbline 303
.dbline 304
; OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
movw R30,R10
ldd R2,z+2
ldd R3,z+3
sts _OSTCBFreeList+1,R3
sts _OSTCBFreeList,R2
.dbline 305
; OS_EXIT_CRITICAL();
st -y,r16
pop r16
out 0x3F,r16
ld r16,y+
.dbline 305
.dbline 306
; ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
movw R30,R10
std z+1,R19
std z+0,R18
.dbline 307
; ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */
std z+9,R16
.dbline 308
; ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
clr R2
movw R30,R10
std z+8,R2
.dbline 309
; ptcb->OSTCBDly = 0; /* Task is not delayed */
clr R3
movw R30,R10
std z+7,R3
std z+6,R2
.dbline 311
;
; pext = pext; /* Prevent compiler warning if not used */
.dbline 312
; stk_size = stk_size;
.dbline 313
; pbos = pbos;
.dbline 314
; opt = opt;
.dbline 315
; id = id;
.dbline 317
;
; ptcb->OSTCBY = prio >> 3; /* Pre-compute X, Y, BitX and BitY */
mov R2,R16
lsr R2
lsr R2
lsr R2
movw R30,R10
std z+11,R2
.dbline 318
; ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
ldi R24,<_OSMapTbl
ldi R25,>_OSMapTbl
movw R30,R10
ldd R30,z+11
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
movw R26,R10
adiw R26,13
st x,R30
.dbline 319
; ptcb->OSTCBX = prio & 0x07;
mov R24,R16
andi R24,7
movw R30,R10
std z+10,R24
.dbline 320
; ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];
ldi R24,<_OSMapTbl
ldi R25,>_OSMapTbl
movw R30,R10
ldd R30,z+10
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
movw R26,R10
adiw R26,12
st x,R30
.dbline 322
;
; OS_ENTER_CRITICAL();
st -y,r16
in r16,0x3F
cli
push r16
ld r16,y+
.dbline 322
.dbline 323
; OSTCBPrioTbl[prio] = ptcb;
ldi R24,2
mul R24,R16
movw R30,R0
ldi R24,<_OSTCBPrioTbl
ldi R25,>_OSTCBPrioTbl
add R30,R24
adc R31,R25
std z+1,R11
std z+0,R10
.dbline 324
; ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */
lds R2,_OSTCBList
lds R3,_OSTCBList+1
movw R30,R10
std z+3,R3
std z+2,R2
.dbline 325
; ptcb->OSTCBPrev = (OS_TCB *)0;
clr R2
clr R3
movw R30,R10
std z+5,R3
std z+4,R2
.dbline 326
; if (OSTCBList != (OS_TCB *)0) {
lds R2,_OSTCBList
lds R3,_OSTCBList+1
tst R2
brne X5
tst R3
breq L45
X5:
.dbline 326
.dbline 327
; OSTCBList->OSTCBPrev = ptcb;
lds R30,_OSTCBList
lds R31,_OSTCBList+1
std z+5,R11
std z+4,R10
.dbline 328
; }
L45:
.dbline 329
; OSTCBList = ptcb;
sts _OSTCBList+1,R11
sts _OSTCBList,R10
.dbline 330
; OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
movw R30,R10
ldd R2,z+13
lds R3,_OSRdyGrp
or R3,R2
sts _OSRdyGrp,R3
.dbline 331
; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
ldi R24,<_OSRdyTbl
ldi R25,>_OSRdyTbl
movw R30,R10
ldd R2,z+11
clr R3
add R2,R24
adc R3,R25
movw R30,R10
ldd R4,z+12
movw R30,R2
ldd R5,z+0
or R5,R4
std z+0,R5
.dbline 332
; OS_EXIT_CRITICAL();
st -y,r16
pop r16
out 0x3F,r16
ld r16,y+
.dbline 332
.dbline 333
; return (OS_NO_ERR);
clr R16
rjmp L42
L43:
.dbline 334
; } else {
.dbline 335
; OS_EXIT_CRITICAL();
st -y,r16
pop r16
out 0x3F,r16
ld r16,y+
.dbline 335
.dbline 336
; return (OS_NO_MORE_TCB);
ldi R16,70
.dbline -2
L42:
rcall pop_gset3x
.dbline 0 ; func end
ret
.dbsym r ptcb 10 pX
.dbsym l opt 10 i
.dbsym l pext 8 pV
.dbsym l stk_size 6 i
.dbsym l id 4 i
.dbsym l pbos 2 pc
.dbsym r ptos 18 pc
.dbsym r prio 16 c
.dbend
.dbfunc e OSTimeTick _OSTimeTick fV
; ptcb -> R16,R17
.even
_OSTimeTick::
.dbline -1
.dbline 355
; }
; }
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * PROCESS SYSTEM TICK
; *
; * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
; * as a 'clock tick'). This function should be called by the ticker ISR but, can also be
; * called by a high priority task.
; *
; * Arguments : none
; *
; * Returns : none
; *********************************************************************************************************
; */
;
; void OSTimeTick (void)
; {
.dbline 358
; OS_TCB *ptcb;
;
; ptcb = OSTCBList; /* Point at first TCB in TCB list */
lds R16,_OSTCBList
lds R17,_OSTCBList+1
rjmp L49
L48:
.dbline 359
; while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
.dbline 360
; OS_ENTER_CRITICAL();
st -y,r16
in r16,0x3F
cli
push r16
ld r16,y+
.dbline 360
.dbline 361
; if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
movw R30,R16
ldd R2,z+6
ldd R3,z+7
tst R2
brne X7
tst R3
brne X9
rjmp L51
X9:
X7:
.dbline 361
.dbline 362
; if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
movw R24,R16
adiw R24,6
movw R30,R24
ldd R24,z+0
ldd R25,z+1
sbiw R24,1
movw R4,R24
std z+1,R5
std z+0,R4
cpi R24,0
cpc R24,R25
breq X10
rjmp L53
X10:
X8:
.dbline 362
.dbline 363
; if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) { /* Is task suspended? */
movw R30,R16
ldd R2,z+8
sbrc R2,3
rjmp L55
.dbline 363
.dbline 364
; OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task Rdy to Run (timed out)*/
movw R30,R16
ldd R2,z+13
lds R3,_OSRdyGrp
or R3,R2
sts _OSRdyGrp,R3
.dbline 365
; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
ldi R24,<_OSRdyTbl
ldi R25,>_OSRdyTbl
movw R30,R16
ldd R2,z+11
clr R3
add R2,R24
adc R3,R25
movw R30,R16
ldd R4,z+12
movw R30,R2
ldd R5,z+0
or R5,R4
std z+0,R5
.dbline 366
rjmp L56
L55:
.dbline 366
; } else { /* Yes, Leave 1 tick to prevent ... */
.dbline 367
; ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
ldi R24,1
ldi R25,0
movw R30,R16
std z+7,R25
std z+6,R24
.dbline 368
; } /* ... suspension is removed. */
L56:
.dbline 369
; }
L53:
.dbline 370
; }
L51:
.dbline 371
movw R30,R16
ldd R16,z+2
ldd R17,z+3
.dbline 372
st -y,r16
pop r16
out 0x3F,r16
ld r16,y+
.dbline 372
.dbline 373
L49:
.dbline 359
movw R30,R16
ldd R24,z+9
cpi R24,15
breq X11
rjmp L48
X11:
.dbline 374
; ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
; OS_EXIT_CRITICAL();
; }
; OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
st -y,r16
in r16,0x3F
cli
push r16
ld r16,y+
.dbline 374
.dbline 375
; OSTime++;
ldi R24,1
ldi R25,0
ldi R26,0
ldi R27,0
lds R4,_OSTime+2
lds R5,_OSTime+2+1
lds R2,_OSTime
lds R3,_OSTime+1
add R2,R24
adc R3,R25
adc R4,R26
adc R5,R27
sts _OSTime+1,R3
sts _OSTime,R2
sts _OSTime+2+1,R5
sts _OSTime+2,R4
.dbline 376
; OS_EXIT_CRITICAL();
st -y,r16
pop r16
out 0x3F,r16
ld r16,y+
.dbline 376
.dbline -2
L47:
.dbline 0 ; func end
ret
.dbsym r ptcb 16 pX
.dbend
.area bss(ram, con, rel)
.dbfile G:\IccPro\ucos_m8_icc\source\OS_CORE.C
_OSTCBTbl:
.blkb 84
.dbsym s OSTCBTbl _OSTCBTbl A[84:6]X
_OSTaskIdleStk:
.blkb 100
.dbsym s OSTaskIdleStk _OSTaskIdleStk A[100:100]c
_OSIntExitY:
.blkb 1
.dbsym s OSIntExitY _OSIntExitY c
_OSTime::
.blkb 4
.dbfile G:\IccPro\ucos_m8_icc\source/UCOS_II.H
.dbsym e OSTime _OSTime l
_OSTCBPrioTbl::
.blkb 32
.dbsym e OSTCBPrioTbl _OSTCBPrioTbl A[32:16]pX
_OSTCBList::
.blkb 2
.dbsym e OSTCBList _OSTCBList pX
_OSTCBHighRdy::
.blkb 2
.dbsym e OSTCBHighRdy _OSTCBHighRdy pX
_OSTCBFreeList::
.blkb 2
.dbsym e OSTCBFreeList _OSTCBFreeList pX
_OSTCBCur::
.blkb 2
.dbsym e OSTCBCur _OSTCBCur pX
_OSTaskCtr::
.blkb 1
.dbsym e OSTaskCtr _OSTaskCtr c
_OSRunning::
.blkb 1
.dbsym e OSRunning _OSRunning c
_OSRdyTbl::
.blkb 2
.dbsym e OSRdyTbl _OSRdyTbl A[2:2]c
_OSRdyGrp::
.blkb 1
.dbsym e OSRdyGrp _OSRdyGrp c
_OSPrioHighRdy::
.blkb 1
.dbsym e OSPrioHighRdy _OSPrioHighRdy c
_OSPrioCur::
.blkb 1
.dbsym e OSPrioCur _OSPrioCur c
_OSLockNesting::
.blkb 1
.dbsym e OSLockNesting _OSLockNesting c
_OSIntNesting::
.blkb 1
.dbsym e OSIntNesting _OSIntNesting c
_OSIdleCtr::
.blkb 4
.dbsym e OSIdleCtr _OSIdleCtr l
_OSEventTbl::
.blkb 16
.dbsym e OSEventTbl _OSEventTbl A[16:2]X
_OSEventFreeList::
.blkb 2
.dbsym e OSEventFreeList _OSEventFreeList pX
_OSCtxSwCtr::
.blkb 4
.dbsym e OSCtxSwCtr _OSCtxSwCtr l
.area func_lit
PL_OSTaskIdle: .word `_OSTaskIdle
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -