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

📄 os_core.s

📁 将本站的UCOSFORAVR128V276版本升级到了280版
💻 S
📖 第 1 页 / 共 5 页
字号:
	movw R24,R14
	adiw R24,6
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R30,z+0
	clr R31
	ldi R24,<_OSUnMapTbl
	ldi R25,>_OSUnMapTbl
	add R30,R24
	adc R31,R25
	lpm R20,Z
	.dbline 665
;     bitx  = 1 << x;
	ldi R16,1
	mov R17,R20
	xcall lsl8
	mov R22,R16
	.dbline 666
;     prio  = (INT8U)((y << 3) + x);                      /* Find priority of task getting the msg       */
	mov R2,R20
	clr R3
	mov R20,R10
	clr R21
	lsl R20
	rol R21
	lsl R20
	rol R21
	lsl R20
	rol R21
	add R20,R2
	adc R21,R3
	.dbline 684
; #else
;     if ((pevent->OSEventGrp & 0xFF) != 0) {             /* Find HPT waiting for message                */
;         y = OSUnMapTbl[pevent->OSEventGrp & 0xFF];
;     } else {
;         y = OSUnMapTbl[(pevent->OSEventGrp >> 8) & 0xFF] + 8;
;     }
;     bity = 1 << y;
;     ptbl = &pevent->OSEventTbl[y];
;     if ((*ptbl & 0xFF) != 0) {
;         x = OSUnMapTbl[*ptbl & 0xFF];
;     } else {
;         x = OSUnMapTbl[(*ptbl >> 8) & 0xFF] + 8;
;     }
;     bitx = 1 << x;
;     prio = (INT8U)((y << 4) + x);                       /* Find priority of task getting the msg       */
; #endif
; 
;     pevent->OSEventTbl[y] &= ~bitx;                     /* Remove this task from the waiting list      */
	movw R24,R14
	adiw R24,6
	mov R2,R10
	clr R3
	add R2,R24
	adc R3,R25
	mov R4,R22
	com R4
	movw R30,R2
	ldd R5,z+0
	and R5,R4
	std z+0,R5
	.dbline 685
;     if (pevent->OSEventTbl[y] == 0) {
	movw R24,R14
	adiw R24,6
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	tst R2
	brne L60
	.dbline 685
	.dbline 686
;         pevent->OSEventGrp &= ~bity;                    /* Clr group bit if this was only task pending */
	movw R24,R14
	adiw R24,5
	mov R4,R12
	com R4
	movw R30,R24
	ldd R5,z+0
	and R5,R4
	std z+0,R5
	.dbline 687
;     }
L60:
	.dbline 688
;     ptcb                 =  OSTCBPrioTbl[prio];         /* Point to this task's OS_TCB                 */
	ldi R24,2
	mul R24,R20
	movw R30,R0
	ldi R24,<_OSTCBPrioTbl
	ldi R25,>_OSTCBPrioTbl
	add R30,R24
	adc R31,R25
	ldd R14,z+0
	ldd R15,z+1
	.dbline 689
;     ptcb->OSTCBDly       =  0;                          /* Prevent OSTimeTick() from readying task     */
	clr R2
	clr R3
	movw R30,R14
	std z+9,R3
	std z+8,R2
	.dbline 690
;     ptcb->OSTCBEventPtr  = (OS_EVENT *)0;               /* Unlink ECB from this task                   */
	movw R30,R14
	std z+7,R3
	std z+6,R2
	.dbline 694
; #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
;     ptcb->OSTCBMsg       = msg;                         /* Send message directly to waiting task       */
; #else
;     msg                  = msg;                         /* Prevent compiler warning if not used        */
	.dbline 696
; #endif
;     ptcb->OSTCBPendTO    = FALSE;                       /* Cancel 'any' timeout because of post        */
	movw R30,R14
	std z+11,R2
	.dbline 697
;     ptcb->OSTCBStat     &= ~msk;                        /* Clear bit associated with event type        */
	movw R24,R14
	adiw R24,10
	ldd R4,y+10
	com R4
	movw R30,R24
	ldd R5,z+0
	and R5,R4
	std z+0,R5
	.dbline 698
;     if (ptcb->OSTCBStat == OS_STAT_RDY) {               /* See if task is ready (could be susp'd)      */
	movw R30,R14
	ldd R2,z+10
	tst R2
	brne L62
	.dbline 698
	.dbline 699
;         OSRdyGrp        |=  bity;                       /* Put task in the ready to run list           */
	lds R2,_OSRdyGrp
	or R2,R12
	sts _OSRdyGrp,R2
	.dbline 700
;         OSRdyTbl[y]     |=  bitx;
	ldi R24,<_OSRdyTbl
	ldi R25,>_OSRdyTbl
	mov R2,R10
	clr R3
	add R2,R24
	adc R3,R25
	movw R30,R2
	ldd R4,z+0
	or R4,R22
	std z+0,R4
	.dbline 701
;     }
L62:
	.dbline 702
;     return (prio);
	mov R16,R20
	.dbline -2
L59:
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r bity 12 c
	.dbsym r bitx 22 c
	.dbsym r prio 20 c
	.dbsym r x 20 c
	.dbsym r ptcb 14 pS[os_tcb]
	.dbsym r y 10 c
	.dbsym l msk 10 c
	.dbsym r msg 20 pV
	.dbsym r pevent 14 pS[os_event]
	.dbend
	.dbfunc e OS_EventTaskWait _OS_EventTaskWait fV
;              y -> R20
;         pevent -> R16,R17
	.even
_OS_EventTaskWait::
	xcall push_gset1
	.dbline -1
	.dbline 722
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                   MAKE TASK WAIT FOR EVENT TO OCCUR
; *
; * Description: This function is called by other uC/OS-II services to suspend a task because an event has
; *              not occurred.
; *
; * Arguments  : pevent   is a pointer to the event control block for which the task will be waiting for.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if OS_EVENT_EN
; void  OS_EventTaskWait (OS_EVENT *pevent)
; {
	.dbline 726
;     INT8U  y;
; 
; 
;     OSTCBCur->OSTCBEventPtr = pevent;             /* Store pointer to event control block in TCB       */
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	std z+7,R17
	std z+6,R16
	.dbline 727
;     y                       = OSTCBCur->OSTCBY;   /* Task no longer ready                              */
	ldd R20,z+14
	.dbline 728
;     OSRdyTbl[y]            &= ~OSTCBCur->OSTCBBitX;
	ldi R24,<_OSRdyTbl
	ldi R25,>_OSRdyTbl
	mov R2,R20
	clr R3
	add R2,R24
	adc R3,R25
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R4,z+15
	com R4
	movw R30,R2
	ldd R5,z+0
	and R5,R4
	std z+0,R5
	.dbline 729
;     if (OSRdyTbl[y] == 0) {
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	tst R2
	brne L65
	.dbline 729
	.dbline 730
;         OSRdyGrp &= ~OSTCBCur->OSTCBBitY;         /* Clear event grp bit if this was only task pending */
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R2,z+16
	com R2
	lds R3,_OSRdyGrp
	and R3,R2
	sts _OSRdyGrp,R3
	.dbline 731
;     }
L65:
	.dbline 732
;     pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;          /* Put task in waiting list  */
	movw R24,R16
	adiw R24,6
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R2,z+14
	clr R3
	add R2,R24
	adc R3,R25
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R4,z+15
	movw R30,R2
	ldd R5,z+0
	or R5,R4
	std z+0,R5
	.dbline 733
;     pevent->OSEventGrp                   |= OSTCBCur->OSTCBBitY;
	movw R24,R16
	adiw R24,5
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R4,z+16
	movw R30,R24
	ldd R5,z+0
	or R5,R4
	std z+0,R5
	.dbline -2
L64:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r y 20 c
	.dbsym r pevent 16 pS[os_event]
	.dbend
	.dbfunc e OS_EventTO _OS_EventTO fV
;              y -> R20
;         pevent -> R16,R17
	.even
_OS_EventTO::
	xcall push_gset1
	.dbline -1
	.dbline 753
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                              MAKE TASK READY TO RUN BASED ON EVENT TIMEOUT
; *
; * Description: This function is called by other uC/OS-II services to make a task ready to run because a
; *              timeout occurred.
; *
; * Arguments  : pevent   is a pointer to the event control block which is readying a task.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if OS_EVENT_EN
; void  OS_EventTO (OS_EVENT *pevent)
; {
	.dbline 757
;     INT8U  y;
; 
; 
;     y                      = OSTCBCur->OSTCBY;
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R20,z+14
	.dbline 758
;     pevent->OSEventTbl[y] &= ~OSTCBCur->OSTCBBitX;     /* Remove task from wait list                   */
	movw R24,R16
	adiw R24,6
	mov R2,R20
	clr R3
	add R2,R24
	adc R3,R25
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R4,z+15
	com R4
	movw R30,R2
	ldd R5,z+0
	and R5,R4
	std z+0,R5
	.dbline 759
;     if (pevent->OSEventTbl[y] == 0x00) {
	movw R24,R16
	adiw R24,6
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	tst R2
	brne L68
	.dbline 759
	.dbline 760
;         pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
	movw R24,R16
	adiw R24,5
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R4,z+16
	com R4
	movw R30,R24
	ldd R5,z+0
	and R5,R4
	std z+0,R5
	.dbline 761
;     }
L68:
	.dbline 762
;     OSTCBCur->OSTCBPendTO   = FALSE;                   /* Clear the Pend Timeout flag                  */
	clr R2
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	std z+11,R2
	.dbline 763
;     OSTCBCur->OSTCBStat     = OS_STAT_RDY;             /* Set status to ready                          */
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	std z+10,R2
	.dbline 764
;     OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;           /* No longer waiting for event                  */
	clr R3
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	std z+7,R3
	std z+6,R2
	.dbline -2
L67:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r y 20 c
	.dbsym r pevent 16 pS[os_event]
	.dbend
	.dbfunc e OS_EventWaitListInit _OS_EventWaitListInit fV
;           ptbl -> R20,R21
;              i -> R22
;         pevent -> R16,R17
	.even
_OS_EventWaitListInit::
	xcall push_gset2
	.dbline -1
	.dbline 783
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                 INITIALIZE EVENT CONTROL BLOCK'S WAIT LIST
; *
; * Description: This function is called by other uC/OS-II services to initialize the event wait list.
; *
; * Arguments  : pevent    is a pointer to the event control block allocated to the event.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if OS_EVENT_EN
; void  OS_EventWaitListInit (OS_EVENT *pevent)
; {
	.dbline 792
; #if OS_LOWEST_PRIO <= 63
;     INT8U  *ptbl;
; #else
;     INT16U *ptbl;
; #endif
;     INT8U   i;
; 
; 
;     pevent->OSEventGrp = 0;                      /* No task waiting on event                           */
	clr R2
	movw R30,R16
	std z+5,R2
	.dbline 793
;     ptbl               = &pevent->OSEventTbl[0];
	movw R20,R16
	subi R20,250  ; offset = 6
	sbci R21,255
	.dbline 795
	clr R22
	xjmp L74
L71:
	.dbline 795
	.dbline 796
	clr R2
	movw R30,R20
	st Z+,R2
	movw R20,R30
	.dbline 797
L72:
	.dbline 795
	inc R22
L74:
	.dbline 795

⌨️ 快捷键说明

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