5 votos

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

Actualmente lo estoy pasando mal intentando utilizar un chip de RAM externa (512 kB) con un PIC18F8720 y el compilador Microchip XC8 (v1.35, modo PRO).

Cada vez que intento escribir algún código para modificar una variable en la memoria externa, el enlazador lanza un error (712): "no se puede generar código para esta expresión". Esto no ocurre al leer lejos variables: sólo cuando escribir en ellos.

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+enlace 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=default,+20000-9FFFF --opt=default,+asm,+asmfile,-speed,+space,-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=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%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=byteselect --ram=default,+20000-9FFFF --opt=default,+asm,+asmfile,-speed,+space,-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=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" --memorysummary dist/default/production/memoryfile. xml -odist/default/production/Test01.X.production.elf build/default/production/main.p1

Salida de compilación:

main.c:9: error: (712) no se 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 Compilador C (Modo PRO) V1.35
Fecha de construcción: Jul 7 2015
Soporte de piezas Versión: 1.35
Copyright (C) 2015 Microchip Technology Inc.
Tipo de licencia: Configuración de nodo

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

3voto

xilun Puntos 261

Sólo estaba jugando un poco con esto y parece que es algo que debe informar a Microchip, pero he encontrado una solución que podría ser útil en el ínterin. El problema sólo parece ocurrir con variables multibyte fuera de un array o cuando se intenta acceder al primer elemento de un array. El siguiente código compila bien y parece generar una salida de ensamblador plausible, aunque no tenía un chip con RAM externa para probarlo:

#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 basándome en que intenta realizar alguna optimización al escribir en una variable multibyte que se cae, pero cuando está dentro de un array genera el código completo para calcular el offset que parece funcionar bien. Tenga en cuenta que sólo tengo el compilador libre por lo que la edición pro puede optimizar el acceso constante de matriz, pero me imagino que cambiar el índice a una variable arreglaría eso si sucede.

Cuando comparé mis opciones de compilador / enlazador con las tuyas en las optimizaciones del compilador XC8 también tuve que activar el "Modo Invariante de Instrucción" para que funcionara. Espero que esto te ayude a ponerlo en marcha y podría ser un buen caso de prueba adicional para enviar a Microchip.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X