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

📄 ucos_ii.asm

📁 uc/os在2407上的移植代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	SAR	AR1,*
	LARK	AR0,2
	LAR	AR0,*0+

	.sym	_prio,-3+LF15,12,9,16
	.sym	_ptos,-4+LF15,30,9,16
	.sym	_pbos,-5+LF15,30,9,16
	.sym	_id,-6+LF15,14,9,16
	.sym	_stk_size,-7+LF15,14,9,16
	.sym	_pext,-8+LF15,16,9,16
	.sym	_opt,-9+LF15,14,9,16
	.sym	_ptcb,1,24,1,16,_os_tcb
	.line	2
;>>>> 	    OS_TCB *ptcb;
	.line	6
;>>>> 	    OS_ENTER_CRITICAL();
	setc intm
	.line	7
;>>>> 	    ptcb = OSTCBFreeList;                                  /* Get a free TCB from the free TCB list    */
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	BLKD	#_OSTCBFreeList,* 
	.line	8
;>>>> 	    if (ptcb != (OS_TCB *)0) {
	LAC	* 
	BZ	L35
	.line	9
;>>>> 	        OSTCBFreeList        = ptcb->OSTCBNext;            /* Update pointer to free TCB list          */
	LAR	AR3,* ,AR3
	MAR	*+
	BLDD	* ,#_OSTCBFreeList
	.line	10
;>>>> 	        OS_EXIT_CRITICAL();
	clrc intm
	.line	11
;>>>> 	        ptcb->OSTCBStkPtr    = ptos;                       /* Load Stack pointer in TCB                */
	MAR	* ,AR2
	SBRK	5-LF15
	LAC	*+,AR3
	MAR	*-
	SACL	* ,AR2
	.line	12
;>>>> 	        ptcb->OSTCBPrio      = (INT8U)prio;                /* Load task priority into TCB              */
	LAC	* ,AR3
	ADRK	6
	SACL	*-
	.line	13
;>>>> 	        ptcb->OSTCBStat      = OS_STAT_RDY;                /* Task is ready to run                     */
	LACK	0
	SACL	*-
	.line	14
;>>>> 	        ptcb->OSTCBDly       = 0;                          /* Task is not delayed                      */
;>>>> 	#if OS_TASK_CREATE_EXT_EN        
;>>>> 	        ptcb->OSTCBExtPtr    = pext;                       /* Store pointer to TCB extension           */
;>>>> 	        ptcb->OSTCBStkSize   = stk_size;                   /* Store stack size                         */
;>>>> 	        ptcb->OSTCBStkBottom = pbos;                       /* Store pointer to bottom of stack         */
;>>>> 	        ptcb->OSTCBOpt       = opt;                        /* Store task options                       */
;>>>> 	        ptcb->OSTCBId        = id;                         /* Store task ID                            */
;>>>> 	#else
	SACL	* ,AR2
	.line	23
;>>>> 	        pext                 = pext;                       /* Prevent compiler warning if not used     */
	.line	24
;>>>> 	        stk_size             = stk_size;
	.line	25
;>>>> 	        pbos                 = pbos;
	.line	26
;>>>> 	        opt                  = opt;
	.line	27
;>>>> 	        id                   = id;
;>>>> 	#endif
;>>>> 	#if OS_TASK_DEL_EN        
;>>>> 	        ptcb->OSTCBDelReq    = OS_NO_ERR;
;>>>> 	#endif
	.line	34
;>>>> 	        ptcb->OSTCBY         = prio >> 3;                  /* Pre-compute X, Y, BitX and BitY          */
	RSXM
	LAC	* ,12,AR3
	ADRK	4
	SACH	* ,1
	.line	35
;>>>> 	        ptcb->OSTCBBitY      = OSMapTbl[ptcb->OSTCBY];
	LAC	* ,AR0
	ADLK	_OSMapTbl+0,0
	SACL	* 
	LAR	AR4,* ,AR4
	LAC	* ,AR3
	ADRK	2
	SACL	* ,AR2
	.line	36
;>>>> 	        ptcb->OSTCBX         = prio & 0x07;
	LACK	7
	AND	* ,AR3
	SBRK	3
	SACL	* 
	.line	37
;>>>> 	        ptcb->OSTCBBitX      = OSMapTbl[ptcb->OSTCBX];
;>>>> 	#if     OS_MBOX_EN || (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_SEM_EN
	LAC	* ,AR0
	ADLK	_OSMapTbl+0,0
	SACL	* 
	LAR	AR4,* ,AR4
	LAC	* ,AR3
	ADRK	2
	SACL	* 
	.line	40
;>>>> 	        ptcb->OSTCBEventPtr  = (OS_EVENT *)0;              /* Task is not pending on an event          */
;>>>> 	#endif
;>>>> 	#if     OS_MBOX_EN || (OS_Q_EN && (OS_MAX_QS >= 2))
;>>>> 	        ptcb->OSTCBMsg       = (void *)0;                  /* No message received                      */
;>>>> 	#endif
	LACK	0
	SBRK	6
	SACL	* 
	.line	47
;>>>> 	        OS_ENTER_CRITICAL();
	setc intm
	.line	48
;>>>> 	        OSTCBPrioTbl[prio]   = ptcb;
	MAR	* ,AR2
	LAC	* ,AR0
	ADLK	_OSTCBPrioTbl+0,0
	SACL	* 
	LAR	AR4,* ,AR3
	SBRK	3
	MAR	* ,AR4
	SAR	AR3,* ,AR3
	.line	49
;>>>> 	        ptcb->OSTCBNext      = OSTCBList;                  /* Link into TCB chain                      */
	MAR	*+
	BLKD	#_OSTCBList,*+
	.line	50
;>>>> 	        ptcb->OSTCBPrev      = (OS_TCB *)0;
	LACK	0
	SACL	* 
	.line	51
;>>>> 	        if (OSTCBList != (OS_TCB *)0) {
	LDPK	_OSTCBList
	LAC	_OSTCBList
	BZ	L36
	.line	52
;>>>> 	            OSTCBList->OSTCBPrev = ptcb;
	LAR	AR4,_OSTCBList
	SBRK	2
	MAR	* ,AR4
	ADRK	2
	SAR	AR3,* 
L36:
	.line	54
;>>>> 	        OSTCBList               = ptcb;
	MAR	* ,AR2
	ADRK	4-LF15
	BLDD	* ,#_OSTCBList
	.line	55
;>>>> 	        OSRdyGrp               |= ptcb->OSTCBBitY;         /* Make task ready to run                   */
	LAR	AR3,* ,AR3
	LAC	_OSRdyGrp
	ADRK	10
	OR	* ,AR2
	SACL	_OSRdyGrp
	.line	56
;>>>> 	        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
	LAR	AR4,* ,AR4
	ADRK	8
	LAC	* ,AR0
	ADLK	_OSRdyTbl+0,0
	SACL	* 
	LAR	AR5,* ,AR5
	LAC	* ,AR3
	MAR	*-
	OR	* ,AR5
	SACL	* 
	.line	57
;>>>> 	        OS_EXIT_CRITICAL();
	clrc intm
	.line	58
;>>>> 	        return (OS_NO_ERR);
;>>>> 	    } else {
	LACK	0
	B	EPI0_15
L35:
	.line	60
;>>>> 	        OS_EXIT_CRITICAL();
	clrc intm
	.line	61
;>>>> 	        return (OS_NO_MORE_TCB);
	LACK	70
EPI0_15:
	.line	63
	MAR	* ,AR1
	SBRK	3
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	772,000000000H,2

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

	.func	788
;>>>> 	void OSTimeTick (void)
;>>>> 	    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	6
;>>>> 	    OSTimeTickHook();                                      /* Call user definable hook                 */
	CALL	_OSTimeTickHook
	.line	7
;>>>> 	    ptcb = OSTCBList;                                      /* Point at first TCB in TCB list           */
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	BLKD	#_OSTCBList,* 
	.line	8
;>>>> 	    while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {              /* Go through all TCBs in TCB list          */
	LAR	AR3,* ,AR3
	ADRK	6
	LAC	* 
	SUBK	3
	BZ	L38
	MAR	* ,AR2
L37:
	.line	9
;>>>> 	        OS_ENTER_CRITICAL();
	setc intm
	.line	10
;>>>> 	        if (ptcb->OSTCBDly != 0) {                         /* Delayed or waiting for event with TO     */
	LAR	AR3,* ,AR3
	ADRK	4
	LAC	* 
	BZ	L39
	.line	11
;>>>> 	            if (--ptcb->OSTCBDly == 0) {                   /* Decrement nbr of ticks to end of delay   */
	ZALS	* 
	SUBK	1
	SACL	* 
	ANDK	0FFFFh
	BNZ	L39
	.line	12
;>>>> 	                if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {    /* Is task suspended?                   */
	MAR	*+
	BIT	* ,12
	BBNZ	L41
	.line	13
;>>>> 	                    OSRdyGrp               |= ptcb->OSTCBBitY; /* No,  Make task Rdy to Run (timed out)*/
	LDPK	_OSRdyGrp
	LAC	_OSRdyGrp
	ADRK	5
	OR	* ,AR2
	SACL	_OSRdyGrp
	.line	14
;>>>> 	                    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	L39
L41:
	.line	16
;>>>> 	                    ptcb->OSTCBDly = 1;                        /* ... loosing the task when the ...    */
	LACK	1
	MAR	*-
	SACL	* 
L39:
	.line	20
;>>>> 	        ptcb = ptcb->OSTCBNext;                            /* Point at next TCB in TCB list            */
	MAR	* ,AR2
	LAR	AR3,* ,AR3
	MAR	*+
	LAC	* ,AR2
	SACL	* 
	.line	21
;>>>> 	        OS_EXIT_CRITICAL();
	clrc intm
	.line	8
	LAR	AR3,* ,AR3
	ADRK	6
	LAC	* ,AR2
	SUBK	3
	BNZ	L37
L38:
	.line	23
;>>>> 	    OS_ENTER_CRITICAL();                                   /* Update the 32-bit tick counter           */
	setc intm
	.line	24
;>>>> 	    OSTime++;
	LDPK	_OSTime
	ZALS	_OSTime
	ADDH	_OSTime+1
	ADDK	1
	SACL	_OSTime
	SACH	_OSTime+1
	.line	25
;>>>> 	    OS_EXIT_CRITICAL();
	clrc intm
EPI0_16:
	.line	26
	MAR	* ,AR1
	SBRK	3
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	813,000000000H,2

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

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

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

	.endfunc	832,000000000H,1
	.file	"os_sem.c"

	.sym	_OSSemAccept,_OSSemAccept,46,2,0
	.globl	_OSSemAccept

	.func	39
;>>>> 	INT16U OSSemAccept (OS_EVENT *pevent)
******************************************************
* FUNCTION DEF : _OSSemAccept
******************************************************
_OSSemAccept:

LF18	.set	0

	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,2
	LAR	AR0,*0+

	.sym	_pevent,-3+LF18,24,9,16,.fake0
	.sym	_cnt,1,14,1,16
	.line	2
;>>>> 	    INT16U cnt;
	.line	6
;>>>> 	    OS_ENTER_CRITICAL();
	setc intm
	.line	7
;>>>> 	    if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
	MAR	* ,AR2
	LARK	AR2,-3+LF18
	MAR	*0+
	LAR	AR3,* ,AR3
	ADRK	3
	LAC	* 
	SUBK	3
	BZ	L43
	.line	8
;>>>> 	        OS_EXIT_CRITICAL();
	clrc intm
	.line	9
;>>>> 	        return (0);
	LACK	0
	B	EPI0_18
L43:
	.line	11
;>>>> 	    cnt = pevent->OSEventCnt;
	MAR	*-
	LAC	* ,AR2
	ADRK	4-LF18
	SACL	* 
	.line	12
;>>>> 	    if (cnt > 0) {                                    /* See if resource is available                  */
	LAC	* 
	BZ	L44
	.line	13
;>>>> 	        pevent->OSEventCnt--;                         /* Yes, decrement semaphore and notify caller    */
	MAR	* ,AR3
	LAC	* 
	SUBK	1
	SACL	* 
L44:
	.line	15
;>>>> 	    OS_EXIT_CRITICAL();
	clrc intm
	.line	16
;>>>> 	    return (cnt);                                     /* Return semaphore count                        */
	MAR	* ,AR2
	ZALS	* 
EPI0_18:
	.line	17
	MAR	* ,AR1
	SBRK	3
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	55,000000000H,2

	.sym	_OSSemCreate,_OSSemCreate,104,2,0,.fake0
	.globl	_OSSemCreate

	.func	75
;>>>> 	OS_EVENT *OSSemCreate (INT16U cnt)
******************************************************
* FUNCTION DEF : _OSSemCreate
******************************************************
_OSSemCreate:

LF19	.set	0

	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,2
	LAR	AR0,*0+

	.sym	_cnt,-3+LF19,14,9,16
	.sym	_pevent,1,24,1,16,.fake0
	.line	2
;>>>> 	    OS_EVENT *pevent;
	.line	6
;>>>> 	    OS_ENTER_CRITICAL();
	setc intm
	.line	7
;>>>> 	    pevent = OSEventFreeList;                              /* Get next free event control block        */
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	BLKD	#_OSEventFreeList,* 
	.line	8
;>>>> 	    if (OSEventFreeList != (OS_EVENT *)0) {                /* See if pool of free ECB pool was empty   */
	LDPK	_OSEventFreeList
	LAC	_OSEventFreeList
	BZ	L45
	.line	9
;>>>> 	        OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
	LAR	AR3,_OSEventFreeList
	MAR	* ,AR3
	BLDD	* ,#_OSEventFreeList
L45:
	.line	11
;>>>> 	    OS_EXIT_CRITICAL();
	clrc intm
	.line	12
;>>>> 	    if (pevent != (OS_EVENT *)0) {                         /* Get an event control block               */
	MAR	* ,AR2
	LAC	* 
	BZ	L46
	.line	13
;>>>> 	        pevent->OSEventType = OS_EVENT_TYPE_SEM;
	LAR	AR3,* ,AR3
	LACK	3
	ADRK	3
	SACL	* ,AR2
	.line	14
;>>>> 	        pevent->OSEventCnt  = cnt;                         /* Set semaphore value                      */
	SBRK	4-LF19
	LAC	* ,AR3
	MAR	*-
	SACL	* 
	.line	15
;>>>> 	        OSEventWaitListInit(pevent);
	SBRK	2
	MAR	* ,AR1
	SAR	AR3,*+
	CALL	_OSEventWaitListInit
	MAR	*-
L46:
	.line	17
;>>>> 	    return (pevent);
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	ZALS	* 
EPI0_19:
	.line	18
	MAR	* ,AR1
	SBRK	3
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	92,000000000H,2

	.sym	_OSSemPend,_OSSemPend,32,2,0
	.globl	_OSSemPend

	.func	124
;>>>> 	void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
******************************************************
* FUNCTION DEF : _OSSemPend
******************************************************
_OSSemPend:

LF20	.set	0

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

	.sym	_pevent,-3+LF20,24,9,16,.fake0
	.sym	_timeout,-4+LF20,14,9,16
	.sym	_err,-5+LF20,28,9,16
	.line	2
	.line	3
;>>>> 	    OS_ENTER_CRITICAL();
	setc intm
	.line	4
;>>>> 	    if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
	MAR	* ,AR2
	LARK	AR2,-3+LF20
	MAR	*0+
	LAR	AR3,* ,AR3
	ADRK	3
	LAC	* 
	SUBK	3
	BZ	L47
	.line	5
;>>>> 	        OS_EXIT_CRITICAL();
	clrc intm
	.line	6
;>>>> 	        *err = OS_ERR_EVENT_TYPE;
	MAR	* ,AR2
	SBRK	2
	LAR	AR4,* ,AR4
	LACK	1
	SACL	* 
L47:
	.line	8
;>>>> 	    if (pevent->OSEventCnt > 0) {                     /* If sem. is positive, resource available ...   */
	MAR	* ,AR3
	MAR	*-
	LAC	* 
	BZ	L48
	.line	9
;>>>> 	        pevent->OSEventCnt--;                         /* ... decrement semaphore only if positive.     */
	LAC	* 
	SUBK	1
	SACL	* 
	.line	10
;>>>> 	        OS_EXIT_CRITICAL();
	clrc intm
	.line	11
;>>>> 	        *err = OS_NO_ERR;
	MAR	* ,AR2
	LARK	AR2,-5+LF20
	MAR	*0+
	LAR	AR4,* ,AR4
	LACK	0
	SACL	* 
	B	L49
L48:
	.line	12
;>>>> 	    } else if (OSIntNesting > 0) {                    /* See if called from ISR ...                    */
	LDPK	_OSIntNesting
	LAC	_OSIntNesting
	BZ	L50
	.line	13
;>>>> 	        OS_EXIT_CRITICAL();                           /* ... can't PEND from an ISR                    */
	clrc intm
	.line	14
;>>>> 	        *err = OS_ERR_PEND_ISR;
;>>>> 	    } else {                                          /* Otherwise, must wait until event occurs       */
	MAR	* ,AR2
	LARK	AR2,-5+LF20
	MAR	*0+
	LAR	AR4,* ,AR4

⌨️ 快捷键说明

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