打印
[STM8]

发现STVD+Cosmic CxSTM8 32K 4.3.4的吐血问题,给大家提个醒

[复制链接]
8126|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zcxhe|  楼主 | 2010-6-5 16:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
发现STVD+Cosmic CxSTM8 32K 4.3.4的吐血问题,给大家提个醒:

这样子写:

__eep_wall_data[(__window_x + 1)] = __eep_wall_data[__window_x];
__eep_wall_data[(__window_x + 2)] = __eep_wall_data[__window_x];

运行结果是错误的!

这样子写:

__eep_wall_data[1] = __eep_wall_data[0];
__eep_wall_data[2] = __eep_wall_data[0];

或者这样子写:

__eep_wall_data[__window_x] = __eep_wall_data[(__window_x + 1)];
__eep_wall_data[__window_x] = __eep_wall_data[(__window_x + 2)];

运行结果是正确的!

******************************************************************************
相关代码:
@eeprom struct __eep_wall
{
    unsigned char __eep_out_fx;                                    //输出换向
    unsigned char __eep_out_lx;                                    //输出类型
    unsigned char __eep_wk_sb_k;                                   //外控开关类型
    unsigned char __eep_window_ptr;                                //保存通道位置
    unsigned char __eep_window[__cst_window_len][__cst_code_len];  //保存8个通道号
    unsigned int  __eep_crc16;                                     //数据CRC16校验结果
} __eep_wall_data[3] =
{
    0
}
;



//数据备份
void subpr_wall_eep_bak(unsigned char __window_x)
{
    //计算CRC16校验值
    __eep_wall_data[__window_x].__eep_crc16 = subpr_crc16_s(& __eep_wall_data[__window_x].__eep_out_fx, sizeof(__eep_wall_data[__window_x]) - 2);
    //备份数据
    //subpr_eep_copy(__window_x, 1, 0);
    //subpr_eep_copy(__window_x, 2, 0);
   
    __eep_wall_data[(__window_x + 1)] = __eep_wall_data[__window_x];
    __eep_wall_data[(__window_x + 2)] = __eep_wall_data[__window_x];
}

******************************************************************************************************************************************
沙发
zcxhe|  楼主 | 2010-6-7 09:04 | 只看该作者
有没有其他同仁对此有了解的?解释解释?谢谢!

使用特权

评论回复
板凳
zcxhe|  楼主 | 2010-6-7 13:21 | 只看该作者
怎么没人探讨一下啊?

使用特权

评论回复
地板
hsbjb| | 2010-6-7 20:51 | 只看该作者
不是很了解

使用特权

评论回复
5
zcxhe|  楼主 | 2010-6-7 22:05 | 只看该作者
噢!

使用特权

评论回复
6
zcxhe|  楼主 | 2010-6-9 21:40 | 只看该作者
怎么探讨的人这么少啊?有没有老手指点一下迷津啊?

使用特权

评论回复
7
乙天| | 2010-6-10 13:44 | 只看该作者
看看汇编代码哦。

另外你的函数在什么地方调用?
有没有不重入函数在中断中使用?

使用特权

评论回复
8
zcxhe|  楼主 | 2010-6-10 17:38 | 只看该作者
汇编错了结果才会借啊!
中断没用使用到!

使用特权

评论回复
9
zcxhe|  楼主 | 2010-6-15 16:47 | 只看该作者
看了好久的汇编代码,终于知道问题在哪了!
main.c:67        tmp[tmp3]=tmp[tmp2]; 这种是错误的!
0x9060 <main+65>            0x7B02          LD    A,(0x02,SP)         LD    A,(0x02,SP)
0x9062 <main+67>            0x97            LD    XL,A                LD    XL,A
0x9063 <main+68>            0xA60B          LD    A,#0x0b             LD    A,#0x0b
0x9065 <main+70>            0x42            MUL   X,A                 MUL   X,A
0x9066 <main+71>            0x1C4082        ADDW  X,#0x4082           ADDW  X,#0x4082                         //算得目的地址
0x9069 <main+74>            0x89            PUSHW X                   PUSHW X                                         //保存目的地址
以上为计算目的地址
0x906a <main+75>            0x7B05          LD    A,(0x05,SP)         LD    A,(0x05,SP)
0x906c <main+77>            0x97            LD    XL,A                LD    XL,A
0x906d <main+78>            0xA60B          LD    A,#0x0b             LD    A,#0x0b
0x906f <main+80>            0x42            MUL   X,A                 MUL   X,A
0x9070 <main+81>            0x1C4082        ADDW  X,#0x4082           ADDW  X,#0x4082                 //算得源地址
以上为计算源地址
0x9073 <main+84>            0x9085          POPW  Y                   POPW  Y                                 //在这里开始出错,正确应该是把X赋给Y,然后再弹出原来保出的X给X。
0x9075 <main+86>            0xA60B          LD    A,#0x0b             LD    A,#0x0b
0x9077 <main+88>            0xCD9228        CALL  0x9228              CALL  c_eewstr
main.c:68        tmp[2]=tmp[0]; 这种是正确的!从下面知道目的地址存在X,源地址存在Y,而上面则反过来了!
0x907a <main+91>            0xAE4098        LDW   X,#0x4098           LDW   X,#0x4098                 //目的地址
0x907d <main+94>            0x90AE4082      LDW   Y,#0x4082           LDW   Y,#0x4082                 //源地址
0x9081 <main+98>            0xA60B          LD    A,#0x0b             LD    A,#0x0b
0x9083 <main+100>           0xCD9228        CALL  0x9228              CALL  c_eewstr

使用特权

评论回复
10
zcxhe|  楼主 | 2010-6-15 16:57 | 只看该作者
不过奇怪的是如果把结构体定义在SRAM中运行就是正确的!
main.c:67        tmp[tmp3]=tmp[tmp2];
0x906b <main+43>            0x7B02          LD    A,(0x02,SP)         LD    A,(0x02,SP)
0x906d <main+45>            0x97            LD    XL,A                LD    XL,A
0x906e <main+46>            0xA60B          LD    A,#0x0b             LD    A,#0x0b
0x9070 <main+48>            0x42            MUL   X,A                 MUL   X,A
0x9071 <main+49>            0x01            RRWA  X,A                 RRWA  X,A
0x9072 <main+50>            0xAB2B          ADD   A,#0x2b             ADD   A,#0x2b
0x9074 <main+52>            0x2401          JRNC  0x9077              JRNC  0x9077
0x9076 <main+54>            0x5C            INCW  X                   INCW  X
0x9077 <main+55>            0x5F            CLRW  X                   CLRW  X
0x9078 <main+56>            0x97            LD    XL,A                LD    XL,A
0x9079 <main+57>            0x89            PUSHW X                   PUSHW X
0x907a <main+58>            0x7B05          LD    A,(0x05,SP)         LD    A,(0x05,SP)
0x907c <main+60>            0x97            LD    XL,A                LD    XL,A
0x907d <main+61>            0xA60B          LD    A,#0x0b             LD    A,#0x0b
0x907f <main+63>            0x42            MUL   X,A                 MUL   X,A
0x9080 <main+64>            0x01            RRWA  X,A                 RRWA  X,A
0x9081 <main+65>            0xAB2B          ADD   A,#0x2b             ADD   A,#0x2b
0x9083 <main+67>            0x2401          JRNC  0x9086              JRNC  0x9086
0x9085 <main+69>            0x5C            INCW  X                   INCW  X
0x9086 <main+70>            0x5F            CLRW  X                   CLRW  X
0x9087 <main+71>            0x97            LD    XL,A                LD    XL,A
0x9088 <main+72>            0x9085          POPW  Y                   POPW  Y
0x908a <main+74>            0xA60B          LD    A,#0x0b             LD    A,#0x0b
0x908c <main+76>            0xCD92DC        CALL  0x92dc              CALL  c_yxmov                 //注意看这里,调用不同,跟下面不一样。这里是YX.
main.c:68        tmp[2]=tmp[0];
0x908f <main+79>            0xAE0041        LDW   X,#0x0041           LDW   X,#0x0041
0x9092 <main+82>            0x90AE002B      LDW   Y,#0x002b           LDW   Y,#0x002b
0x9096 <main+86>            0xA60B          LD    A,#0x0b             LD    A,#0x0b
0x9098 <main+88>            0xCD92CD        CALL  0x92cd              CALL  c_xymov                //注意看这里,调用不同,跟上面不一样。这里是XY.

使用特权

评论回复
11
CrazyST| | 2010-6-20 21:50 | 只看该作者
太有耐心了!!!敬佩啊!

使用特权

评论回复
12
fycom200| | 2010-7-23 10:22 | 只看该作者
没整明白,代码好长

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

138

帖子

2

粉丝