[uCOS/uCGUI] ucos atmega128移植 二维数组赋值问题

michael52   2010-6-23 12:45 楼主
我使用I2C 读取90*18AD值, 读取的数据不到2K 的数据量,但是我定义了adlvoldata[90][18]二维数组,存储读取的AD值,在我的UCOS系统里,每当使用转存储到二维数组的时候,系统都会死。。。 不知道是什么原因。  

  1. OSSemPend(ReacPlateCirSem,5,&error);                               //反应盘旋转一周 信号
  2.           if(error==OS_NO_ERR)
  3.           {
  4.               if(!(ReadReacPlateStatus(0x04,&Status,&cup,&errcode)))       //读盘状态    比色杯号 错误码  状态(静止 运动)
  5.               {
  6.                
  7.                 AD_write(0xbe,0x55,0xb0,cup+0x59);
  8.                
  9.                 if(!(AD_read(0xbe,4,i2c_data)))
  10.                 {
  11.                
  12.                 }
  13.                
  14.               }
  15.               
  16.               while(I2cSendFlag==1)                             //读I2C 发送使能标志位
  17.               {
  18.                 I2cSendFlag =0;
  19.                 if(I2C_Status==0)                                //i2c 状态
  20.                   {
  21.                      AdReadFlag =1;                           //AD读写标志位
  22.                      AD_write(0xbe,0x55,0xc0,0x00);  
  23.                      for(int i=0;i<90;i++)
  24.                       {  
  25.                         errcode = 0x00;
  26.                          if(i == 89)
  27.                          {
  28.                            errcode = 0xff;
  29.                          }
  30.                           if(AD_read(0xbe,19,i2cRevData)==1)  //接收18个字节的AD值
  31.                           {
  32.                            
  33.                             if(PlateRotaCirRet==1)            //反应盘旋转一周标志位置1
  34.                             {
  35.                                 if(AdReadFlag ==1)
  36.                                 {
  37.                                    // ReturnADdata(i2cRevData,19,errcode);    //返回90*18 个AD采样值
  38.                                   for(int SaveCount=1;SaveCount<19;SaveCount++)
  39.                                   {
  40.                                     AdVolData[i][SaveCount]=i2cRevData[SaveCount];
  41.                                   }
  42.                                 }
  43.                             }
  44.                          }
  45.                       }
  46.                    AD_write(0xbe,0x55,0x71,0x00);
  47.                  }
  48.                 AD_write(0xbe,0x55,0x71,0x00);
  49.                }

请各位大侠,多多帮忙。。。  十分感谢  在线期待、。。。。。。。。。。。。。。。。。。

回复评论 (8)

是不是时间太长了?

任务被中断掉,读写错误了?
点赞  2010-6-23 14:50
怎么解决这个时间长短的问题呢?  小弟实在想不出来办法。。
点赞  2010-6-23 14:54
  ReturnADdata(i2cRevData,19,errcode);    //返回90*18 个AD采样值
/*
for(int SaveCount=1;SaveCount<19;SaveCount++)
{
  AdVolData[SaveCount]=i2cRevData[SaveCount];
  }
*/
把代码修改为如上,程序在读到18字节AD值,立即发送给上位机,程序是没有问题的 。  但是转存到二维数组就出现问题,系统死机。
点赞  2010-6-23 15:03
我也刚刚学UCOS,具体的我也不太清楚

我出一个你看一下:

把读写操作ADC写成一个任务,通过任务的通信来实现传输

这样,虽然仍会中断,但是,代码小到每一个任务里,就不会出现错误的情况了

如果不想这样,那么在在这段代码前关掉任务调度,出了再开试试
点赞  2010-6-23 15:08
如果你怀疑是二维数组的问题,可以定义一个一维数组, buff[18*90], 要全局变量哦
点赞  2010-6-23 15:22
还有如果涉及缓冲的长度问题的话,可以先采样几十个试试;
如果是任务被打断的问题,可以在采样和取数据前后关闭和再打开任务调度,有现成的系统函数可以调用的
点赞  2010-6-23 15:27

  1. for(int SaveCount=1;SaveCount<19;SaveCount++)
  2.                                   {
  3.                                     AdVolData[i][SaveCount]=i2cRevData[SaveCount];
  4.                                   }

定义了AdVolData[90][18],
循环里AdVolData[1]~AdVolData[18],
最后越界
点赞  2010-6-23 15:29
楼上说的情况 我看到了 已经更正了 。。   不过我的问题还是没有解决 定义一个90*18的一维数组也是不不行的 ,只要有赋值到数组的语句 程序就死机了
点赞  2010-6-23 16:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复