Forum: Compiler & IDEs Deklaration und Initalisierung von Array im XC32-Comiler


von Rumburak (Gast)


Lesenswert?

Hallo Foristen,

ich habe folgendes C-Code Fragment in einen Programm für einen 16-Bit 
PIC24-µC.

typedef unsigned char BYTE;

#define REVISION {0x32,0x45,0x43,0x14,0x0A,0x42,0x02,0x00}

BYTE buff[8] = REVISION;

dieser C-Code funktioniert so wie es ist im XC16 v1.24 Compiler.
Dieses Fragment sollte später auch auf einen PIC32 mit XC32 Compiler 
v1.4 eingesetzt werden.

Im XC32-Compiler funktioniert dieses Fragment so nicht. Die Werte aus 
REVISION werden den Array nicht übergeben.
Auch das Deklarieren und initalisieren eines Byte-Array so wie hier nach 
C99-Standard

BYTE testarray[] = {0x00, 0x01, 0x02, 0x03};

funktioniert nicht. Die Werte werden so in das Array nicht übernommen, 
es sind stets Zufallswerte eingetragen auch nicht bei

BYTE testarray[] = {0, 0, 0, 0};

Aber das Initalisieren mit Zeichen funktioniert so wie hier.

BYTE testarray[] = {'1', '2', '3', '4'};

Das ist aber nicht das gleiche!
Ich habe das nun so gelöst und das funktioniert auch so.

BYTE buff[8];

buff[0]=0x32;
buff[1]=0x45;
buff[2]......
.............

Was mache ich an oberer Stelle falsch?
Liegt es am Compiler, dass das Array wie oben nicht so deklariert und 
initalisiert werden kann?

Mit freundlichen Grüßen.

von Torsten (Gast)


Lesenswert?

Hi,
Für mich klingt das so, als wenn linker Script / Startup file, das RAM 
nicht komplett initialisiert. Hast du das selbst geschrieben?

Mit freundlichen Grüßen
Torsten

von Rumburak (Gast)


Lesenswert?

Hallo Torsten,

nein,oberes Fragment ist aus einen fertigen Programm das ein Mitarbeiter 
geschrieben hatte. Die XC32-Compiler ist von Microchip.

Mit freudlichen Grüßen

von Arc N. (arc)


Lesenswert?

Kurzer Test
1
#include <xc.h>
2
#include <stdio.h>
3
4
void _mon_putc (char c) {
5
   //while (U3STAbits.UTXBF); //Wait till transmission is complete
6
   U3TXREG = c;
7
}
8
#define REVISION {0x32,0x45,0x43,0x14,0x0A,0x42,0x02,0x00}
9
10
typedef unsigned char BYTE;
11
BYTE buff[8] = REVISION;
12
13
int main(void) {
14
    BYTE buff2[8] = REVISION;
15
   
16
    printf("%s\n%s", buff, buff2);
17
    return 0;
18
}

funktioniert hier 1) (mit und ohne -std=c99 im Makefile).
Auch das Assembler-Listing passt dazu.
Target war ein PIC32MZ2048EFM144 (sollte eigentlich keine Rolle 
spielen).
Compiler XC32 v1.4

Aus dem generierten .map
1
kseg0 Data-Memory Usage
2
section                    address  length [bytes]      (dec)  Description
3
-------                 ----------  -------------------------  -----------
4
.sdata                  0x80000000           0x2c          44  Small init data 
5
.data                   0x8000002c           0xa4         164  Initialized data 
6
.bss                    0x800000d0           0x44          68  Uninitialized data 
7
...
8
 .sdata         0x80000000        0x8 build/default/production/main.o
9
                0x80000000                buff

Abschnitt aus dem Makefile (von MPLAB X erzeugt)
1
# Rules for buildStep: compile
2
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
3
${OBJECTDIR}/main.o: main.c  nbproject/Makefile-${CND_CONF}.mk
4
  @${MKDIR} "${OBJECTDIR}" 
5
  @${RM} ${OBJECTDIR}/main.o.d 
6
  @${RM} ${OBJECTDIR}/main.o 
7
  @${FIXDEPS} "${OBJECTDIR}/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../  -c ${MP_CC}  $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_SIMULATOR=1 -fframe-base-loclist  -x c -c -mprocessor=$(MP_PROCESSOR_OPTION)  -O3 -fomit-frame-pointer -fschedule-insns -fschedule-insns2 -MMD -MF "${OBJECTDIR}/main.o.d" -o ${OBJECTDIR}/main.o main.c      -std=c99
8
  
9
else
10
${OBJECTDIR}/main.o: main.c  nbproject/Makefile-${CND_CONF}.mk
11
  @${MKDIR} "${OBJECTDIR}" 
12
  @${RM} ${OBJECTDIR}/main.o.d 
13
  @${RM} ${OBJECTDIR}/main.o 
14
  @${FIXDEPS} "${OBJECTDIR}/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../  -c ${MP_CC}  $(MP_EXTRA_CC_PRE)  -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION)  -O3 -fomit-frame-pointer -fschedule-insns -fschedule-insns2 -MMD -MF "${OBJECTDIR}/main.o.d" -o ${OBJECTDIR}/main.o main.c      -std=c99
15
  
16
endif
17
18
# ------------------------------------------------------------------------------------
19
# Rules for buildStep: compileCPP
20
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
21
else
22
endif
23
24
# ------------------------------------------------------------------------------------
25
# Rules for buildStep: link
26
ifeq ($(TYPE_IMAGE), DEBUG_RUN)
27
dist/${CND_CONF}/${IMAGE_TYPE}/TestArray.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES}  nbproject/Makefile-${CND_CONF}.mk    
28
  @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} 
29
  ${MP_CC} $(MP_EXTRA_LD_PRE)  -mdebugger -D__MPLAB_DEBUGGER_SIMULATOR=1 -mprocessor=$(MP_PROCESSOR_OPTION)  -o dist/${CND_CONF}/${IMAGE_TYPE}/TestArray.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED}                -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,--defsym=__MPLAB_DEBUGGER_SIMULATOR=1,-Map="${DISTDIR}/${PROJECTNAME}.${IMAGE_TYPE}.map",--memorysummary,dist/${CND_CONF}/${IMAGE_TYPE}/memoryfile.xml
30
  
31
else
32
dist/${CND_CONF}/${IMAGE_TYPE}/TestArray.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES}  nbproject/Makefile-${CND_CONF}.mk   
33
  @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} 
34
  ${MP_CC} $(MP_EXTRA_LD_PRE)  -mprocessor=$(MP_PROCESSOR_OPTION)  -o dist/${CND_CONF}/${IMAGE_TYPE}/TestArray.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED}            -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),-Map="${DISTDIR}/${PROJECTNAME}.${IMAGE_TYPE}.map",--memorysummary,dist/${CND_CONF}/${IMAGE_TYPE}/memoryfile.xml
35
  ${MP_CC_DIR}\\xc32-bin2hex dist/${CND_CONF}/${IMAGE_TYPE}/TestArray.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} 
36
endif

1) dass u.U. statt 0x0a 0x0d und 0x0a ausgegeben wird, sollte nicht 
verwundern

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.