MPLAB XC8 + PIC18 + memoria externa = Error 712 (no se puede generar código para esta expresión)

5

Actualmente estoy pasando un mal momento al usar un chip de RAM externo (512 kB) con un PIC18F8720 y el compilador Microchip XC8 (v1.35, modo PRO).

Cada vez que intento escribir un código para modificar una variable en la memoria externa, el enlazador emite un error (712): "no se puede generar código para esta expresión". Esto no ocurre al leer las variables lejos : solo cuando escribe en ellas.

Este error es reproducible, incluso en este pequeño programa de ejemplo:

#include <xc.h>
#include <stdio.h>

far int intArray[10];
far int intVariable;

void main(void) {
    intVariable = 2; // --> ERROR 712
    intArray[1] = 3; // --> ERROR 712
    printf("%d\n", intVariable);
    printf("%d\n", intArray[0]);
}

Los comandos de compilación + vinculación son generados por MPLAB X v3.20:

  

"/opt/microchip/xc8/v1.35/bin/xc8" --pass1 --chip = 18F8720 -Q -G --double = 24 --float = 24 --emi = byteselect --ram = predeterminado, + 20000-9FFFF --opt = predeterminado, + asm, + asmfile, -speed, + espacio, -debug --addrqual = require --mode = pro -P -N255 --warn = -3 --asmlist - -summary = predeterminado, -psect, -class, + mem, -hex, -file --output = predeterminado, -inhx032 --runtime = predeterminado, + clear, + init, -keep, -no_startup, -download, + config , + clib, -plib --output = -mcof, + elf: multilocs --stack = compilado: auto: auto: auto "- formato =% f:% l: error: (% n)% s" "- -warnformat =% f:% l: advertencia: (% n)% s "" --msgformat =% f:% l: advisory: (% n)% s "-obuild / default / production / main.p1 main. c

     

"/opt/microchip/xc8/v1.35/bin/xc8" --chip = 18F8720 -G -mdist / default / production / Test01.X.production.map --double = 24 --float = 24 --emi = selección de bytes --ram = predeterminado, + 20000-9FFFF --opt = predeterminado, + asm, + asmfile, -speed, + espacio, -debug --addrqual = require --mode = pro -P -N255 - -warn = -3 --asmlist --summary = default, -psect, -class, + mem, -hex, -file --output = default, -inhx032 --runtime = default, + clear, + init, -keep , -no_startup, -download, + config, + clib, -plib --output = -mcof, + elf: multilocs --stack = compilado: auto: auto: auto "--errformat =% f:% l: error: (% n)% s "" --warnformat =% f:% l: advertencia: (% n)% s "" --msgformat =% f:% l: advertencia: (% n)% s "--memorysummary dist / default / production / memoryfile.xml -odist / default / production / Test01.X.production.elf compilación / default / production / main.p1

Salida de compilación:

  

main.c: 9: error: (712) no puede generar código para esta expresión
  main.c: 10: error: (712) no se puede generar código para esta expresión
  Microchip MPLAB XC8 C Compiler (Modo PRO) V1.35
  Fecha de construcción: 07/07/2015
  Versión de soporte de pieza: 1.35
  Copyright (C) 2015 Microchip Technology Inc.
  Tipo de licencia: Configuración del nodo

¿Qué estoy haciendo mal? La salida del compilador no ayuda mucho, ya que el error es demasiado genérico para dar alguna pista.

    
pregunta equalizer

1 respuesta

3

Estaba jugando con esto y parece que deberías informarle a Microchip, pero encontré una solución que podría ser útil en el ínterin. El problema solo parece ocurrir con variables de múltiples bytes fuera de una matriz o al intentar acceder al primer elemento de una matriz. El siguiente código compila OK y parece generar una salida de ensamblador plausible, aunque no tuve un chip con RAM externa para probar:

#include <xc.h>
#include <stdio.h>
#include <stdint.h>

far uint8_t intVariable;
far int intArray[1000];

void main(void) {
    intVariable = 1;
//    intArray[0] = 3; <<- Causes an error
    intArray[1] = 3;
    intArray[999] = 3;
    printf("%d\n", intVariable);
    printf("%d\n", intArray[1]);
}

Sospecho que, en base a eso, intenta realizar una optimización al escribir en una variable de múltiples bytes que cae, pero cuando está dentro de una matriz, genera el código completo para calcular el desplazamiento que parece funcionar bien. Tenga en cuenta que solo tengo el compilador gratuito, por lo que la edición Pro puede optimizar el acceso a la matriz constante, pero me imagino que cambiar el índice a una variable solucionaría eso si ocurriera.

Cuando comparé las opciones de mi compilador / enlazador con las suyas bajo las optimizaciones del compilador XC8, también tuve que habilitar el "Modo invariante de instrucciones" para que funcionara. Esperamos que esto pueda ponerlo en funcionamiento y sea un buen caso de prueba adicional para enviarlo a Microchip.

    
respondido por el PeterJ

Lea otras preguntas en las etiquetas