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

📄 os_cpu.lis

📁 非剥夺型占先式minOS_iccavr avr单片机 icc编译环境
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                         .module os_cpu.c
                         .area vector(rom, abs)
                         .org 14
 000E AFC0              rjmp _OSTickISR
                         .area text(rom, con, rel)
 0000                   .dbfile C:\icc\minOS_iccavr\os_cpu.c
 0000                   .dbfunc s InitOSTimer _InitOSTimer fI
                         .even
 0000                 _InitOSTimer::
 0000                   .dbline -1
 0000                   .dbline 24
                       ; /*
                       ; *********************************************************************************************************
                       ; *                                      minOS 0.01v
                       ; *                                The Real-Time OS Kernel
                       ; *                                  All Rights Reserved
                       ; * File : OS_CPU.C
                       ; * 作者 : 21icbbs网友 LM7556 ,2004年7月   by : LM7556 , China , 2004-2004 
                       ; *
                       ; *********************************************************************************************************
                       ; */
                       ; 
                       ; #define OS_CPU_GLOBALS
                       ; #include "OS_Includes.h"
                       ; 
                       ; #pragma interrupt_handler OSTickISR:8  //uses Timer0 for time ticks.
                       ; 
                       ; //;CPU specific definitions 
                       ; #define C51_CRYSTAL_FREQ   4000000ul
                       ; //;Determine the reload values for timer 0 this is automated by the next macro
                       ; #define T0_RELOAD  C51_CRYSTAL_FREQ / OS_TICKS_PER_SEC / 1024
                       ; #define T0_TCNT0 (256 - (T0_RELOAD & 0xff))
                       ; //Initial OS Timer for time ticks --- 初始化时间节拍定时器。
                       ; void InitOSTimer(void)
                       ; {
 0000                   .dbline 25
                       ;   TIMSK |= (1<<1);     // set T0IE0
 0000 89B7              in R24,0x39
 0002 8260              ori R24,2
 0004 89BF              out 0x39,R24
 0006                   .dbline 26
                       ;   TCCR0  = 0x05;       // CTC0=CK/1024
 0006 85E0              ldi R24,5
 0008 83BF              out 0x33,R24
 000A                   .dbline 27
                       ;   TCNT0  = T0_TCNT0;   // (256 - (T0_RELOAD & 0xff))
 000A 8AE7              ldi R24,122
 000C 82BF              out 0x32,R24
 000E                   .dbline 28
                       ;   SREG  |= (1<<7);     // SEI
 000E 7894              bset 7
 0010                   .dbline -2
 0010                   .dbline 29
                       ; }
 0010                 L2:
 0010                   .dbline 0 ; func end
 0010 0895              ret
 0012                   .dbfunc s OSTaskCreate _OSTaskCreate fI
                       ;           prio -> y+4
                       ;           tStk -> R22,R23
                       ;          tFunc -> R20,R21
                         .even
 0012                 _OSTaskCreate::
 0012 00D0              rcall push_gset2
 0014 622F              mov R22,R18
 0016 732F              mov R23,R19
 0018 402F              mov R20,R16
 001A 512F              mov R21,R17
 001C                   .dbline -1
 001C                   .dbline 34
                       ; 
                       ; //建立一个任务(Create a Task)。
                       ; //Inport :  tFunc --- function address , tStk --- stack bottom , prio --- Priority .
                       ; void OSTaskCreate (void (*tFunc)(void) , OS_STK *tStk, INT8U prio) 
                       ; {
 001C                   .dbline 35
                       ;     OSTCB[prio].OSTaskStatus = OS_TASK_Rdy;
 001C 2C81              ldd R18,y+4
 001E 3327              clr R19
 0020 05E0              ldi R16,5
 0022 10E0              ldi R17,0
 0024 00D0              rcall mpy16s
 0026 E02F              mov R30,R16
 0028 F12F              mov R31,R17
 002A 80E0              ldi R24,<_OSTCB+2
 002C 90E0              ldi R25,>_OSTCB+2
 002E E80F              add R30,R24
 0030 F91F              adc R31,R25
 0032 8CEF              ldi R24,252
 0034 8083              std z+0,R24
 0036                   .dbline 36
                       ;     OSTCB[prio].OSStkTop = (INT16U)tStk-1 /* Initial value when main was called             */
 0036 2C81              ldd R18,y+4
 0038 3327              clr R19
 003A 05E0              ldi R16,5
 003C 10E0              ldi R17,0
 003E 00D0              rcall mpy16s
 0040 E02F              mov R30,R16
 0042 F12F              mov R31,R17
 0044 80E0              ldi R24,<_OSTCB
 0046 90E0              ldi R25,>_OSTCB
 0048 E80F              add R30,R24
 004A F91F              adc R31,R25
 004C 862F              mov R24,R22
 004E 972F              mov R25,R23
 0050 0197              sbiw R24,1
 0052 0C97              sbiw R24,12
 0054 0297              sbiw R24,2
 0056 8083              std z+0,R24
 0058 9183              std z+1,R25
 005A                   .dbline 40
                       ;                           -12             /* reserve for to save R0-R5 , R26-R31 registers  */
                       ;                           -sizeof(INT16U) /* The PC value to be loaded                      */
                       ;                        ;
                       ;     *--tStk =  *(INT16U const *)tFunc & 0xff;   /* Save low byte of task function address   */
 005A 862F              mov R24,R22
 005C 972F              mov R25,R23
 005E 0197              sbiw R24,1
 0060 282E              mov R2,R24
 0062 392E              mov R3,R25
 0064 622D              mov R22,R2
 0066 732D              mov R23,R3
 0068 042F              mov R16,R20
 006A 152F              mov R17,R21
 006C 00D0              rcall lpm16
 006E 802F              mov R24,R16
 0070 912F              mov R25,R17
 0072 9070              andi R25,0
 0074 E22D              mov R30,R2
 0076 F32D              mov R31,R3
 0078 8083              std z+0,R24
 007A                   .dbline 41
                       ;     *--tStk =  *(INT16U const *)tFunc / 0x100;  /* Save high byte of task function address  */
 007A 862F              mov R24,R22
 007C 972F              mov R25,R23
 007E 0197              sbiw R24,1
 0080 282E              mov R2,R24
 0082 392E              mov R3,R25
 0084 622D              mov R22,R2
 0086 732D              mov R23,R3
 0088 042F              mov R16,R20
 008A 152F              mov R17,R21
 008C 00D0              rcall lpm16
 008E 402E              mov R4,R16
 0090 512E              mov R5,R17
 0092 452C              mov R4,R5
 0094 5524              clr R5
 0096 E22D              mov R30,R2
 0098 F32D              mov R31,R3
 009A 4082              std z+0,R4
 009C                   .dbline -2
 009C                   .dbline 42
                       ; }
 009C                 L3:
 009C 00D0              rcall pop_gset2
 009E                   .dbline 0 ; func end
 009E 0895              ret
 00A0                   .dbsym l prio 4 c
 00A0                   .dbsym r tStk 22 pc
 00A0                   .dbsym r tFunc 20 pfI
 00A0                   .dbfunc s OSCtxSw _OSCtxSw fI
                         .even
 00A0                 _OSCtxSw::
 00A0                   .dbline -1
 00A0                   .dbline 48
                       ; 
                       ; static unsigned int SaveSP; //用于保存需恢复的SP,在OSTickISR或用户中断结束做任务切换时,恢复SP.
                       ; 
                       ; //context switch interrupt --- 软中断任务切换
                       ; void OSCtxSw(void) 
                       ; {
 00A0                   .dbline 49
                       ;     asm("PUSH R31\n"
 00A0 FF93              PUSH R31
 00A2 EF93              PUSH R30
 00A4 DF93              PUSH R29
 00A6 CF93              PUSH R28

⌨️ 快捷键说明

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