📄 kernel.lis
字号:
.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 + -