搜索
bottom↓
回复: 1

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

[复制链接]

出0入0汤圆

发表于 2007-5-5 16:08:47 | 显示全部楼层 |阅读模式
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



#if  EN_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[OSNextTaskID+1];

                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[OSTaskID+1]);

                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[i8]+=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[i8]-=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编辑过

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2007-5-5 21:34:37 | 显示全部楼层
好贴   顶!!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 16:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表