El mayor problema que yo veo al usar variables globales es que una variable así puede ser modificada al mismo tiempo por 2 o más subrutinas, afectando su valor esperado.
Ejemplo:
//Variable global
int32 conteo;
//Función principal
void main(void)
{
while(1)
{
delay_ms(1000);
++conteo;
}
}
//Función que se ejecuta al ocurrir una interrupción por timer 0
timer0()
{
if(conteo==0x10000000)
--conteo;
}
Lo que sucede es que cada 1s se incrementa el valor de la variable global conteo, la cual está armada con 4 bytes y hay que manipular uno por uno. ¿Pero qué pasa cuando llega la interrupción timer0 justamente cuando se está manipulando el valor de conteo? Supongamos que el pic apenas estaba manipulando el primer byte y llega la interrupción timer 0. El valor que va a comparar el if será un valor erróneo ya que no está completo, la variable todavía estaba a media modificación.
Si de casualidad coincide con 0x10000000, entonces se volverá a manipular el contenido de conteo erróneamente.
Al regresar de la interrupción, el pic seguirá manipulando el contenido de conteo... sin saber que ya fue manipulado por alguien más y por lo tanto afectará por 2da vez el valor real de la variable.
En conclusión, las variables globales no son peligrosas, pero hay que saber quién las manipulará y en qué momento. Hay que evitar colisiones. Lo mejor es siempre escribir variables locales. Si es necesario declararlas como globales, habrá que establecer algún mecanismo de protección de datos tales como semáforos o banderas que indiquen que la variable está siendo modificada por alguien más (ejemplo, el bit 7 UOWN que indica que el hardware usb de un pic está trabajando el contenido de un buffer).