搜索
bottom↓
回复: 10

想使用STC8的增强型双数据指针加快复制速度但失败了

[复制链接]
(24721339)

出0入0汤圆

发表于 2019-12-8 11:49:20 | 显示全部楼层 |阅读模式
想优化以下复制功能,芯片为STC8A8K64S4
void CopyXdata(uchar xdata *psource, uchar xdata *pdest, uchar len) small
{
        do
        {
                *pdest = *psource;
                psource ++;
                pdest ++;
                len --;
        }while(len);               
}          
想利用STC8的增强型双数据指针,所以改写为以下嵌入ASM
void CopyXdata(uchar xdata *psource, uchar xdata *pdest, uchar len) small
{
        //psource -> R6/R7
        //pdest -> R4/R5
        //len -> R3
#pragma ASM
                                                MOV     DPS,#00000000B              ;选择DPTR0
            MOV     DPL,R7                                        
            MOV     DPH,R6                                        
                                                MOV     DPS,#00000001B              ;选择DPTR1
            MOV     DPL,R5                                        
            MOV     DPH,R4                                        
            MOV     DPS,#00111000B              ;设置DPTR1为递加模式,DPTR0为递加模式,使能TSL以及
                                                ;AU0和AU1,并选择DPTR0为当前的DPTR
COPY_NEXT:
            MOVX    A,@DPTR                                   ;从DPTR0所指的程序空间读取数据,
            MOVX    @DPTR,A                     ;将ACC的数据写入到DPTR1所指的XDATA中,
                                                ;完成后DPTR1自动减1并将DPTR0设置为下一个目标DPTR
            DJNZ    R3,COPY_NEXT               

                                                MOV     DPS,#00000000B              ;选择DPTR0
       
                                                RET
#pragma ENDASM       
}          
调用后异常,我对汇编不熟悉,所以请坛友帮助看看那个地方错了
(24719683)

出0入0汤圆

发表于 2019-12-8 12:16:56 | 显示全部楼层
COPY_NEXT下面那两行,你确认是认真的?
(24716966)

出0入0汤圆

 楼主| 发表于 2019-12-8 13:02:13 来自手机 | 显示全部楼层
双指针会自动递增和切换,难道我理解错了?我参考例程写的,请坛主科普一下
(24716900)

出0入0汤圆

发表于 2019-12-8 13:03:19 来自手机 | 显示全部楼层
楼上说的那个来回倒腾是要干嘛?增加GDP么:)
(24714992)

出0入185汤圆

发表于 2019-12-8 13:35:07 | 显示全部楼层
本帖最后由 Himem 于 2019-12-8 13:36 编辑

没用过这款,不过对着手册看不出什么问题,仿真器单步看看吧

前面我倒是会改成这样
MOV     DPS,#00000000B
MOV     DPL,R7                                         
MOV     DPH,R6                                         
MOV     DPL1,R5                                         
MOV     DPH1,R4     
(24708655)

出0入0汤圆

发表于 2019-12-8 15:20:44 | 显示全部楼层
正是楼上提到的原因。
DPH,DPL,DPH1,DPL1有各自独立的地址,MOV DPL,R7这样的指令操作的是普通的寄存器地址,和DPTR没有关系。
只有几个特定的操作DPTR的指令才会根据情况选择用DPTR还是DPTR1,并且执行完后,自动修改DPRT。
(24708510)

出0入0汤圆

发表于 2019-12-8 15:23:09 | 显示全部楼层
另外,你这个注释也不对吧。
MOVX    A,@DPTR                                   ;从DPTR0所指的程序空间读取数据,
(24702631)

出0入0汤圆

 楼主| 发表于 2019-12-8 17:01:08 | 显示全部楼层
health 发表于 2019-12-8 15:20
正是楼上提到的原因。
DPH,DPL,DPH1,DPL1有各自独立的地址,MOV DPL,R7这样的指令操作的是普通的寄存器地 ...

你说的对,确实是这个问题,已修改好了,我以为可以通过DSP的SEL位选择DPTR,STC的这个功能确实不错,现在对拷速度确实快多
(24702550)

出0入0汤圆

 楼主| 发表于 2019-12-8 17:02:29 | 显示全部楼层
health 发表于 2019-12-8 15:23
另外,你这个注释也不对吧。
MOVX    A,@DPTR                                   ;从DPTR0所指的程序空间 ...

注释拿了例程的,忘记改了,例程是取程序空间的数据复制
(23664802)

出0入0汤圆

发表于 2019-12-20 17:18:17 | 显示全部楼层
双数据指针,使用汇编才用到,C语言就不要玩了。
(23652189)

出0入0汤圆

发表于 2019-12-20 20:48:30 来自手机 | 显示全部楼层
厉害
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-9-19 14:51

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

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