Deklaration und Initalisierung von Array im XC32-Comiler

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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.