Deklaration und Initalisierung von Array im XC32-Comiler

Gast #4484109
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.
#4485163
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren