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

📄 ucos_ii.asm

📁 uC/OS-II 在TI TMS320C240上的移植代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
* FUNCTION DEF : _OSIntExit
******************************************************
_OSIntExit:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,1
	LAR	AR0,*0+

	.line	8
;>>>> 	    if (OSRunning == TRUE) {
	LDPK	_OSRunning
	LAC	_OSRunning
	SUBK	1
	BNZ	L3
	.line	9
;>>>> 	        OS_ENTER_CRITICAL();
 SETC INTM
	.line	10
;>>>> 	        if (OSIntNesting > 0) {                            /* Prevent OSIntNesting from wrapping       */
	LAC	_OSIntNesting
	BZ	L4
	.line	11
;>>>> 	            OSIntNesting--;
	SUBK	1
	SACL	_OSIntNesting
L4:
	.line	13
;>>>> 	        if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Reschedule only if all ISRs complete ... */
	LAC	_OSIntNesting
	BNZ	L5
	LAC	_OSLockNesting
	BNZ	L5
	.line	14
;>>>> 	            OSIntExitY    = OSUnMapTbl[OSRdyGrp];          /* ... and not locked.                      */
	LAC	_OSRdyGrp
	ADLK	_OSUnMapTbl+0,0
	MAR	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR3
	BLDD	* ,#_OSIntExitY,AR0
	.line	15
;>>>> 	            OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
	LAC	_OSIntExitY
	ADLK	_OSRdyTbl+0,0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	* ,AR0
	ADLK	_OSUnMapTbl+0,0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	_OSIntExitY,3
	ADD	* 
	SACL	_OSPrioHighRdy
	.line	16
;>>>> 	            if (OSPrioHighRdy != OSPrioCur) {              /* No Ctx Sw if current task is highest rdy */
	LAC	_OSPrioHighRdy
	SUB	_OSPrioCur
	BZ	L5
	.line	17
;>>>> 	                OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
	LAC	_OSPrioHighRdy
	ADLK	_OSTCBPrioTbl+0,0
	MAR	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR3
	BLDD	* ,#_OSTCBHighRdy,AR1
	.line	18
;>>>> 	                OSCtxSwCtr++;                              /* Keep track of the number of ctx switches */
	ZALS	_OSCtxSwCtr
	ADDH	_OSCtxSwCtr+1
	ADDK	1
	SACL	_OSCtxSwCtr
	SACH	_OSCtxSwCtr+1
	.line	19
;>>>> 	                OSIntCtxSw();                              /* Perform interrupt level ctx switch       */
	CALL	_OSIntCtxSw
L5:
	.line	22
;>>>> 	        OS_EXIT_CRITICAL();
 CLRC INTM
L3:
EPI0_3:
	.line	24
	MAR	* ,AR1
	SBRK	2
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	195,000000000H,1

	.sym	_OSStart,_OSStart,32,2,0
	.globl	_OSStart

	.func	293
;>>>> 	void  OSStart (void)
;>>>> 	    INT8U y;
;>>>> 	    INT8U x;
******************************************************
* FUNCTION DEF : _OSStart
******************************************************
_OSStart:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,3
	LAR	AR0,*0+

	.sym	_y,1,14,1,16
	.sym	_x,2,14,1,16
	.line	7
;>>>> 	    if (OSRunning == FALSE) {
	LDPK	_OSRunning
	LAC	_OSRunning
	BNZ	L7
	.line	8
;>>>> 	        y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */
	LAC	_OSRdyGrp
	ADLK	_OSUnMapTbl+0,0
	MAR	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	* ,AR2
	LARK	AR2,1
	MAR	*0+
	SACL	* 
	.line	9
;>>>> 	        x             = OSUnMapTbl[OSRdyTbl[y]];
	LAC	*+,AR0
	ADLK	_OSRdyTbl+0,0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	* ,AR0
	ADLK	_OSUnMapTbl+0,0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	* ,AR2
	SACL	* 
	.line	10
;>>>> 	        OSPrioHighRdy = (INT8U)((y << 3) + x);
	LAC	*-
	ADD	* ,3,AR0
	SACL	_OSPrioHighRdy
	.line	11
;>>>> 	        OSPrioCur     = OSPrioHighRdy;
	BLKD	#_OSPrioHighRdy,_OSPrioCur
	.line	12
;>>>> 	        OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */
	LAC	_OSPrioHighRdy
	ADLK	_OSTCBPrioTbl+0,0
	SACL	* 
	LAR	AR3,* ,AR3
	BLDD	* ,#_OSTCBHighRdy,AR1
	.line	13
;>>>> 	        OSTCBCur      = OSTCBHighRdy;
	BLKD	#_OSTCBHighRdy,_OSTCBCur
	.line	14
;>>>> 	        OSStartHighRdy();                            /* Execute target specific code to start task     */
	CALL	_OSStartHighRdy
L7:
EPI0_4:
	.line	16
	SBRK	4
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	308,000000000H,3

	.sym	_OSTimeTick,_OSTimeTick,32,2,0
	.globl	_OSTimeTick

	.func	364
;>>>> 	void  OSTimeTick (void)
;>>>> 	#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
;>>>> 	    OS_CPU_SR  cpu_sr;
;>>>> 	#endif    
;>>>> 	    OS_TCB    *ptcb;
******************************************************
* FUNCTION DEF : _OSTimeTick
******************************************************
_OSTimeTick:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,2
	LAR	AR0,*0+

	.sym	_ptcb,1,24,1,16,_os_tcb
	.line	9
;>>>> 	    OSTimeTickHook();                                      /* Call user definable hook                 */
;>>>> 	#if OS_TIME_GET_SET_EN > 0   
	CALL	_OSTimeTickHook
	.line	11
;>>>> 	    OS_ENTER_CRITICAL();                                   /* Update the 32-bit tick counter           */
 SETC INTM
	.line	12
;>>>> 	    OSTime++;
	LDPK	_OSTime
	ZALS	_OSTime
	ADDH	_OSTime+1
	ADDK	1
	SACL	_OSTime
	SACH	_OSTime+1
	.line	13
;>>>> 	    OS_EXIT_CRITICAL();
;>>>> 	#endif
 CLRC INTM
	.line	15
;>>>> 	    if (OSRunning == TRUE) {    
	LAC	_OSRunning
	SUBK	1
	BNZ	L8
	.line	16
;>>>> 	        ptcb = OSTCBList;                                  /* Point at first TCB in TCB list           */
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	BLKD	#_OSTCBList,* 
	.line	17
;>>>> 	        while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {          /* Go through all TCBs in TCB list          */
	LAR	AR3,* ,AR3
	ADRK	6
	LAC	* 
	SUBK	12
	BZ	L8
	MAR	* ,AR2
L9:
	.line	18
;>>>> 	            OS_ENTER_CRITICAL();
 SETC INTM
	.line	19
;>>>> 	            if (ptcb->OSTCBDly != 0) {                     /* Delayed or waiting for event with TO     */
	LAR	AR3,* ,AR3
	ADRK	4
	LAC	* 
	BZ	L11
	.line	20
;>>>> 	                if (--ptcb->OSTCBDly == 0) {               /* Decrement nbr of ticks to end of delay   */
	ZALS	* 
	SUBK	1
	SACL	* 
	ANDK	0FFFFh
	BNZ	L11
	.line	21
;>>>> 	                    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended?    */
	MAR	*+
	BIT	* ,12
	BBNZ	L13
	.line	22
;>>>> 	                        OSRdyGrp               |= ptcb->OSTCBBitY; /* No,  Make task R-to-R (timed out)*/
	LDPK	_OSRdyGrp
	LAC	_OSRdyGrp
	ADRK	5
	OR	* ,AR2
	SACL	_OSRdyGrp
	.line	23
;>>>> 	                        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;>>>> 	                    } else {                               /* Yes, Leave 1 tick to prevent ...         */
	LAR	AR4,* ,AR4
	ADRK	8
	LAC	* ,AR0
	ADLK	_OSRdyTbl+0,0
	SACL	* 
	LAR	AR5,* ,AR5
	LAC	* ,AR3
	MAR	*-
	OR	* ,AR5
	SACL	* 
	B	L11
L13:
	.line	25
;>>>> 	                        ptcb->OSTCBDly = 1;                /* ... loosing the task when the ...        */
	LACK	1
	MAR	*-
	SACL	* 
L11:
	.line	29
;>>>> 	            ptcb = ptcb->OSTCBNext;                        /* Point at next TCB in TCB list            */
	MAR	* ,AR2
	LAR	AR3,* ,AR3
	MAR	*+
	LAC	* ,AR2
	SACL	* 
	.line	30
;>>>> 	            OS_EXIT_CRITICAL();
 CLRC INTM
	.line	17
	LAR	AR3,* ,AR3
	ADRK	6
	LAC	* ,AR2
	SUBK	12
	BNZ	L9
L8:
EPI0_5:
	.line	33
	MAR	* ,AR1
	SBRK	3
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	396,000000000H,2

	.sym	_OSVersion,_OSVersion,46,2,0
	.globl	_OSVersion

	.func	412
;>>>> 	INT16U  OSVersion (void)
******************************************************
* FUNCTION DEF : _OSVersion
******************************************************
_OSVersion:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,1
	LAR	AR0,*0+

	.line	3
;>>>> 	    return (OS_VERSION);
	LACK	252
EPI0_6:
	.line	4
	SBRK	2
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	415,000000000H,1

	.sym	_OS_EventTaskRdy,_OS_EventTaskRdy,46,2,0
	.globl	_OS_EventTaskRdy

	.func	459
;>>>> 	INT8U  OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
******************************************************
* FUNCTION DEF : _OS_EventTaskRdy
******************************************************
_OS_EventTaskRdy:

LF7	.set	0

	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,7
	LAR	AR0,*0+,AR2

	.sym	_pevent,-3+LF7,24,9,16,.fake0
	.sym	_msg,-4+LF7,16,9,16
	.sym	_msk,-5+LF7,14,9,16
	.sym	_ptcb,1,24,1,16,_os_tcb
	.sym	_x,2,14,1,16
	.sym	_y,3,14,1,16
	.sym	_bitx,4,14,1,16
	.sym	_bity,5,14,1,16
	.sym	_prio,6,14,1,16
	.line	2
;>>>> 	    OS_TCB *ptcb;
;>>>> 	    INT8U   x;
;>>>> 	    INT8U   y;
;>>>> 	    INT8U   bitx;
;>>>> 	    INT8U   bity;
;>>>> 	    INT8U   prio;
	.line	11
;>>>> 	    y    = OSUnMapTbl[pevent->OSEventGrp];            /* Find highest prio. task waiting for message   */
	LARK	AR2,-3+LF7
	MAR	*0+
	LAR	AR3,* ,AR3
	MAR	*+
	LAC	* ,AR0
	ADLK	_OSUnMapTbl+0,0
	SACL	* 
	LAR	AR4,* ,AR4
	LAC	* ,AR2
	ADRK	6-LF7
	SACL	* 
	.line	12
;>>>> 	    bity = OSMapTbl[y];
	LAC	* ,AR0
	ADLK	_OSMapTbl+0,0
	SACL	* 
	LAR	AR4,* ,AR4
	LAC	* ,AR2
	ADRK	2
	SACL	* 
	.line	13
;>>>> 	    x    = OSUnMapTbl[pevent->OSEventTbl[y]];
	SBRK	8-LF7
	LAC	* 
	ADDK	4
	ADRK	6-LF7
	ADD	*-,AR0
	SACL	* 
	LAR	AR4,* ,AR4
	LAC	* ,AR0
	ADLK	_OSUnMapTbl+0,0
	SACL	* 
	LAR	AR4,* ,AR4
	LAC	* ,AR2
	SACL	* 
	.line	14
;>>>> 	    bitx = OSMapTbl[x];
	LAC	* ,AR0
	ADLK	_OSMapTbl+0,0
	SACL	* 
	LAR	AR4,* ,AR4
	LAC	* ,AR2
	ADRK	2
	SACL	*-
	.line	15
;>>>> 	    prio = (INT8U)((y << 3) + x);                     /* Find priority of task getting the msg         */
	LAC	*-,3
	ADD	* 
	ADRK	4
	SACL	* 
	.line	16
;>>>> 	    if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) {   /* Remove this task from the waiting list        */
	SBRK	2
	ZALS	* ,AR1
	CMPL
	SACL	*+,AR2
	SBRK	7-LF7
	LAC	* 
	ADDK	4
	ADRK	6-LF7
	ADD	* ,AR0
	SACL	* 
	LAR	AR4,* ,AR1
	MAR	*-
	ZALS	* ,AR4
	AND	* 
	SACL	* 
	BNZ	L15
	.line	17
;>>>> 	        pevent->OSEventGrp &= ~bity;                  /* Clr group bit if this was only task pending   */
	MAR	* ,AR2
	ADRK	2
	LAC	* ,AR3
	CMPL
	AND	* 
	SACL	* 
L15:
	.line	19
;>>>> 	    ptcb                 =  OSTCBPrioTbl[prio];       /* Point to this task's OS_TCB                   */
	MAR	* ,AR2
	LARK	AR2,6
	MAR	*0+
	LAC	* ,AR0
	ADLK	_OSTCBPrioTbl+0,0
	SACL	* 
	LAR	AR4,* ,AR4
	LAC	* ,AR2
	SBRK	5
	SACL	* 
	.line	20
;>>>> 	    ptcb->OSTCBDly       =  0;                        /* Prevent OSTimeTick() from readying task       */
	LAR	AR4,* ,AR4
	LACK	0
	ADRK	4
	SACL	*-
	.line	21
;>>>> 	    ptcb->OSTCBEventPtr  = (OS_EVENT *)0;             /* Unlink ECB from this task                     */
;>>>> 	#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
;>>>> 	    ptcb->OSTCBMsg       = msg;                       /* Send message directly to waiting task         */
;>>>> 	#else
	SACL	* ,AR2
	.line	25
;>>>> 	    msg                  = msg;                       /* Prevent compiler warning if not used          */
;>>>> 	#endif
	.line	27
;>>>> 	    ptcb->OSTCBStat     &= ~msk;                      /* Clear bit associated with event type          */
	SBRK	6-LF7
	LAC	* ,AR4
	CMPL
	ADRK	2
	AND	* 
	SACL	* 
	.line	28
;>>>> 	    if (ptcb->OSTCBStat == OS_STAT_RDY) {             /* See if task is ready (could be susp'd)        */
	LAC	* 
	BNZ	L16
	.line	29
;>>>> 	        OSRdyGrp        |=  bity;                     /* Put task in the ready to run list             */
	LDPK	_OSRdyGrp
	LAC	_OSRdyGrp
	MAR	* ,AR2
	ADRK	10-LF7
	OR	* 
	SACL	_OSRdyGrp
	.line	30
;>>>> 	        OSRdyTbl[y]     |=  bitx;
	SBRK	2
	LAC	*+,AR0
	ADLK	_OSRdyTbl+0,0
	SACL	* 
	LAR	AR5,* ,AR5
	LAC	* ,AR2
	OR	* ,AR5
	SACL	* 
L16:
	.line	32
;>>>> 	    return (prio);
	MAR	* ,AR2
	LARK	AR2,6
	MAR	*0+
	ZALS	* 
EPI0_7:
	.line	33
	MAR	* ,AR1
	SBRK	8
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	491,000000000H,7

	.sym	_OS_EventTaskWait,_OS_EventTaskWait,32,2,0
	.globl	_OS_EventTaskWait

	.func	509
;>>>> 	void  OS_EventTaskWait (OS_EVENT *pevent)
******************************************************
* FUNCTION DEF : _OS_EventTaskWait
******************************************************
_OS_EventTaskWait:

LF8	.set	0

	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,1
	LAR	AR0,*0+,AR2

	.sym	_pevent,-3+LF8,24,9,16,.fake0
	.line	2
	.line	3
;>>>> 	    OSTCBCur->OSTCBEventPtr = pevent;            /* Store pointer to event control block in TCB        */
	LDPK	_OSTCBCur
	LAR	AR3,_OSTCBCur
	LARK	AR2,-3+LF8
	MAR	*0+
	LAC	* ,AR3
	ADRK	3
	SACL	* 
	.line	4
;>>>> 	    if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {   /* Task no longer ready      */
	ADRK	6
	ZALS	*-,AR1
	CMPL
	SACL	* ,AR3
	LAC	* ,AR0
	ADLK	_OSRdyTbl+0,0
	SACL	* 
	LAR	AR4,* ,AR1
	ZALS	* ,AR4
	AND	* 
	SACL	* 
	BNZ	L17
	.line	5
;>>>> 	        OSRdyGrp &= ~OSTCBCur->OSTCBBitY;        /* Clear event grp bit if this was only task pending  */
	MAR	* ,AR3
	ADRK	2
	LAC	* 
	CMPL
	AND	_OSRdyGrp
	SACL	_OSRdyGrp
L17:
	.line	7
;>>>> 	    pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;          /* Put task in waiting list  */
	LAR	AR3,_OSTCBCur
	LAR	AR4,_OSTCBCur
	MAR	* ,AR2
	LAC	* ,AR4
	ADDK	4
	ADRK	8
	ADD	* ,AR0
	SACL	* 
	LAR	AR5,* ,AR5
	LAC	* ,AR3
	ADRK	9
	OR	*+,AR5
	SACL	* ,AR2
	.line	8
;>>>> 	    pevent->OSEventGrp                   |= OSTCBCur->OSTCBBitY;
	LAR	AR5,* ,AR5
	MAR	*+
	LAC	* ,AR3
	OR	* ,AR5
	SACL	* ,AR1
EPI0_8:
	.line	9
	SBRK	2
	LAR	AR0,*-

⌨️ 快捷键说明

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