Usando la matriz como variables globales en IAR (STM32) [cerrado]

-4

He definido una matriz global en main.c:

__IO uint8_t data[3]={0,0,0};

luego, yo externo y asigno valores a esta matriz en otro archivo c:

extern __IO uint8_t *data;
INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4){

if(GPIO_ReadInputPin (GPIOB, GPIO_PIN_0) == SET)
  data[0] = 1;

if(GPIO_ReadInputPin (GPIOB, GPIO_PIN_1) == RESET);
  data[1] = 0;

if(GPIO_ReadInputPin (GPIOB, GPIO_PIN_1) == SET)
  data[1] = 1;

if(GPIO_ReadInputPin (GPIOB, GPIO_PIN_2) == RESET);
  data[2] = 0;

if(GPIO_ReadInputPin (GPIOB, GPIO_PIN_2) == SET)
  data[2] = 1; }

el problema es que no puedo cambiar el valor de 'datos' (obtengo la vara a través del modo de depuración de IAR mediante J-link). Si defino esta matriz como variable local puedo cambiar el valor:

__IO uint8_t data[3]={0,0,0};
INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4){

if(GPIO_ReadInputPin (GPIOB, GPIO_PIN_0) == SET)
  data[0] = 1;

if(GPIO_ReadInputPin (GPIOB, GPIO_PIN_1) == RESET);
  data[1] = 0;

if(GPIO_ReadInputPin (GPIOB, GPIO_PIN_1) == SET)
  data[1] = 1;

if(GPIO_ReadInputPin (GPIOB, GPIO_PIN_2) == RESET);
  data[2] = 0;

if(GPIO_ReadInputPin (GPIOB, GPIO_PIN_2) == SET)
  data[2] = 1; }

en el pasado, defino una variable global, no una matriz y puedo cambiar externamente el valor en otro archivo. entonces, ¿cuál es la diferencia entre un vriable y una matriz usada como globle?

    
pregunta oilpig

3 respuestas

3

La segunda declaración, extern __IO uint8_t *data; no declara una matriz, sino un puntero. Si bien las matrices y los punteros son ampliamente intercambiables en los argumentos de las funciones (los argumentos de la matriz se convierten implícitamente en punteros a sus primeros elementos), esto no se cumple en ningún otro lugar, como en este ejemplo.

Debes declararlo como extern __IO uint8_t data[3];

    
respondido por el Dave Tweed
1

Tu sangría indica que a las líneas les gusta

data[x] = 0;

debe ejecutarse condicionalmente, pero como la sentencia de if comparando con RESET termina con un punto y coma, son incondicionales.

    
respondido por el Alan Bell
0

Use el mismo tipo de declaración en su declaración extern que en la definición: data[3] .

    
respondido por el pjc50

Lea otras preguntas en las etiquetas