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

📄 os_core.s

📁 使用mega8和iccavr编译器的一段ucos操作系统程序
💻 S
📖 第 1 页 / 共 3 页
字号:
; *
; *              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 + -