Pero tenes una diferencia MUY importante entre las 2 cosas que estas haciendo. Un macro no es una funcion como la anterior. Ya que al "llamarse" a esta, no se pone los datos dentro del stack, ni tampoco se procede a sacar las cosas de alli. Es decir no hay interaccion con el stack. La "funcion", o por asi decirlo las lineas de codigo estan en conjunto con lo demas.
Otra cosa, un macro por tener la misma caracteristicas de antes, hace que si lo usas varias veces, las lineas se repitan varias veces. Distinto a una funcion. Hay varias diferencias, espero tratar de llegar al punto. Pero esto no pasa por XC8 , sino por algo mas de C.
Luego veo mas el programa me extiendo si encuentro algo.
lo que intento saber es como puedo hacerle entender al compilador que el parametro que le estoy pasando a la funcion read, es decir, &ADC_buffer es constante ya que es una direccion de memoria fija?? si uso const buffer_circular *buffer entonecs el complador da error cuando intento modificar las variables de la estructura, gracias por la ayuda se lo agradesco mucho
Const significa que no se puede modificar. En los PIC esto se implementa en la Flash cuando se declara una variable, pero en tiempo de compilacion se revisa y si hay un intento de escritura es un error obviamente. &ADC_Buffer es "constante", en realidad no lo es, es generado por el linker luego de la compilacion. Pero recordar que ese parametro se pasa por el stack. Debido a que es un argumento de una funcion. Ese parametro que vos pasas, no es un valor fijo, es un valor cualquiera que es pasado a traves de la funcion, almacenado en el stack y que ocupa una posicion de la RAM ( es decir la direccion de ADC_Buffer ocupa una posicion de la RAM ) . Entonces tenes al PIC apuntando un FSR al stack + otro FSR a otro lado.
Otra diferencia que no se si se hizo notar en mi anterior parrafo.
1er codigo: Un codigo, multiples de buffers que se pueden usar.
2do codigo: Un codigo, un buffer.
Desventajas:
1er codigo: Manejar stack (tanto de llamada como de vuelta), pasar direccion del buffer + call + return, calcular posicion de los elementos, ya que como puede entrar cualquier direccion, debes calcularlas
2do codigo: Tamaño utilizado de flash al repetirse la "funcion". Si utilizas 2 veces la funcion fast_read() ya estarias ocupando el mismo lugar en flash que el 1er codigo, si lo usas 3 veces ya ocupas mas flash.
Ventajas:
1er codigo: Reutilizacion ( al usar el mismo codigo para cualquier valor )
2do codigo: Rapidez ( al no usar stack, ni calls, y ser especifico el codigo para ese bufferen cuestion)