3389|7

87

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

数组间赋值出错,数据怪异的被赋值,不知道为什么 [复制链接]

void get_from_buffer()
{
        tByte Recv_point_G=0;
        static tByte zen_data_point;
        static tByte zen_data[3];

        //从缓冲中接收帧
        while(Recv_point_G<=Recv_edge_G)
        {
                if(state_machine == 0)
                {
                        //帧开始位标志
                        if(Recv_buffer[Recv_point_G++] == 0xfe)
                        {
                                state_machine = 1;
                        }
                        else
                        {
                                state_machine = 0;
                        }
                }
                if(state_machine == 1)
                {
                        //帧结束位标志
                        if(Recv_buffer[Recv_point_G]==0xff)
                        {
                                state_machine = 0;
                                Recv_point_G++;
                                //把接满的一帧放入有效数据中
                                 yediDatas[zen_data[0]].S_Station_ID = zen_data[0];
                                 yediDatas[zen_data[0]].Speed = zen_data[1];
                                 yediDatas[zen_data[0]].msFlag = zen_data[2];
                                zen_data_point = 0;
                        }
                        else
                        {

                                zen_data[zen_data_point]=Recv_buffer[Recv_point_G];//有在这句话运行之后!!!!!!
                                Recv_point_G++;
                                zen_data_point++;
                        }
                }
        }
        //把缓冲的数据读完之后就把接受缓冲清空
        Recv_edge_G = 0;
}

我在keil上运行该程序(是一个大程序中的一个子程序),以上子程序中,在“//有在这句话运行之后!!!!!!”标记处,变量
Recv_edge_G 突然变成fe这个值。很不解。

最新回复

3楼说得果然不错。我看了keil的反汇编代码(如下):    141:                         {    142:                                 zen_data[zen_data_point]=Recv_buffer[Recv_point_G]; C:0x02B6    AF1D     MOV      R7,0x1D C:0x02B8    7459     MOV      A,#Recv_buffer(0x59) C:0x02BA    2F       ADD      A,R7 C:0x02BB    F8       MOV      R0,A C:0x02BC    E6       MOV      A,@R0 C:0x02BD    FF       MOV      R7,A C:0x02BE    AE48     MOV      R6,0x48 C:0x02C0    7449     MOV      A,#0x49 C:0x02C2    2E       ADD      A,R6 C:0x02C3    F8       MOV      R0,A C:0x02C4    A607     MOV      @R0,0x07 //在此处zen_data数组越界!!    143:                                 Recv_point_G++; C:0x02C6    051D     INC      0x1D    144:                                 zen_data_point++; C:0x02C8    0548     INC      0x48    145:                         } 复制代码 在C:0x02C4处zen_data数组越界,多谢各位!!   详情 回复 发表于 2009-8-24 18:48
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
//帧开始位标志
if(Recv_buffer[Recv_point_G++] == 0xfe)
你是不是把Recv_buffer[Recv_point_G++] 的值看成是Recv_edge_G的

Recv_point_G怎么变  单步下吧
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
zen_data[zen_data_point]=Recv_buffer[Recv_point_G];//=?
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

4
 
1. 是不是异步事件、并发同步的问题
2. 数据类型错误、数组越界、堆栈问题
还有就是逻辑了
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 zyzhang365 的回复:
1. 是不是异步事件、并发同步的问题
2. 数据类型错误、数组越界、堆栈问题
还有就是逻辑了

一般都是这些原因,观察下堆栈看最多到多少
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
堆栈指针在m51文件中看到:
  IDATA   0093H     0001H     UNIT         ?STACK
我用的是52,有256RAM的。现在堆栈还有ffh-93h=63h,应该没有溢出。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 

1:zen_data[zen_data_point]=Recv_buffer[Recv_point_G];//我就是在这句开始单步的。
2:Recv_point_G++;
3:zen_data_point++;

在第一句执行之前Recv_edge_G还是为0,在这句执行之后就为0xfe了。不知道是什么原因。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

8
 
3楼说得果然不错。我看了keil的反汇编代码(如下):

  1.    141:                         {
  2.    142:                                 zen_data[zen_data_point]=Recv_buffer[Recv_point_G];
  3. C:0x02B6    AF1D     MOV      R7,0x1D
  4. C:0x02B8    7459     MOV      A,#Recv_buffer(0x59)
  5. C:0x02BA    2F       ADD      A,R7
  6. C:0x02BB    F8       MOV      R0,A
  7. C:0x02BC    E6       MOV      A,@R0
  8. C:0x02BD    FF       MOV      R7,A
  9. C:0x02BE    AE48     MOV      R6,0x48
  10. C:0x02C0    7449     MOV      A,#0x49
  11. C:0x02C2    2E       ADD      A,R6
  12. C:0x02C3    F8       MOV      R0,A
  13. C:0x02C4    A607     MOV      @R0,0x07 //在此处zen_data数组越界!!
  14.    143:                                 Recv_point_G++;
  15. C:0x02C6    051D     INC      0x1D
  16.    144:                                 zen_data_point++;
  17. C:0x02C8    0548     INC      0x48
  18.    145:                         }
复制代码


在C:0x02C4处zen_data数组越界,多谢各位!!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表