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 + -
显示快捷键?