Вызов должен иметь указатель - проблема с CCS - PullRequest
0 голосов
/ 24 октября 2018

Я новичок здесь, но у меня проблема без ответа.Я работаю с TM4C1294 из Техаса и в коде есть бесчисленные ошибки.Но сначала у меня есть этот код.Как вы можете видеть, x3 имеет чтение с PIN-кода ADC0, но ошибка, выдаваемая мне на дорожке, (об. Игнорируйте звездочку перед #, а код не завершен, потому что остальная часть тела в CCS слишком велика).Спасибо за внимание!!

 %declaration of pointers to PIN read
 #define F_SAMPLE   2000    
 #define  x0    *ADC3_read  
 #define  x1    *ADC2_read  
 #define  x2     *ADC1_read  
 #define  x3     *ADC0_read  
 #define  x4     *ADC4_read

 %declaration of variables
 int PI = 3.14159;
 int teste = 0;
 float y_0, ya1, yb1, y_1;
 float y0_aux, ya1_aux, yb1_aux;
 int alfa, i, j;

 %declaration of PIN read
 uint32_t ADC_read[5];              
 uint32_t *ADC0_read=&ADC_read[0];  
 uint32_t *ADC1_read=&ADC_read[1];  
 uint32_t *ADC2_read=&ADC_read[2];   
 uint32_t *ADC3_read=&ADC_read[3];   
 uint32_t *ADC4_read=&ADC_read[4];

%control code
   for( i=0; i <= 12000; i++)
{
    alfa = alfa + (2*PI/200);
   if (alfa >= 2*PI)
      alfa = alfa - 2*PI;
j++;
y0_aux = y0_aux + x3[i]; %error=identifier "x3" is undefined 
ya1_aux = ya1_aux + x3[i]*sin(alfa); 
yb1_aux = yb1_aux + x3[i]*cos(alfa); 
if(j==200){
   y_0 = y0_aux/200;
   ya1 = ya1_aux/200;
   yb1 = yb1_aux/200;

  y_1 = sqrt((ya1 * ya1) + (yb1 * yb1)); 

  y0_aux = 0;
  ya1_aux = 0;
  yb1_aux = 0;
  j = 0;
    }
}
}

1 Ответ

0 голосов
/ 25 октября 2018

Предостережение: Это может быть неполно, поскольку я не уверен в вашем конечном результате, но мы можем устранить ошибки компиляции.Мне пришлось немного повозиться, чтобы добавить функцию main, чтобы я мог получить что-то скомпилируемое.

Вот обновленная версия вашей последней программы [с ошибками]:

#include <stdint.h>
#include <math.h>

// declaration of pointers to PIN read
#define F_SAMPLE   2000
#define  x0    *ADC3_read
#define  x1    *ADC2_read
#define  x2     *ADC1_read
#define  x3     *ADC0_read
#define  x4     *ADC4_read

int
main(void)
{

    // declaration of variables
    int PI = 3.14159;
    int teste = 0;
    float y_0,
     ya1,
     yb1,
     y_1;
    float y0_aux,
     ya1_aux,
     yb1_aux;
    int alfa,
     i,
     j;

    // declaration of PIN read
    uint32_t ADC_read[5];
    uint32_t *ADC0_read = &ADC_read[0];
    uint32_t *ADC1_read = &ADC_read[1];
    uint32_t *ADC2_read = &ADC_read[2];
    uint32_t *ADC3_read = &ADC_read[3];
    uint32_t *ADC4_read = &ADC_read[4];

    // control code
    for (i = 0; i <= 12000; i++) {
        alfa = alfa + (2 * PI / 200);
        if (alfa >= 2 * PI)
            alfa = alfa - 2 * PI;
        j++;

        // error = identifier "x3" is undefined
        y0_aux = y0_aux + x3[i];
        ya1_aux = ya1_aux + x3[i] * sin(alfa);
        yb1_aux = yb1_aux + x3[i] * cos(alfa);

        if (j == 200) {
            y_0 = y0_aux / 200;
            ya1 = ya1_aux / 200;
            yb1 = yb1_aux / 200;

            y_1 = sqrt((ya1 * ya1) + (yb1 * yb1));

            y0_aux = 0;
            ya1_aux = 0;
            yb1_aux = 0;
            j = 0;
        }
    }
}

Это вывод ошибки gcc:

fix1.c: In function ‘main’:
fix1.c:9:17: error: invalid type argument of unary ‘*’ (have ‘uint32_t {aka unsigned int}’)
 #define  x3     *ADC0_read
                 ^
fix1.c:46:21: note: in expansion of macro ‘x3’
   y0_aux = y0_aux + x3[i];
                     ^~
fix1.c:9:17: error: invalid type argument of unary ‘*’ (have ‘uint32_t {aka unsigned int}’)
 #define  x3     *ADC0_read
                 ^
fix1.c:47:23: note: in expansion of macro ‘x3’
   ya1_aux = ya1_aux + x3[i] * sin(alfa);
                       ^~
fix1.c:9:17: error: invalid type argument of unary ‘*’ (have ‘uint32_t {aka unsigned int}’)
 #define  x3     *ADC0_read
                 ^
fix1.c:48:23: note: in expansion of macro ‘x3’
   yb1_aux = yb1_aux + x3[i] * cos(alfa);
                       ^~

Вот один из способов изменить ситуацию [это компилируется чисто]:

#include <stdint.h>
#include <math.h>

// declaration of pointers to PIN read
#define F_SAMPLE   2000
#define  x0    ADC3_read
#define  x1    ADC2_read
#define  x2    ADC1_read
#define  x3    ADC0_read
#define  x4    ADC4_read

int
main(void)
{

    // declaration of variables
    int PI = 3.14159;
    int teste = 0;
    float y_0,
     ya1,
     yb1,
     y_1;
    float y0_aux,
     ya1_aux,
     yb1_aux;
    int alfa,
     i,
     j;

    // declaration of PIN read
    uint32_t ADC_read[5];
    uint32_t *ADC0_read = &ADC_read[0];
    uint32_t *ADC1_read = &ADC_read[1];
    uint32_t *ADC2_read = &ADC_read[2];
    uint32_t *ADC3_read = &ADC_read[3];
    uint32_t *ADC4_read = &ADC_read[4];

    // control code
    for (i = 0; i <= 12000; i++) {
        alfa = alfa + (2 * PI / 200);
        if (alfa >= 2 * PI)
            alfa = alfa - 2 * PI;
        j++;

        // error = identifier "x3" is undefined
        y0_aux = y0_aux + x3[i];
        ya1_aux = ya1_aux + x3[i] * sin(alfa);
        yb1_aux = yb1_aux + x3[i] * cos(alfa);

        if (j == 200) {
            y_0 = y0_aux / 200;
            ya1 = ya1_aux / 200;
            yb1 = yb1_aux / 200;

            y_1 = sqrt((ya1 * ya1) + (yb1 * yb1));

            y0_aux = 0;
            ya1_aux = 0;
            yb1_aux = 0;
            j = 0;
        }
    }
}

Вот альтернативный способ его кодирования [это также компилируется чисто]:

#include <stdint.h>
#include <math.h>

// declaration of pointers to PIN read
#define F_SAMPLE   2000
#define  x0(o)    ADC3_read[o]
#define  x1(o)    ADC2_read[o]
#define  x2(o)    ADC1_read[o]
#define  x3(o)    ADC0_read[o]
#define  x4(o)    ADC4_read[o]

int
main(void)
{

    // declaration of variables
    int PI = 3.14159;
    int teste = 0;
    float y_0,
     ya1,
     yb1,
     y_1;
    float y0_aux,
     ya1_aux,
     yb1_aux;
    int alfa,
     i,
     j;

    // declaration of PIN read
    uint32_t ADC_read[5];
    uint32_t *ADC0_read = &ADC_read[0];
    uint32_t *ADC1_read = &ADC_read[1];
    uint32_t *ADC2_read = &ADC_read[2];
    uint32_t *ADC3_read = &ADC_read[3];
    uint32_t *ADC4_read = &ADC_read[4];

    // control code
    for (i = 0; i <= 12000; i++) {
        alfa = alfa + (2 * PI / 200);
        if (alfa >= 2 * PI)
            alfa = alfa - 2 * PI;
        j++;

        // error = identifier "x3" is undefined
        y0_aux = y0_aux + x3(i);
        ya1_aux = ya1_aux + x3(i) * sin(alfa);
        yb1_aux = yb1_aux + x3(i) * cos(alfa);

        if (j == 200) {
            y_0 = y0_aux / 200;
            ya1 = ya1_aux / 200;
            yb1 = yb1_aux / 200;

            y_1 = sqrt((ya1 * ya1) + (yb1 * yb1));

            y0_aux = 0;
            ya1_aux = 0;
            yb1_aux = 0;
            j = 0;
        }
    }
}

Но, индексирование из ADC0_read не имеет смысла для меня.Ваш for цикл переходит к 12000, но ADC_read имеет только 5 элементов, поэтому любой вариант, приведенный выше, вероятно, приведет к segfault, потому что вы идете далеко за конец массива.

Скорее всего, вы можете захотеть что-то вроде:

uint32_t ADC_read[12000];

#define x3(o)   ADC_read[(o) + 0]
#define x2(o)   ADC_read[(o) + 1]
...

Честно говоря, я не вижу, как отдельные указатели (ADC3_read и т. Д.) Вписываются в [хорошо]

...