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

📄 os_task.s

📁 ucos如何移植到单片机mega128
💻 S
📖 第 1 页 / 共 4 页
字号:
	.dbfield 2 OSTCBNext pS[os_tcb]
	.dbfield 4 OSTCBPrev pS[os_tcb]
	.dbfield 6 OSTCBFlagNode pS[.2]
	.dbfield 8 OSTCBFlagsRdy c
	.dbfield 9 OSTCBDly i
	.dbfield 11 OSTCBStat c
	.dbfield 12 OSTCBPrio c
	.dbfield 13 OSTCBX c
	.dbfield 14 OSTCBY c
	.dbfield 15 OSTCBBitX c
	.dbfield 16 OSTCBBitY c
	.dbfield 17 OSTCBDelReq c
	.dbend
;           self -> <dead>
;          pnode -> R10,R11
;           ptcb -> R20,R21
;           prio -> R22
	.even
_OSTaskDel::
	xcall push_gset3
	mov R22,R16
	.dbline -1
	.dbline 358
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                     CREATE A TASK (Extended Version)
; *
; * Description: This function is used to have uC/OS-II manage the execution of a task.  Tasks can either
; *              be created prior to the start of multitasking or by a running task.  A task cannot be
; *              created by an ISR.  This function is similar to OSTaskCreate() except that it allows
; *              additional information about a task to be specified.
; *
; * Arguments  : task     is a pointer to the task's code
; *
; *              pdata    is a pointer to an optional data area which can be used to pass parameters to
; *                       the task when the task first executes.  Where the task is concerned it thinks
; *                       it was invoked and passed the argument 'pdata' as follows:
; *
; *                           void Task (void *pdata)
; *                           {
; *                               for (;;) {
; *                                   Task code;
; *                               }
; *                           }
; *
; *              ptos     is a pointer to the task's top of stack.  If the configuration constant
; *                       OS_STK_GROWTH is set to 1, the stack is assumed to grow downward (i.e. from high
; *                       memory to low memory).  'pstk' will thus point to the highest (valid) memory
; *                       location of the stack.  If OS_STK_GROWTH is set to 0, 'pstk' will point to the
; *                       lowest memory location of the stack and the stack will grow with increasing
; *                       memory locations.  'pstk' MUST point to a valid 'free' data item.
; *
; *              prio     is the task's priority.  A unique priority MUST be assigned to each task and the
; *                       lower the number, the higher the priority.
; *
; *              id       is the task's ID (0..65535)
; *
; *              pbos     is a pointer to the task's bottom of stack.  If the configuration constant
; *                       OS_STK_GROWTH is set to 1, the stack is assumed to grow downward (i.e. from high
; *                       memory to low memory).  'pbos' will thus point to the LOWEST (valid) memory
; *                       location of the stack.  If OS_STK_GROWTH is set to 0, 'pbos' will point to the
; *                       HIGHEST memory location of the stack and the stack will grow with increasing
; *                       memory locations.  'pbos' MUST point to a valid 'free' data item.
; *
; *              stk_size is the size of the stack in number of elements.  If OS_STK is set to INT8U,
; *                       'stk_size' corresponds to the number of bytes available.  If OS_STK is set to
; *                       INT16U, 'stk_size' contains the number of 16-bit entries available.  Finally, if
; *                       OS_STK is set to INT32U, 'stk_size' contains the number of 32-bit entries
; *                       available on the stack.
; *
; *              pext     is a pointer to a user supplied memory location which is used as a TCB extension.
; *                       For example, this user memory can hold the contents of floating-point registers
; *                       during a context switch, the time each task takes to execute, the number of times
; *                       the task has been switched-in, etc.
; *
; *              opt      contains additional information (or options) about the behavior of the task.  The
; *                       LOWER 8-bits are reserved by uC/OS-II while the upper 8 bits can be application
; *                       specific.  See OS_TASK_OPT_??? in uCOS-II.H.
; *
; * Returns    : OS_NO_ERR        if the function was successful.
; *              OS_PRIO_EXIT     if the task priority already exist
; *                               (each task MUST have a unique priority).
; *              OS_PRIO_INVALID  if the priority you specify is higher that the maximum allowed
; *                               (i.e. > OS_LOWEST_PRIO)
; *********************************************************************************************************
; */
; /*$PAGE*/
; #if OS_TASK_CREATE_EXT_EN > 0
; INT8U  OSTaskCreateExt (void   (*task)(void *pd),
;                         void    *pdata,
;                         OS_STK  *ptos,
;                         INT8U    prio,
;                         INT16U   id,
;                         OS_STK  *pbos,
;                         INT32U   stk_size,
;                         void    *pext,
;                         INT16U   opt)
; {
; #if OS_CRITICAL_METHOD == 3                  /* Allocate storage for CPU status register               */
;     OS_CPU_SR  cpu_sr;
; #endif
;     OS_STK    *psp;
;     INT8U      err;
; 
; 
; #if OS_ARG_CHK_EN > 0
;     if (prio > OS_LOWEST_PRIO) {             /* Make sure priority is within allowable range           */
;         return (OS_PRIO_INVALID);
;     }
; #endif
;     OS_ENTER_CRITICAL();
;     if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority  */
;         OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* Reserve the priority to prevent others from doing ...  */
;                                              /* ... the same thing until task is created.              */
;         OS_EXIT_CRITICAL();
; 
;         if (((opt & OS_TASK_OPT_STK_CHK) != 0x0000) ||   /* See if stack checking has been enabled     */
;             ((opt & OS_TASK_OPT_STK_CLR) != 0x0000)) {   /* See if stack needs to be cleared           */
;             #if OS_STK_GROWTH == 1
;             (void)memset(pbos, 0, stk_size * sizeof(OS_STK));
;             #else
;             (void)memset(ptos, 0, stk_size * sizeof(OS_STK));
;             #endif
;         }
; 
;         psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, opt); /* Initialize the task's stack          */
;         err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);
;         if (err == OS_NO_ERR) {
;             OS_ENTER_CRITICAL();
;             OSTaskCtr++;                                       /* Increment the #tasks counter         */
;             OS_EXIT_CRITICAL();
;             if (OSRunning == TRUE) {                           /* Find HPT if multitasking has started */
;                 OS_Sched();
;             }
;         } else {
;             OS_ENTER_CRITICAL();
;             OSTCBPrioTbl[prio] = (OS_TCB *)0;                  /* Make this priority avail. to others  */
;             OS_EXIT_CRITICAL();
;         }
;         return (err);
;     }
;     OS_EXIT_CRITICAL();
;     return (OS_PRIO_EXIST);
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                            DELETE A TASK
; *
; * Description: This function allows you to delete a task.  The calling task can delete itself by
; *              its own priority number.  The deleted task is returned to the dormant state and can be
; *              re-activated by creating the deleted task again.
; *
; * Arguments  : prio    is the priority of the task to delete.  Note that you can explicitely delete
; *                      the current task without knowing its priority level by setting 'prio' to
; *                      OS_PRIO_SELF.
; *
; * Returns    : OS_NO_ERR           if the call is successful
; *              OS_TASK_DEL_IDLE    if you attempted to delete uC/OS-II's idle task
; *              OS_PRIO_INVALID     if the priority you specify is higher that the maximum allowed
; *                                  (i.e. >= OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.
; *              OS_TASK_DEL_ERR     if the task you want to delete does not exist
; *              OS_TASK_DEL_ISR     if you tried to delete a task from an ISR
; *
; * Notes      : 1) To reduce interrupt latency, OSTaskDel() 'disables' the task:
; *                    a) by making it not ready
; *                    b) by removing it from any wait lists
; *                    c) by preventing OSTimeTick() from making the task ready to run.
; *                 The task can then be 'unlinked' from the miscellaneous structures in uC/OS-II.
; *              2) The function OS_Dummy() is called after OS_EXIT_CRITICAL() because, on most processors,
; *                 the next instruction following the enable interrupt instruction is ignored.  
; *              3) An ISR cannot delete a task.
; *              4) The lock nesting counter is incremented because, for a brief instant, if the current
; *                 task is being deleted, the current task would not be able to be rescheduled because it
; *                 is removed from the ready list.  Incrementing the nesting counter prevents another task
; *                 from being schedule.  This means that an ISR would return to the current task which is
; *                 being deleted.  The rest of the deletion would thus be able to be completed.
; *********************************************************************************************************
; */
; /*$PAGE*/
; #if OS_TASK_DEL_EN > 0
; INT8U  OSTaskDel (INT8U prio)
; {
	.dbline 374
; #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;     OS_CPU_SR     cpu_sr;
; #endif
; 
; #if OS_EVENT_EN > 0
;     OS_EVENT     *pevent;
; #endif    
; #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;     OS_FLAG_NODE *pnode;
; #endif
;     OS_TCB       *ptcb;
;     BOOLEAN       self;
; 
; 
; 
;     if (OSIntNesting > 0) {                                     /* See if trying to delete from ISR    */
	clr R2
	lds R3,_OSIntNesting
	cp R2,R3
	brsh L13
	.dbline 374
	.dbline 375
;         return (OS_TASK_DEL_ISR);
	ldi R16,63
	xjmp L12
L13:
	.dbline 378
;     }
; #if OS_ARG_CHK_EN > 0
;     if (prio == OS_IDLE_PRIO) {                                 /* Not allowed to delete idle task     */
	cpi R22,20
	brne L15
	.dbline 378
	.dbline 379
;         return (OS_TASK_DEL_IDLE);
	ldi R16,61
	xjmp L12
L15:
	.dbline 381
;     }
;     if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {       /* Task priority valid ?               */
	cpi R22,20
	brlo L17
	cpi R22,255
	breq L17
	.dbline 381
	.dbline 382
;         return (OS_PRIO_INVALID);
	ldi R16,42
	xjmp L12
L17:
	.dbline 385
;     }
; #endif
;     OS_ENTER_CRITICAL();
	st -y,r16
	in r16,0x3F
	cli
	push r16
	ld r16,y+
	.dbline 385
	.dbline 386
;     if (prio == OS_PRIO_SELF) {                                 /* See if requesting to delete self    */
	cpi R22,255
	brne L19
	.dbline 386
	.dbline 387
;         prio = OSTCBCur->OSTCBPrio;                             /* Set priority to delete to current   */
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R22,z+12
	.dbline 388
;     }
L19:
	.dbline 389
;     ptcb = OSTCBPrioTbl[prio];
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_OSTCBPrioTbl
	ldi R25,>_OSTCBPrioTbl
	add R30,R24
	adc R31,R25
	ldd R20,z+0
	ldd R21,z+1
	.dbline 390
;     if (ptcb != (OS_TCB *)0) {                                       /* Task to delete must exist      */
	cpi R20,0
	cpc R20,R21
	brne X6
	xjmp L21
X6:
X3:
	.dbline 390
	.dbline 391
;         if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) {  /* Make task not ready            */
	ldi R24,<_OSRdyTbl
	ldi R25,>_OSRdyTbl
	movw R30,R20
	ldd R2,z+14
	clr R3
	add R2,R24
	adc R3,R25
	movw R30,R20
	ldd R4,z+15
	com R4
	movw R30,R2
	ldd R5,z+0
	and R5,R4
	mov R4,R5
	std z+0,R4
	tst R5
	brne L23
	.dbline 391
	.dbline 392
;             OSRdyGrp &= ~ptcb->OSTCBBitY;
	movw R30,R20
	ldd R2,z+16
	com R2
	lds R3,_OSRdyGrp
	and R3,R2
	sts _OSRdyGrp,R3
	.dbline 393
;         }
L23:
	.dbline 403
; #if OS_EVENT_EN > 0
;         pevent = ptcb->OSTCBEventPtr;
;         if (pevent != (OS_EVENT *)0) {                          /* If task is waiting on event         */
;             if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { /* ... remove task from */
;                 pevent->OSEventGrp &= ~ptcb->OSTCBBitY;                        /* ... event ctrl block */
;             }
;         }
; #endif
; #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;         pnode = ptcb->OSTCBFlagNode;
	movw R30,R20
	ldd R10,z+6
	ldd R11,z+7
	.dbline 404
;         if (pnode != (OS_FLAG_NODE *)0) {                       /* If task is waiting on event flag    */
	tst R10
	brne X4
	tst R11
	breq L25
X4:
	.dbline 404
	.dbline 405
;             OS_FlagUnlink(pnode);                               /* Remove from wait list               */
	movw R16,R10
	xcall _OS_FlagUnlink
	.dbline 406
;         }
L25:
	.dbline 408
; #endif
;         ptcb->OSTCBDly  = 0;                                    /* Prevent OSTimeTick() from updating  */
	clr R2
	clr R3
	movw R30,R20
	std z+10,R3
	std z+9,R2
	.dbline 409
;         ptcb->OSTCBStat = OS_STAT_RDY;                          /* Prevent task from being resumed     */
	movw R30,R20
	std z+11,R2
	.dbline 410
; 		if (OSLockNesting < 255) {
	lds R24,_OSLockNesting
	cpi R24,255
	brsh L27
	.dbline 410
	.dbline 411
;             OSLockNesting++;
	subi R24,255    ; addi 1
	sts _OSLockNesting,R24
	.dbline 412
; 		}
L27:
	.dbline 413
;         OS_EXIT_CRITICAL();                                     /* Enabling INT. ignores next instruc. */
	st -y,r16
	pop r16
	out 0x3F,r16
	ld r16,y+
	.dbline 413
	.dbline 414
;         OS_Dummy();                                             /* ... Dummy ensures that INTs will be */
	xcall _OS_Dummy
	.dbline 415
;         OS_ENTER_CRITICAL();                                    /* ... disabled HERE!                  */
	st -y,r16
	in r16,0x3F
	cli
	push r16
	ld r16,y+
	.dbline 415
	.dbline 416
; 		if (OSLockNesting > 0) {
	clr R2
	lds R3,_OSLockNesting
	cp R2,R3
	brsh L29
	.dbline 416
	.dbline 417
;             OSLockNesting--;
	mov R24,R3
	subi R24,1
	sts _OSLockNesting,R24
	.dbline 418
; 		}

⌨️ 快捷键说明

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