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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.