Advertencia PIC 364 relacionada con la inicialización de const

3

No puedo encontrar respuestas a esto en Internet, y lo he buscado dos veces en los últimos 4 meses.

En MPLab v8.88 usando el compilador ANSI C de alta tecnología, tengo esta línea de código:

const   uint8 SUM_THRESHOLD_MIN = 15;   /* comment edited out   */

y recibo la advertencia:

Warning [364] C:\*directory edited out* \ *filename_edited_out*.c; 273.35 attempt to modify object qualifed const

(disculpe las ediciones, pero sentí que debería eliminar detalles superfluos y personales).

No es mi código y solo usaría un #define , pero otros quieren usar un const (para aquellos que no lo saben: usar un const garantiza un encasillado adecuado de un valor y puede salvarlo de algunos problemas extraños relacionados con encasillamiento y tipos de datos; no es mi forma favorita de hacerlo, pero tampoco es una mala idea).

Hay varias inicializaciones de const ocurriendo en el mismo bloque de código, y todas me dan esta advertencia. Están en un archivo .c, en una función nula. Tengo otros archivos con funciones de anulación donde inicializo const uint8 y no hay advertencias en esos archivos. Busqué en todo el mundo y no encontré ninguna otra instancia de la variable, excepto la que se usa en la función void (por lo que no hay problemas con la redefinición ni nada de eso). Para ser claros, estas constantes no son parte de ninguna estructura ni nada extraño, simplemente se declaran en la función de vacío en el archivo .c.

Tengo uint8 correctamente typedef'd, y no # define'd (ver comentarios).

¿Puede alguien ayudarme a deshacerme de esta advertencia?

EDITAR: Si pego una de las const uint8 en otro archivo .c directamente después de una const uint16 que no produce el error, de esta forma:

const uint16 rate_bias_time_constant[NUM_RATE_CHANNELS][RATE_BIAS_STEP_MAX] = 
    {30,120,480,960,  300,120,180,240,  300,120,180,240 }; // comment edited out
const   uint8 SUM_THRESHOLD_MIN = 15;   /* comment edited out   */

Aparece la advertencia 364 en este archivo para esta const uint8 pero no para la const uint16. Si cambio SUM_THRESHOLD_MIN de un uint8 a un uint16, todavía recibo la advertencia. Para completar, si lo cambio de mayúsculas a minúsculas, sigo recibiendo la advertencia. Si cambio la línea a, por ejemplo:

const uint8 SUM_THRESHOLD_MIN[2] = {15,2};  /* comment edited out   */

No hay ninguna advertencia.

    
pregunta Bob

3 respuestas

2

Lo tengo, ¡y muchas gracias por la ayuda de todos!

Las declaraciones que no emiten advertencias son matrices o se declaran constantes estáticas uint8 / 16's. Por alguna razón, el compilador Hi-Tech C funciona bien con const int / char's, const uint8 / 16's que son arreglos, pero no const uint8 / 16's a menos que se declare como const static uint8 / 16.

    
respondido por el Bob
2

Debería apreciar que debido a la arquitectura impar del PIC16 / 18, un calificador "const" es una instrucción para colocar esa variable en Flash en lugar de RAM, no una instrucción para decirle al compilador que no se puede cambiar. .

Si está intentando inicializar el valor de una variable automática que es local para una función, ESTÁ intentando cambiarlo en tiempo de ejecución porque intentará escribir ese valor de inicialización en la variable (que se almacena en Flash y, por lo tanto, no se puede escribir (fácilmente)) cada vez que la función se ejecuta. La razón por la que funciona cuando la variable se declara estática es porque las variables estáticas que son locales para las funciones solo se inicializan una vez, por lo que no hay una inconsistencia lógica para que el compilador gire. Mi conjetura es que las matrices const se tratan de la misma manera.

    
respondido por el markt
0

Creo que el problema raíz es tu expectativa de cómo funciona CONST con este compilador en este procesador. Estas cosas no son variables como parece que esperan de su descripción. Es muy probable que se implementen como constantes en la memoria del programa, que es esencialmente de solo lectura. Estas cosas no se pueden cambiar en el tiempo de ejecución. El error que está recibiendo probablemente esté relacionado con el código de tiempo de ejecución que intenta escribir en el CONST, no en la definición del CONST.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas