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

📄 kernel.lis

📁 AVR单片机 C语言程序设计经典实用
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module Kernel.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\Steaven2000\AVR\AVR_Book\PROGRA~1\SOURCE~1\Code\LCD菜单系统设计\Kernel.c
 0000                   .dbfunc e OS_Event_Pend _OS_Event_Pend fi
 0000           ;     wTaskEvent -> R20,R21
 0000           ;      bTaskPrio -> R16
                        .even
 0000           _OS_Event_Pend::
 0000 0E940000          xcall push_gset1
 0004                   .dbline -1
 0004                   .dbline 29
 0004           ; //******************************************************************************
 0004           ; // File Name : Kernel.c
 0004           ; // Author    : Steaven
 0004           ; // Created   : 2008-06-09
 0004           ; // Modified  : 
 0004           ; // Revision  : V0.0
 0004           ; //******************************************************************************
 0004           ; 
 0004           ; #include "app.h"
 0004           ; 
 0004           ; //Task Control Block structure
 0004           ; typedef struct
 0004           ; {
 0004           ;       INT16U wTimerPeriod;
 0004           ;       INT16U wTimerCount;
 0004           ;       INT16U wEvent;
 0004           ; }OS_TCB;
 0004           ; 
 0004           ; //structure array definition
 0004           ; OS_TCB OSTCB[cMaxTask];
 0004           ; 
 0004           ; //******************************************************************************
 0004           ; // Function    : OS_Event_Pend
 0004           ; // Input       : wTaskPrio - priority of task
 0004           ; // Output      : event of task
 0004           ; // Description : Inquiry event of task indexed by priority and then clear it
 0004           ; //******************************************************************************
 0004           ; INT16U OS_Event_Pend(INT8U bTaskPrio)
 0004           ; {
 0004                   .dbline 31
 0004           ;       INT16U wTaskEvent;
 0004           ;       wTaskEvent = OSTCB[bTaskPrio].wEvent;
 0004 86E0              ldi R24,6
 0006 809F              mul R24,R16
 0008 F001              movw R30,R0
 000A 80E0              ldi R24,<_OSTCB+4
 000C 90E0              ldi R25,>_OSTCB+4
 000E E80F              add R30,R24
 0010 F91F              adc R31,R25
 0012 4081              ldd R20,z+0
 0014 5181              ldd R21,z+1
 0016                   .dbline 32
 0016           ;       OSTCB[bTaskPrio].wEvent &= ~wTaskEvent;
 0016 86E0              ldi R24,6
 0018 809F              mul R24,R16
 001A 1001              movw R2,R0
 001C 80E0              ldi R24,<_OSTCB+4
 001E 90E0              ldi R25,>_OSTCB+4
 0020 280E              add R2,R24
 0022 391E              adc R3,R25
 0024 2A01              movw R4,R20
 0026 4094              com R4
 0028 5094              com R5
 002A F101              movw R30,R2
 002C 6080              ldd R6,z+0
 002E 7180              ldd R7,z+1
 0030 6420              and R6,R4
 0032 7520              and R7,R5
 0034 7182              std z+1,R7
 0036 6082              std z+0,R6
 0038                   .dbline 33
 0038           ;       return(wTaskEvent);
 0038 8A01              movw R16,R20
 003A                   .dbline -2
 003A           L2:
 003A 0E940000          xcall pop_gset1
 003E                   .dbline 0 ; func end
 003E 0895              ret
 0040                   .dbsym r wTaskEvent 20 i
 0040                   .dbsym r bTaskPrio 16 c
 0040                   .dbend
 0040                   .dbfunc e OS_Event_Post _OS_Event_Post fV
 0040           ;     wTaskEvent -> R20,R21
 0040           ;      bTaskPrio -> R22
                        .even
 0040           _OS_Event_Post::
 0040 0E940000          xcall push_gset2
 0044 A901              movw R20,R18
 0046 602F              mov R22,R16
 0048                   .dbline -1
 0048                   .dbline 44
 0048           ; }
 0048           ; 
 0048           ; //******************************************************************************
 0048           ; // Function    : OSEventSend
 0048           ; // Input       : wTaskPrio - priority of task
 0048           ; //               wTaskEvent - event to be sent                 
 0048           ; // Output      : none
 0048           ; // Description : Send an event to task indexed by priority
 0048           ; //******************************************************************************
 0048           ; void OS_Event_Post(INT8U bTaskPrio,INT16U wTaskEvent)
 0048           ; {
 0048                   .dbline 45
 0048           ;       OSTCB[bTaskPrio].wEvent |= (1 << wTaskEvent);
 0048 86E0              ldi R24,6
 004A 869F              mul R24,R22
 004C 1001              movw R2,R0
 004E 80E0              ldi R24,<_OSTCB+4
 0050 90E0              ldi R25,>_OSTCB+4
 0052 280E              add R2,R24
 0054 391E              adc R3,R25
 0056 01E0              ldi R16,1
 0058 10E0              ldi R17,0
 005A 9A01              movw R18,R20
 005C 0E940000          xcall lsl16
 0060 F101              movw R30,R2
 0062 4080              ldd R4,z+0
 0064 5180              ldd R5,z+1
 0066 402A              or R4,R16
 0068 512A              or R5,R17
 006A 5182              std z+1,R5
 006C 4082              std z+0,R4
 006E                   .dbline -2
 006E                   .dbline 46
 006E           ; }
 006E           L5:
 006E 0E940000          xcall pop_gset2
 0072                   .dbline 0 ; func end
 0072 0895              ret
 0074                   .dbsym r wTaskEvent 20 i
 0074                   .dbsym r bTaskPrio 22 c
 0074                   .dbend
 0074                   .dbfunc e OS_Task_Create _OS_Task_Create fV
 0074           ;   wTimerPeriod -> R18,R19
 0074           ;      bTaskPrio -> R16
                        .even
 0074           _OS_Task_Create::
 0074                   .dbline -1
 0074                   .dbline 56
 0074           ; 
 0074           ; //******************************************************************************
 0074           ; // Function    : OS_Task_Create
 0074           ; // Input       : wTaskPrio - priority of task
 0074           ; //               wTimerPeriod - period of task
 0074           ; // Output      : none
 0074           ; // Description : Set time period of a task to create it
 0074           ; //******************************************************************************
 0074           ; void OS_Task_Create(INT8U bTaskPrio,INT16U wTimerPeriod)
 0074           ; {
 0074                   .dbline 57
 0074           ;       OSTCB[bTaskPrio].wTimerPeriod = wTimerPeriod;
 0074 86E0              ldi R24,6
 0076 809F              mul R24,R16
 0078 F001              movw R30,R0
 007A 80E0              ldi R24,<_OSTCB
 007C 90E0              ldi R25,>_OSTCB
 007E E80F              add R30,R24
 0080 F91F              adc R31,R25
 0082 3183              std z+1,R19
 0084 2083              std z+0,R18
 0086                   .dbline -2
 0086                   .dbline 58
 0086           ; }
 0086           L7:
 0086                   .dbline 0 ; func end
 0086 0895              ret
 0088                   .dbsym r wTimerPeriod 18 i
 0088                   .dbsym r bTaskPrio 16 c
 0088                   .dbend
 0088                   .dbfunc e OS_Task_Init _OS_Task_Init fV
 0088           ;    wTimerCount -> R18,R19
 0088           ;      bTaskPrio -> R16
                        .even
 0088           _OS_Task_Init::
 0088                   .dbline -1
 0088                   .dbline 68
 0088           ; 
 0088           ; //******************************************************************************
 0088           ; // Function    : OS_Task_Start
 0088           ; // Input       : wTaskPrio - priority of task
 0088           ; //               wTimerCount - Initial time count of a task
 0088           ; // Output      : none
 0088           ; // Description : Set initial time count of a task
 0088           ; //******************************************************************************
 0088           ; void OS_Task_Init(INT8U bTaskPrio,INT16U wTimerCount)
 0088           ; {
 0088                   .dbline 69
 0088           ;       OSTCB[bTaskPrio].wTimerCount = wTimerCount;
 0088 86E0              ldi R24,6
 008A 809F              mul R24,R16
 008C F001              movw R30,R0
 008E 80E0              ldi R24,<_OSTCB+2
 0090 90E0              ldi R25,>_OSTCB+2
 0092 E80F              add R30,R24
 0094 F91F              adc R31,R25
 0096 3183              std z+1,R19
 0098 2083              std z+0,R18
 009A                   .dbline -2
 009A                   .dbline 70
 009A           ; }
 009A           L8:
 009A                   .dbline 0 ; func end
 009A 0895              ret
 009C                   .dbsym r wTimerCount 18 i
 009C                   .dbsym r bTaskPrio 16 c
 009C                   .dbend
 009C                   .dbfunc e OS_Task_Switch _OS_Task_Switch fi
 009C           ;          bTemp -> R20
 009C           ;      bTaskPrio -> R16
                        .even
 009C           _OS_Task_Switch::
 009C 0E940000          xcall push_gset1
 00A0                   .dbline -1
 00A0                   .dbline 80
 00A0           ; 
 00A0           ; //******************************************************************************
 00A0           ; // Function    : OS_Task_Switch
 00A0           ; // Input       : wTaskPrio - priority of task
 00A0           ; // Output      : none
 00A0           ; // Description : inquiry the task in ready status.if there's no ready task with
 00A0           ; //               priority higher than current one,the task would run
 00A0           ; //******************************************************************************
 00A0           ; INT16U OS_Task_Switch(INT8U bTaskPrio)
 00A0           ; {
 00A0                   .dbline 82
 00A0           ;       INT8U bTemp;
 00A0           ;       for(bTemp = 0;bTemp < bTaskPrio;bTemp++)
 00A0 4427              clr R20
 00A2 11C0              xjmp L14
 00A4           L11:
 00A4                   .dbline 83
 00A4           ;       {
 00A4                   .dbline 84
 00A4           ;               if(OSTCB[bTemp].wEvent != 0)
 00A4 86E0              ldi R24,6
 00A6 849F              mul R24,R20
 00A8 F001              movw R30,R0
 00AA 80E0              ldi R24,<_OSTCB+4
 00AC 90E0              ldi R25,>_OSTCB+4
 00AE E80F              add R30,R24
 00B0 F91F              adc R31,R25
 00B2 2080              ldd R2,z+0
 00B4 3180              ldd R3,z+1
 00B6 2220              tst R2
 00B8 11F4              brne X0

⌨️ 快捷键说明

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