schedule.lis
来自「mega128平台下」· LIS 代码 · 共 371 行
LIS
371 行
.module schedule.c
.area text(rom, con, rel)
; result -> R16
.even
0000 _atomic_start::
0000 ; #include <iom128v.h>
0000 ; #include <macros.h>
0000 ; #include "schedule.h"
0000 ; #include "timer.h"
0000 ;
0000 ; typedef struct {
0000 ; void (*tp) ();
0000 ; } TOSH_sched_entry_T;
0000 ; typedef unsigned char uint8_t;
0000 ; enum {
0000 ;
0000 ; TOSH_MAX_TASKS = 8,
0000 ; TOSH_TASK_BITMASK = (TOSH_MAX_TASKS - 1)
0000 ; };
0000 ;
0000 ; volatile TOSH_sched_entry_T TOSH_queue[TOSH_MAX_TASKS];
0000 ; uint8_t TOSH_sched_full;
0000 ; volatile uint8_t TOSH_sched_free;
0000 ;
0000 ; uint8_t atomic_start(void)
0000 ; {
0000 ; uint8_t result = SREG;
0000 0FB7 in R16,0x3f
0002 ; CLI();
0002 F894 cli
0004 ; return result;
0004 L3:
0004 .dbline 0 ; func end
0004 0895 ret
0006 ; oldSreg -> R16
.even
0006 _atomic_end::
0006 ; }
0006 ;
0006 ; void atomic_end(uint8_t oldSreg)
0006 ; {
0006 ; SREG=oldSreg;
0006 0FBF out 0x3f,R16
0008 L4:
0008 .dbline 0 ; func end
0008 0895 ret
.even
000A _TOSH_wait::
000A ; }
000A ;
000A ;
000A ; /* These are provided in HPL.td */
000A ; void TOSH_wait()
000A ; {
000A ; asm("nop");
000A 0000 nop
000C ; asm("nop");
000C 0000 nop
000E L5:
000E .dbline 0 ; func end
000E 0895 ret
.even
0010 _TOSH_sleep::
0010 ;
0010 ; }
0010 ;
0010 ; void TOSH_sleep()
0010 ; {
0010 ; MCUCR |= 1<<5;
0010 85B7 in R24,0x35
0012 8062 ori R24,32
0014 85BF out 0x35,R24
0016 ; asm("sleep");
0016 8895 sleep
0018 L6:
0018 .dbline 0 ; func end
0018 0895 ret
001A ; i -> R20,R21
.even
001A _sched_init::
001A 0E940000 xcall push_gset1
001E ; //MCUCR =0x0;
001E ;
001E ; //sbi(MCUCR, 5);
001E ; //sbi(MCUCR, SE);
001E ; //asm volatile ("sleep");
001E ; }
001E ;
001E ; void sched_init(void)
001E ; {
001E ; int i;
001E ; TOSH_sched_free = 0;
001E 2224 clr R2
0020 20920000 sts _TOSH_sched_free,R2
0024 ; TOSH_sched_full = 0;
0024 20920100 sts _TOSH_sched_full,R2
0028 ; for (i = 0; i < TOSH_MAX_TASKS; i++)
0028 4427 clr R20
002A 5527 clr R21
002C L8:
002C 02E0 ldi R16,2
002E 10E0 ldi R17,0
0030 9A01 movw R18,R20
0032 0E940000 xcall empy16s
0036 F801 movw R30,R16
0038 80E0 ldi R24,<_TOSH_queue
003A 90E0 ldi R25,>_TOSH_queue
003C E80F add R30,R24
003E F91F adc R31,R25
0040 2224 clr R2
0042 3324 clr R3
0044 3182 std z+1,R3
0046 2082 std z+0,R2
0048 L9:
0048 4F5F subi R20,255 ; offset = 1
004A 5F4F sbci R21,255
004C 4830 cpi R20,8
004E E0E0 ldi R30,0
0050 5E07 cpc R21,R30
0052 64F3 brlt L8
0054 L7:
0054 0E940000 xcall pop_gset1
0058 .dbline 0 ; func end
0058 0895 ret
005A ; fInterruptFlags -> R20
005A ; tmp -> R10
005A ; tp -> R22,R23
.even
005A _post::
005A 0E940000 xcall push_gset3
005E B801 movw R22,R16
0060 ; TOSH_queue[i].tp = 0x0;
0060 ; }
0060 ;
0060 ; /*
0060 ; * TOS_post (thread_pointer)
0060 ; *
0060 ; * Put the task pointer into the next free slot.
0060 ; * Return 1 if successful, 0 if there is no free slot.
0060 ; *
0060 ; * This function uses a critical section to protect TOSH_sched_free.
0060 ; * As tasks can be posted in both interrupt and non-interrupt context,
0060 ; * this is necessary.
0060 ; */
0060 ; char post(void (*tp) ()) {
0060 ; uint8_t fInterruptFlags;
0060 ; uint8_t tmp;
0060 ;
0060 ; fInterruptFlags = atomic_start();
0060 CFDF xcall _atomic_start
0062 402F mov R20,R16
0064 ;
0064 ; tmp = TOSH_sched_free;
0064 A0900000 lds R10,_TOSH_sched_free
0068 ;
0068 ; if (TOSH_queue[tmp].tp == 0x0) {
0068 82E0 ldi R24,2
006A 8A9D mul R24,R10
006C F001 movw R30,R0
006E 80E0 ldi R24,<_TOSH_queue
0070 90E0 ldi R25,>_TOSH_queue
0072 E80F add R30,R24
0074 F91F adc R31,R25
0076 2080 ldd R2,z+0
0078 3180 ldd R3,z+1
007A 2220 tst R2
007C A1F4 brne L13
007E 3320 tst R3
0080 91F4 brne L13
0082 X0:
0082 ; TOSH_sched_free = (tmp + 1) & TOSH_TASK_BITMASK;
0082 8A2D mov R24,R10
0084 8F5F subi R24,255 ; addi 1
0086 8770 andi R24,7
0088 80930000 sts _TOSH_sched_free,R24
008C ; TOSH_queue[tmp].tp = tp;
008C 82E0 ldi R24,2
008E 8A9D mul R24,R10
0090 F001 movw R30,R0
0092 80E0 ldi R24,<_TOSH_queue
0094 90E0 ldi R25,>_TOSH_queue
0096 E80F add R30,R24
0098 F91F adc R31,R25
009A 7183 std z+1,R23
009C 6083 std z+0,R22
009E ; atomic_end(fInterruptFlags);
009E 042F mov R16,R20
00A0 B2DF xcall _atomic_end
00A2 ; return 1;
00A2 01E0 ldi R16,1
00A4 03C0 xjmp L12
00A6 L13:
00A6 ; }
00A6 ; else {
00A6 ; atomic_end(fInterruptFlags);
00A6 042F mov R16,R20
00A8 AEDF xcall _atomic_end
00AA ; return 0;
00AA 0027 clr R16
00AC L12:
00AC 0E940000 xcall pop_gset3
00B0 .dbline 0 ; func end
00B0 0895 ret
00B2 ; fInterruptFlags -> R22
00B2 ; func -> R20,R21
00B2 ; old_full -> R10
.even
00B2 _TOSH_run_next_task::
00B2 0E940000 xcall push_gset3
00B6 ; }
00B6 ; }
00B6 ;
00B6 ; /*
00B6 ; * TOSH_schedule_task()
00B6 ; *
00B6 ; * Remove the task at the head of the queue and execute it, freeing
00B6 ; * the queue entry. Return 1 if a task was executed, 0 if the queue
00B6 ; * is empty.
00B6 ; */
00B6 ;
00B6 ; int TOSH_run_next_task ()
00B6 ; {
00B6 ; uint8_t fInterruptFlags;
00B6 ; uint8_t old_full;
00B6 ; void (*func)(void);
00B6 ;
00B6 ; fInterruptFlags = atomic_start();
00B6 A4DF xcall _atomic_start
00B8 602F mov R22,R16
00BA ; old_full = TOSH_sched_full;
00BA A0900100 lds R10,_TOSH_sched_full
00BE ; func = TOSH_queue[old_full].tp;
00BE 82E0 ldi R24,2
00C0 8A9D mul R24,R10
00C2 F001 movw R30,R0
00C4 80E0 ldi R24,<_TOSH_queue
00C6 90E0 ldi R25,>_TOSH_queue
00C8 E80F add R30,R24
00CA F91F adc R31,R25
00CC 4081 ldd R20,z+0
00CE 5181 ldd R21,z+1
00D0 ; if (func == 0x0)
00D0 4030 cpi R20,0
00D2 4507 cpc R20,R21
00D4 29F4 brne L16
00D6 X1:
00D6 ; {
00D6 ; atomic_end(fInterruptFlags);
00D6 062F mov R16,R22
00D8 96DF xcall _atomic_end
00DA ; // printf("return 0\n");
00DA ; return 0;
00DA 0027 clr R16
00DC 1127 clr R17
00DE 17C0 xjmp L15
00E0 L16:
00E0 ; }
00E0 ;
00E0 ; TOSH_queue[old_full].tp = 0x0;
00E0 82E0 ldi R24,2
00E2 8A9D mul R24,R10
00E4 F001 movw R30,R0
00E6 80E0 ldi R24,<_TOSH_queue
00E8 90E0 ldi R25,>_TOSH_queue
00EA E80F add R30,R24
00EC F91F adc R31,R25
00EE 2224 clr R2
00F0 3324 clr R3
00F2 3182 std z+1,R3
00F4 2082 std z+0,R2
00F6 ; TOSH_sched_full = (old_full + 1) & TOSH_TASK_BITMASK;
00F6 8A2D mov R24,R10
00F8 8F5F subi R24,255 ; addi 1
00FA 8770 andi R24,7
00FC 80930100 sts _TOSH_sched_full,R24
0100 ; atomic_end(fInterruptFlags);
0100 062F mov R16,R22
0102 81DF xcall _atomic_end
0104 ; func();
0104 FA01 movw R30,R20
0106 0E940000 xcall xicall
010A ; // printf("tsk\n");
010A ; //printf("running task %d",old_full);
010A ; return 1;
010A 01E0 ldi R16,1
010C 10E0 ldi R17,0
010E L15:
010E 0E940000 xcall pop_gset3
0112 .dbline 0 ; func end
0112 0895 ret
0114 ; x -> <dead>
0114 ; fInterruptFlags -> <dead>
.even
0114 _run_task::
0114 ; }
0114 ; extern sleep_flag;
0114 ; void run_task() {
0114 L19:
0114 L20:
0114 ; uint8_t fInterruptFlags,x;
0114 ; while (TOSH_run_next_task())
0114 CEDF xcall _TOSH_run_next_task
0116 0030 cpi R16,0
0118 0107 cpc R16,R17
011A E1F7 brne L19
011C X2:
011C ; ;
011C ; /* fInterruptFlags = atomic_start();
011C ; x = (T1.on==1) ||(T2.on==1)||(T3.on==1);
011C ; atomic_end(fInterruptFlags);
011C ; if (x)//||(sleep_flag==0))
011C ; */
011C ; if((T1.on==1) ||(T2.on==1)||(T3.on==1))
011C 80910100 lds R24,_T1+1
0120 8130 cpi R24,1
0122 41F0 breq L28
0124 80910100 lds R24,_T2+1
0128 8130 cpi R24,1
012A 21F0 breq L28
012C 80910100 lds R24,_T3+1
0130 8130 cpi R24,1
0132 09F4 brne L30
0134 L28:
0134 ; ;
0134 06C0 xjmp L23
0136 X3:
0136 ; else
0136 ; {
0136 L29:
0136 L30:
0136 ; while (TOSH_run_next_task())
0136 BDDF xcall _TOSH_run_next_task
0138 0030 cpi R16,0
013A 0107 cpc R16,R17
013C E1F7 brne L29
013E X4:
013E ; ;
013E ; TOSH_sleep();
013E 68DF xcall _TOSH_sleep
0140 ; TOSH_wait();
0140 64DF xcall _TOSH_wait
0142 ; }
0142 L23:
0142 L18:
0142 .dbline 0 ; func end
0142 0895 ret
.even
0144 ___nesc_enable_interrupt::
0144 ;
0144 ;
0144 ; //printf("wkup\n");
0144 ; //delay_x(1000);
0144 ;
0144 ; }
0144 ;
0144 ;
0144 ;
0144 ; void __nesc_enable_interrupt() {
0144 ; SEI();
0144 7894 sei
0146 L32:
0146 .dbline 0 ; func end
0146 0895 ret
.area bss(ram, con, rel)
0000 _TOSH_sched_free::
0000 .blkb 1
0001 _TOSH_sched_full::
0001 .blkb 1
0002 _TOSH_queue::
0002 .blkb 16
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?