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

📄 os_task.lis

📁 把UCOSII移植到AVR MEGA8上的程序 应用程序为驱动1602显示器,虽说有些简单,但可测试UCOS的运行
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module OS_TASK.c
                        .area text(rom, con, rel)
 0000                   .dbfile F:\AVRPRA~1\ucosii-port2-mega8\OS_TASK.c
 0000                   .dbfunc e OSTaskChangePrio _OSTaskChangePrio fc
 0000                   .dbstruct 0 9 .1
 0000                   .dbfield 0 OSEventType c
 0000                   .dbfield 1 OSEventGrp c
 0000                   .dbfield 2 OSEventCnt i
 0000                   .dbfield 4 OSEventPtr pV
 0000                   .dbfield 6 OSEventTbl A[3:3]c
 0000                   .dbend
 0000                   .dbstruct 0 16 os_tcb
 0000                   .dbfield 0 OSTCBStkPtr pc
 0000                   .dbfield 2 OSTCBNext pS[os_tcb]
 0000                   .dbfield 4 OSTCBPrev pS[os_tcb]
 0000                   .dbfield 6 OSTCBEventPtr pS[.1]
 0000                   .dbfield 8 OSTCBDly i
 0000                   .dbfield 10 OSTCBStat c
 0000                   .dbfield 11 OSTCBPrio c
 0000                   .dbfield 12 OSTCBX c
 0000                   .dbfield 13 OSTCBY c
 0000                   .dbfield 14 OSTCBBitX c
 0000                   .dbfield 15 OSTCBBitY c
 0000                   .dbend
 0000           ;         pevent -> R20,R21
 0000           ;           bity -> R14
 0000           ;           bitx -> R10
 0000           ;              x -> R22
 0000           ;              y -> y+1
 0000           ;         cpu_sr -> y+0
 0000           ;           ptcb -> R12,R13
 0000           ;        newprio -> y+12
 0000           ;        oldprio -> R20
                        .even
 0000           _OSTaskChangePrio::
 0000 3A93              st -y,r19
 0002 2A93              st -y,r18
 0004 00D0              rcall push_gset5
 0006 402F              mov R20,R16
 0008 2297              sbiw R28,2
 000A                   .dbline -1
 000A                   .dbline 43
 000A           ; /*
 000A           ; *********************************************************************************************************
 000A           ; *                                                uC/OS-II
 000A           ; *                                          The Real-Time Kernel
 000A           ; *                                            TASK MANAGEMENT
 000A           ; *
 000A           ; *                          (c) Copyright 1992-2001, Jean J. Labrosse, Weston, FL
 000A           ; *                                           All Rights Reserved
 000A           ; *
 000A           ; * File : OS_TASK.C
 000A           ; * By   : Jean J. Labrosse
 000A           ; *********************************************************************************************************
 000A           ; */
 000A           ; 
 000A           ; #include <string.h>
 000A           ; 
 000A           ; #ifndef  OS_MASTER_FILE
 000A           ; #include "includes.h"
 000A           ; #endif
 000A           ; 
 000A           ; /*
 000A           ; *********************************************************************************************************
 000A           ; *                                        CHANGE PRIORITY OF A TASK
 000A           ; *
 000A           ; * Description: This function allows you to change the priority of a task dynamically.  Note that the new
 000A           ; *              priority MUST be available.
 000A           ; *
 000A           ; * Arguments  : oldp     is the old priority
 000A           ; *
 000A           ; *              newp     is the new priority
 000A           ; *
 000A           ; * Returns    : OS_NO_ERR        is the call was successful
 000A           ; *              OS_PRIO_INVALID  if the priority you specify is higher that the maximum allowed
 000A           ; *                               (i.e. >= OS_LOWEST_PRIO)
 000A           ; *              OS_PRIO_EXIST    if the new priority already exist.
 000A           ; *              OS_PRIO_ERR      there is no task with the specified OLD priority (i.e. the OLD task does
 000A           ; *                               not exist.
 000A           ; *********************************************************************************************************
 000A           ; */
 000A           ; 
 000A           ; #if OS_TASK_CHANGE_PRIO_EN > 0
 000A           ; INT8U  OSTaskChangePrio (INT8U oldprio, INT8U newprio)
 000A           ; {
 000A                   .dbline 66
 000A           ; #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
 000A           ;     OS_CPU_SR    cpu_sr;
 000A           ; #endif
 000A           ; 
 000A           ; #if OS_EVENT_EN > 0
 000A           ;     OS_EVENT    *pevent;
 000A           ; #endif
 000A           ; 
 000A           ;     OS_TCB      *ptcb;
 000A           ;     INT8U        x;
 000A           ;     INT8U        y;
 000A           ;     INT8U        bitx;
 000A           ;     INT8U        bity;
 000A           ; 
 000A           ; 
 000A           ; 
 000A           ; #if OS_ARG_CHK_EN > 0
 000A           ;     if ((oldprio >= OS_LOWEST_PRIO && oldprio != OS_PRIO_SELF)  ||
 000A           ;          newprio >= OS_LOWEST_PRIO) {
 000A           ;         return (OS_PRIO_INVALID);
 000A           ;     }
 000A           ; #endif
 000A           ;     OS_ENTER_CRITICAL();
 000A 00D0              rcall _OS_CPU_SR_Save
 000C 0883              std y+0,R16
 000E                   .dbline 67
 000E           ;     if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) {                 /* New priority must not already exist */
 000E 82E0              ldi R24,2
 0010 0C84              ldd R0,y+12
 0012 809D              mul R24,R0
 0014 F001              movw R30,R0
 0016 80E0              ldi R24,<_OSTCBPrioTbl
 0018 90E0              ldi R25,>_OSTCBPrioTbl
 001A E80F              add R30,R24
 001C F91F              adc R31,R25
 001E 2080              ldd R2,z+0
 0020 3180              ldd R3,z+1
 0022 2220              tst R2
 0024 11F4              brne X0
 0026 3320              tst R3
 0028 21F0              breq L4
 002A           X0:
 002A                   .dbline 67
 002A                   .dbline 68
 002A           ;         OS_EXIT_CRITICAL();
 002A 0881              ldd R16,y+0
 002C 00D0              rcall _OS_CPU_SR_Restore
 002E                   .dbline 69
 002E           ;         return (OS_PRIO_EXIST);
 002E 08E2              ldi R16,40
 0030 D4C0              rjmp L3
 0032           L4:
 0032                   .dbline 70
 0032           ;     } else {
 0032                   .dbline 71
 0032           ;         OSTCBPrioTbl[newprio] = (OS_TCB *)1;                    /* Reserve the entry to prevent others */
 0032 82E0              ldi R24,2
 0034 0C84              ldd R0,y+12
 0036 809D              mul R24,R0
 0038 F001              movw R30,R0
 003A 80E0              ldi R24,<_OSTCBPrioTbl
 003C 90E0              ldi R25,>_OSTCBPrioTbl
 003E E80F              add R30,R24
 0040 F91F              adc R31,R25
 0042 81E0              ldi R24,1
 0044 90E0              ldi R25,0
 0046 9183              std z+1,R25
 0048 8083              std z+0,R24
 004A                   .dbline 72
 004A           ;         OS_EXIT_CRITICAL();
 004A 0881              ldd R16,y+0
 004C 00D0              rcall _OS_CPU_SR_Restore
 004E                   .dbline 73
 004E           ;         y    = newprio >> 3;                                    /* Precompute to reduce INT. latency   */
 004E 2C84              ldd R2,y+12
 0050 2694              lsr R2
 0052 2694              lsr R2
 0054 2694              lsr R2
 0056 2982              std y+1,R2
 0058                   .dbline 74
 0058           ;         bity = OSMapTbl[y];
 0058 80E0              ldi R24,<_OSMapTbl
 005A 90E0              ldi R25,>_OSMapTbl
 005C E22D              mov R30,R2
 005E FF27              clr R31
 0060 E80F              add R30,R24
 0062 F91F              adc R31,R25
 0064 E490              lpm R14,Z
 0066                   .dbline 75
 0066           ;         x    = newprio & 0x07;
 0066 6C85              ldd R22,y+12
 0068 6770              andi R22,7
 006A                   .dbline 76
 006A           ;         bitx = OSMapTbl[x];
 006A E62F              mov R30,R22
 006C FF27              clr R31
 006E E80F              add R30,R24
 0070 F91F              adc R31,R25
 0072 A490              lpm R10,Z
 0074                   .dbline 77
 0074           ;         OS_ENTER_CRITICAL();
 0074 00D0              rcall _OS_CPU_SR_Save
 0076 0883              std y+0,R16
 0078                   .dbline 78
 0078           ;         if (oldprio == OS_PRIO_SELF) {                          /* See if changing self                */
 0078 4F3F              cpi R20,255
 007A 29F4              brne L6
 007C                   .dbline 78
 007C                   .dbline 79
 007C           ;             oldprio = OSTCBCur->OSTCBPrio;                      /* Yes, get priority                   */
 007C E0910000          lds R30,_OSTCBCur
 0080 F0910100          lds R31,_OSTCBCur+1
 0084 4385              ldd R20,z+11
 0086                   .dbline 80
 0086           ;         }
 0086           L6:
 0086                   .dbline 81
 0086           ;         if ((ptcb = OSTCBPrioTbl[oldprio]) != (OS_TCB *)0) {    /* Task to change must exist           */
 0086 82E0              ldi R24,2
 0088 849F              mul R24,R20
 008A F001              movw R30,R0
 008C 80E0              ldi R24,<_OSTCBPrioTbl
 008E 90E0              ldi R25,>_OSTCBPrioTbl
 0090 E80F              add R30,R24
 0092 F91F              adc R31,R25
 0094 2080              ldd R2,z+0
 0096 3180              ldd R3,z+1
 0098 6101              movw R12,R2
 009A CC20              tst R12
 009C 19F4              brne X1
 009E DD20              tst R13
 00A0 09F4              brne X3
 00A2 8CC0              rjmp L8
 00A4           X3:
 00A4           X1:
 00A4                   .dbline 81
 00A4                   .dbline 82
 00A4           ;             OSTCBPrioTbl[oldprio] = (OS_TCB *)0;                /* Remove TCB from old priority        */
 00A4 82E0              ldi R24,2
 00A6 849F              mul R24,R20
 00A8 F001              movw R30,R0
 00AA 80E0              ldi R24,<_OSTCBPrioTbl
 00AC 90E0              ldi R25,>_OSTCBPrioTbl
 00AE E80F              add R30,R24
 00B0 F91F              adc R31,R25
 00B2 2224              clr R2
 00B4 3324              clr R3
 00B6 3182              std z+1,R3
 00B8 2082              std z+0,R2
 00BA                   .dbline 83

⌨️ 快捷键说明

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