动态C - 使用writeUserBlockArray()时出错

时间:2011-12-29 10:24:11

标签: c memory-management dynamic-c

编辑 - 以下是回应评论的一些资源:

费用:http://bamafolks.com/randy/students/embedded/dynamicC_mtask.html

writeUserBlockArray:http://ftp1.digi.com/support/documentation/html/DynCFunctionReference/12fun595.htm#1259708

我得到的错误是“-1:地址或范围无效”。

#define MAX_SAMPLES 20
#define REPORT_AFTER 3

main()
{
    int i;
    int report;

    int write_result;
    int read_result;

    struct temp_struct {
        float celcius;
        float fahrenheit;
    } temperature_data;

    struct temp_struct save_data[MAX_SAMPLES];
    struct temp_struct read_data[MAX_SAMPLES];
    unsigned int save_lens[MAX_SAMPLES];

    float *pTempC, *pTempF;

    pTempC = &temperature_data.celcius;
    pTempF = &temperature_data.fahrenheit;

    i = 0;
    report = 0;

    brdInit();

    while(1)
    {
       costate
       {
           sampleTemp(&temperature_data.celcius, &temperature_data.fahrenheit);

           save_data[i].celcius = *pTempC;
           save_data[i].fahrenheit = *pTempF;
           save_lens[i] = sizeof(temperature_data);

           if(i==MAX_SAMPLES) i=0; else i++;
           report=1; // Sample has been taken, a report can be produced
           waitfor(DelaySec(SAMPLE_DELAY_SECS));
       }

       // If REPORT_AFTER set to 3, this executed every third sample taken.
       // "report" the last set of data saved by printing out
       if(report && i%REPORT_AFTER==0 && i!=0)
       {
          write_result = writeUserBlockArray(i-REPORT_AFTER, save_data, save_lens, REPORT_AFTER);
          // Read data to check it was saved correctly
          read_result = readUserBlockArray(read_data, save_lens, REPORT_AFTER, i-REPORT_AFTER);

          // Print out all data saved here.

          report = 0; // Do not report again until another sample has been taken.
          break; // Stops after first report. Can be removed later
       } // end if
    } // end while
} // end main

float sampleTemp(float *tempC, float *tempF)
{
   auto float  Tk,      //calculated temperature kelvins
                    Draw;       //raw data value
   auto int i;

   printf("Getting temperature\n\n");

   Draw = anaIn(7, SINGLE, GAIN_1);

   //calculate temperature in kelvins
   Tk = (Bt*Tkstd) / ( Tkstd * ( log( fabs( (-Draw*Rs) / (Rtstd*(Draw-(Dmax*Gain))) ) ) ) + Bt );

   *tempC = Tk - 273.15;                //convert to celcius
   *tempF = 1.8*(Tk - 255.37);      //calculate fahrenheit

   return 0;
}

这是所有相关的代码。我始终从-1方法返回writeUserBlockArray(),该方法表示无效的地址或范围。

我不认为它是Dynamic-C的事实有很大不同,但违规方法的大纲是:

writeUserBlockArray(addrOffset, arraySources, arraySourceSizes, numSources);

我是C的新手,我认为我将数据保存到数组的方式有问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

问题在于我试图将数据数组写入内存。使用writeUserBlockArray(...)方法的实际方法是指定一个指针数组。

新的,有效的代码:

#define SAMPLE_DELAY_SECS 5
#define MAX_SAMPLES 20
#define REPORT_AFTER 3

main()
{
   int temp;

   int i; // Iteration #
   int report; // Whether to produce a report or not

   int write_result; // The numerical result of the write-to-memory operation
   int read_result; // The numerical result of the read-from-memory operation

   // Define a structure which can be used to hold both temperature measurements
   struct temp_struct {
        float celcius;
      float fahrenheit;
   } temperature_data;

   void *save_pointers[MAX_SAMPLES]; // An array of pointers pointing to the data to be saved in memory
   struct temp_struct save_data[MAX_SAMPLES]; // Array of actual data which can be loaded with the read operation
   unsigned int save_lens[MAX_SAMPLES]; // An array of the size (in bytes) of each element in the save_data array

   i = 0;
   report = 0;

   brdInit(); // Needs to be called before any operations are performed with the hardware.

   while(1)
   {
      /*
       * Costate is a way of multitasking in Dynamic-C. By using a costate block in
       * conjunction with the waitfor keyword, the block can be paused until it
       * has finished waiting.
       *
       * Further info:
       * http://bamafolks.com/randy/students/embedded/dynamicC_mtask.html
       */
      costate
      {
        // Method taken from: http://read.pudn.com/downloads107/sourcecode/embed/441399/Samples/RCM3700/Tcpip/RabbitWeb/TEMPERATURE.C__.htm
        sampleTemp(&temperature_data.celcius, &temperature_data.fahrenheit);

        save_pointers[i] = &temperature_data;
        save_lens[i] = sizeof(temperature_data);

        printf("save_data[%d].celcius is %f\n", i, save_data[i].celcius);
        printf("save_data[%d].fahrenheit is %f\n\n", i, save_data[i].fahrenheit);

        if(i==MAX_SAMPLES) i = 0; else i++;

        report=1; // Sample has been taken, a report can be produced
        waitfor(DelaySec(SAMPLE_DELAY_SECS));
      }

      /*
       * This IF block is used to produce a report every so often, either by
       * emailing out some data, updating the web interface or simply printing
       * it to the screen.
       *
       * A report will be produced when:
       *   a) a new sample has been taken (report)
       *   b) the desired number of samples has been reached (i%REPORT_AFTER==0)
       *   c) it is not the very first sample to be taken (i!=0)
       */
      if(report && i%REPORT_AFTER==0 && i!=0) // For every third sample
      {
         /*
          * writeUserBlockArray(address_offset (unsigned int),
          *             sources (array),
          *             source_sizes (array),
          *             num_sources (int));
          * Documentation:
          * http://ftp1.digi.com/support/documentation/html/DynCFunctionReference/12fun595.htm#1259708
          */
         write_result = writeUserBlockArray(i-REPORT_AFTER, save_pointers, save_lens, REPORT_AFTER);

         /*
          * readUserBlockArray(destinations (array),
          *            destination_sizes (array),
          *            num_sources (int),
          *            address_offset (unsigned int));
          * Documentation:
          * http://ftp1.digi.com/support/documentation/html/DynCFunctionReference/12fun441.htm#1259907
          */
         read_result = readUserBlockArray(save_data, save_lens, REPORT_AFTER, i-REPORT_AFTER);

         printf("Write Result: %d\nRead Result: %d\n\n", write_result, read_result);

         printf("Most recent data...\n");
         for(temp = 0; temp < REPORT_AFTER; temp++)
         {
        printf("save_data[%d].C: %f\n", temp, save_data[temp].celcius);
            printf("save_data[%d].F: %f\n", temp, save_data[temp].fahrenheit);
         }

         report = 0; // Do not report again until another sample has been taken.
      }// End if
   }// End while
}// End main