Hola, como ya os dije anteriormente el error ese se debe a que puede surgir un problema de reentrancia al llamar a la funcion delay_ms o cualquier otra desde una interrupcion y desde el main. Para que entendais que es lo que puede ocurrir en caso de hacerlo os pongo un ejemplo:
int a = 25;
void funcion_no_reentrante(){
int c;
c = a;
a = c + 5;
}
#int_rtcc
void interrupcion(){
//codigo
funcion_no_reentrante();
//mas codigo
}
void main(){
while(1){
//codigo
funcion_no_reentrante();
//codigo
}
}
Si tenemos el codigo anterior y lo ponemos en ejecucion y vemos lo que ocurre en una pasada de ejecucion, pueden ocurrir varias cosas con la funcion funcion_no_reentrante y son las siguientes:
1- Se ejecuta la funcion en el main y despues ocurre la interrupcion y se vuelve a ejecutar, lo cual no produce ningun problema ya que el resultado sera a = 35, es decir se le suma dos veces 5 a la variable a.
2- Se ejecuta primero la funcion en la interrupcion y luego en el main, ocurre exactamente lo mismo que en el caso 1.
3- Suponemos ahora que mientras estamos con la ejecucion de la funcion en el main se ejecuta solamente c = a (c = 25); y se produce la interrupcion la cual llama a dicha funcion y la ejecuta y por tanto al salir de la interrupcion a = 30. Ahora se continua la ejecucion por donde se habia quedado desde que se produjo la interrupcion y por lo tanto se ejecuta el a = c +5; lo cual deja un resultado en a = 30, lo que es incorrecto, puesto que deberia de ser 35, es decir, se le deberia de haber sumado 10 a a.
4- Se pueden dar mas combinaciones, pero ninguna de ellas sera correcta, solo lo seran si se ejecutan las llamadas a la funcion en serie, es decir, primero una y luego la otra.
Despues de este ejemplo ilustrativo, podeis ver que lo que esta haciendo el compilador a la hora de deshabilitar las interrupciones cuando se llama a la funcion delay_ms desde el main, es precisamente para prevenir que ocurran errores como el anterior.
En la mayoria de las ocasiones el compilador de CCS no produce dicho error, puesto que dicho compilador trata de crear de hacer todas las funciones que pueda que sean inline, con esto ahorra problemas de este tipo y tambien reduce el uso de ram, aunque se aumenta el uso de la rom. Lo de inline, para el que no lo sepa lo que hace es sustituir la llamada a la funcion por el codigo de dicha funcion. Esto lo podeis comprobar al desensamblar el codigo, si mirais podeis ver que la mayoria de las veces al hacer un delay, por ejemplo, te pone el codigo correspondiente en vez de la llamada a la funcion.
uff, menudo rollo os he metio
, pero espero que asi quede la cosa mas clara.
Un saludo.