ATmega8515 发表于 2007-5-5 16:08:47

AVR新手移植small rtos,欢迎测试,期待高手指点。

AVR新手移植Small RTOS 1.12到ATmega16欢迎测试,期待高手指点。

根据AVR实际情况,改动原版Small RTOS51的地方:

1.        任务切换保存全部32个寄存器,SREG,Os_Enter_Sum和返回地址(共36字节),不区分任务快速切换和一般任务切换,OSCtxSw()和OSIntCtxSw()为同一函数。

#define OSIntCtxSw()        OSCtxSw()//在OS_CPU.h。

2.        空闲任务OSIdle()也有自己一份堆栈。

3.        不是将所有剩余SRAM空间分配给系统堆栈,系统堆栈空间大小由自己设定

#define         OS_STACK_SIZE         512                //在OS_CPU.h,系统堆栈空间大小(包括空闲任务OSIdle的堆栈)

4.        OS_CPU_A.s新加了一个头文件,Os_cpu_a.h。本想把这个头文件放到OS_CPU.H里的,但不知道GCC标记C程序生成的宏是什么(在KEIL C里面,标记C程序的宏是 #define __C51__)。



附:任务切换函数OSCtxSw()汇编代码:

#define OS_CPU_A

#include "Os_cpu_a.h"



.text

.section .text



OSCtxSw:

                PUSHALL       

                lds                r24,Os_Enter_Sum

                push         r24

                in                r24, SREG       

                push                r24



;        SaveSP=SP;

                in                r6, SPL

                in                r7, SPH



#ifEN_SP2>0

.extern Sp2

                in                 r0,SREG

                cli

                out                 SPH,hi8(Sp2+Sp2Space-1)

                out                 SREG,r0

                out                 SPL,lo8(Sp2+Sp2Space-1)

#endif

       

        ;cp1=SaveSP;

              movw         r8, r6

                               

;        temp_p= (uint16)OSTaskStackBottom;

                lds                r24, OSNextTaskID

           mov                r18, r24

              eor                r19, r19

               movw               r24, r18

              add                r24, r18

              adc                r25, r19

              movw               r30, r24

              subi                r30, lo8(-(OSTaskStackBottom+2))       

              sbci                r31, hi8(-(OSTaskStackBottom+2))       

               ld                r12, Z

              ldd                r13, Z+1       

                               

        ;cp2=(uint16)(OSTaskStackBottom);

                lds                r24, OSTaskID

              mov                r18, r24

               eor                r19, r19

               movw         r24, r18

              add                r24, r18

              adc                r25, r19

              movw                r30, r24

               subi                r30, lo8(-(OSTaskStackBottom+2))       

               sbci                r31, hi8(-(OSTaskStackBottom+2))       

              ld                r10, Z

               ldd                r11, Z+1       

       

        ;if(OSTaskID<OSNextTaskID)

                lds                r24, OSTaskID

                lds                r25, OSNextTaskID

              cp                r24, r25

              brcs        .+2             

              rjmp                OSCtxSw_5           

               

                ;{while(cp2!=temp_p)

OSCtxSw_1:

              cp                r10, r12

               cpc                r11, r13

           breq                OSCtxSw_2           

       

                ;{*(uint8 *)cp1=*(uint8 *)cp2;

               movw         r30, r8

              movw         r26, r10

              ld        r24, X

           st                Z, r24

               

                ;        cp1--;cp2--;}

               sec

           sbc                r8, r1

              sbc                r9, r1

              sec

              sbc                r10, r1

           sbc                r11, r1

              rjmp         OSCtxSw_1   

                       

        ;        SP=cp1;

OSCtxSw_2:

                in                 R0,SREG

                cli

                out                SPH, r9

                out                 SREG,R0

                out                SPL, r8

       

        ;        temp16=cp1-cp2;

              movw         r4, r8

              sub                r4, r10

              sbc                r5, r11

               

;                for(i8=OSTaskID+1;i8<OSNextTaskID+1;i8++)

                lds                r24,OSTaskID

              mov                r2, r24

              inc                r2



OSCtxSw_3:      

                  mov                r18, r2

           eor                r19, r19

                lds                r24, OSNextTaskID

              eor                r25, r25

               adiw         r24, 0x01       

              cp                r18, r24

              cpc                r19, r25

              brge                OSCtxSw_4           

               

                ;        {        OSTaskStackBottom+=temp16;        }

           mov                r18, r2

              eor                r19, r19

                    movw                r24, r18

              add                r24, r18

              adc                r25, r19

           movw                r26, r24

              subi                r26, lo8(-(OSTaskStackBottom))       

              sbci                r27, hi8(-(OSTaskStackBottom))       

             

                movw         r30,r26

               ld                r24, Z

              ldd                r25, Z+1       

              add                r24, r4

               adc                r25, r5

               adiw                r26, 0x01       

              st                X, r25

              st                -X, r24

               inc                r2

               rjmp               OSCtxSw_3           

       

        ;        OSTaskID=OSNextTaskID;

OSCtxSw_4:

                lds                r24, OSNextTaskID

                sts                OSTaskID, r24

       

;                goto loadctx;

               Rjmp                OSCtxSw_11



;        else if(OSNextTaskID<OSTaskID)

OSCtxSw_5:

                lds                r25, OSNextTaskID

                lds                r24, OSTaskID

              cp                r25, r24

              brcs        .+2             

              rjmp                OSCtxSw_10           

               

                ;{        while(cp1!=temp_p)

OSCtxSw_6:

                    cp                r8, r12

           cpc                r9, r13

           breq         OSCtxSw_7   

                       

                        ;{                *(uint8 *)(++cp2)=*(uint8 *)(++cp1);}

           sec

           adc                r10, r1

           adc                r11, r1

               movw                r30, r10

              sec

              adc                r8, r1

              adc                r9, r1

              movw                r26, r8

              ld                r24, X

              st                Z, r24

              rjmp                OSCtxSw_6   



                ;SP=cp1;

OSCtxSw_7:

                in                 R0,SREG

                cli

                out                SPH, r9

                out                 SREG,R0

                out                SPL, r8

       

        ;        temp16=cp1-cp2;

              movw                r4, r8

           sub                r4, r10

           sbc                r5, r11



                ;for(i8=OSNextTaskID+1;i8<OSTaskID+1;i8++)

                lds                r24, OSNextTaskID

              mov                r2, r24

              inc                r2

OSCtxSw_8:   

               mov                r18, r2

              eor                r19, r19

                lds                r24,OSTaskID

           eor                r25, r25

              adiw                r24, 0x01       

              cp               r18,r24

              cpc               r19,r25

           brge                OSCtxSw_9           

       

;                {                OSTaskStackBottom-=temp16;}

           mov                r18, r2

              eor                r19, r19

              movw                r24, r18

              add                r24, r18

              adc                r25, r19

              movw                r26, r24

              subi                r26, lo8(-(OSTaskStackBottom))       

               sbci                r27, hi8(-(OSTaskStackBottom))       

             

                movw         r30,r26

                ld                r24, Z

              ldd                r25, Z+1

              sub                r24, r4

               sbc                r25, r5

           adiw                r26, 0x01       

              st                X, r25

              st                -X, r24

              inc                r2

              rjmp         OSCtxSw_8          



        ;        OSTaskID=OSNextTaskID;

OSCtxSw_9:

                lds        r24, OSNextTaskID

                sts        OSTaskID, r24



        ;        goto loadctx;

                   rjmp        OSCtxSw_11   

OSCtxSw_10:

;      else SP=SaveSP;

                   in r0,SREG

                   cli

                out        SPH, r7

                sts 0x5f,r0

                sts        0x005D, r6

        ;        goto loadctx;



OSCtxSw_11:       

;loadctx:

                pop r0          ;SREG暂存

                cli               

                pop r24                ;Os_Enter_Sum

                sts Os_Enter_Sum,r24       

                and r24,r24

                brne         OSCtxSw_12               

                OS_SET_INT



OSCtxSw_12:       

                out SREG,r0       

                POPALL       

                ret







点击此处下载armok01152918.rar








-----此内容被ATmega8515于2007-05-05,16:19:49编辑过

caolong 发表于 2007-5-5 21:34:37

好贴   顶!!!!
页: [1]
查看完整版本: AVR新手移植small rtos,欢迎测试,期待高手指点。