IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

probleme avec devkitpro (prog. GBA)


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut probleme avec devkitpro (prog. GBA)
    Bonsoir,

    Je ne sais pas si je suis au bon endroit pour poser ma question.

    je commence dans la programmation en C/C++

    je suis en train de suivre les cours de programmation de la GBA: http://gfx.developpez.com/prog-gba
    au lieu d'utiliser devkitadvance , j'utilise devkitpro

    pour le premier cours en modifiant le makefile:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #
    # Makefile for main.gba
    #
    PATH := $(DEVKITARM)/bin:$(PATH)
    # --- Project details -------------------------------------------------
    PROJ := main
    TARGET := $(PROJ)
    OBJS := $(PROJ).o
    # --- Build defines ---------------------------------------------------
    PREFIX := arm-none-eabi-
    CC := $(PREFIX)gcc
    LD := $(PREFIX)gcc
    OBJCOPY := $(PREFIX)objcopy
    ARCH := -mthumb-interwork -mthumb
    SPECS := -specs=gba.specs
    CFLAGS := $(ARCH) -O2 -Wall -fno-strict-aliasing
    LDFLAGS := $(ARCH) $(SPECS)
    .PHONY : build clean
    # --- Build -----------------------------------------------------------
    # Build process starts here!
    build: $(TARGET).gba
    # Strip and fix header (step 3,4)
    $(TARGET).gba : $(TARGET).elf
    		$(OBJCOPY) -v -O binary $< $@
    		-@gbafix $@
    # Link (step 2)
    $(TARGET).elf : $(OBJS)
    		$(LD) $^ $(LDFLAGS) -o $@
    # Compile (step 1)
    $(OBJS) : %.o : %.cpp
    		$(CC) -c $< $(CFLAGS) -o $@
    # --- Clean -----------------------------------------------------------
    clean :
    		@rm -fv *.gba
    		@rm -fv *.elf
    		@rm -fv *.o
    #EOF
    puisque j'arrive à le compiler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    arm-none-eabi-gcc -c main.cpp -mthumb-interwork -mthumb -O2 -Wall -fno-strict-aliasing -o main.o
    arm-none-eabi-gcc main.o -mthumb-interwork -mthumb -specs=gba.specs -o main.elf
    arm-none-eabi-objcopy -v -O binary main.elf main.gba
    copy from `main.elf' [elf32-littlearm] to `main.gba' [binary]
    ROM fixed!
    pour le cours 2 avec le meme makefile:
    dans main.cpp en modifiant(sinon je ne pouvvais pas compiler):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void flipBuffers()
    {
      if (*mode & BACKBUFFER)
      {
        *mode &= ~BACKBUFFER;
        videoBackBuffer;
      } else {
        *mode |= BACKBUFFER;
        videoFrontBuffer;
      }
     
    } // fin flipBuffers()
    le programme compile bien malgre des warning:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    arm-none-eabi-gcc -c main.cpp -mthumb-interwork -mthumb -O2 -Wall -fno-strict-aliasing -o main.o
    main.cpp: In function 'void flipBuffers()':
    main.cpp:17:31: warning: statement has no effect [-Wunused-value]
     #define videoBackBuffer       (u16*) 0x600A000
                                   ^~~~~~~~~~~~~~~~
    main.cpp:95:5: note: in expansion of macro 'videoBackBuffer'
         videoBackBuffer;
         ^~~~~~~~~~~~~~~
    main.cpp:16:31: warning: statement has no effect [-Wunused-value]
     #define videoFrontBuffer      (u16*) 0x6000000
                                   ^~~~~~~~~~~~~~~~
    main.cpp:98:5: note: in expansion of macro 'videoFrontBuffer'
         videoFrontBuffer;
         ^~~~~~~~~~~~~~~~
    arm-none-eabi-gcc main.o -mthumb-interwork -mthumb -specs=gba.specs -o main.elf
    arm-none-eabi-objcopy -v -O binary main.elf main.gba
    copy from `main.elf' [elf32-littlearm] to `main.gba' [binary]
    ROM fixed!
    pour le cours 3 (compilation impossible) avec le makefile:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #
    # cours3
    # 
     
    PATH := $(DEVKITARM)/bin:$(PATH)
     
    # --- Project details -------------------------------------------------
     
    PROJ    := main
    TITLE   := $(PROJ)
     
    COBJS   := $(PROJ).o fastrandom.o
     
    OBJS	:= $(COBJS)
     
    # --- boot type (MB=0 : normal. MB=1 : multiboot) ---
     
    MB = 0
     
    ifeq ($(MB),1)
     
    TARGET	:= $(PROJ).mb
    SPECS	:= -specs=gba_mb.specs
     
    else
     
    TARGET	:= $(PROJ)
    SPECS	:= -specs=gba.specs
     
    endif
     
    # --- Compiling -------------------------------------------------------
     
    CROSS	?= arm-none-eabi-
    AS		:= $(CROSS)as
    CC		:= $(CROSS)gcc
    LD		:= $(CROSS)gcc
    OBJCOPY	:= $(CROSS)objcopy
     
     
    ARCH	:= -mthumb-interwork -mthumb
     
    ASFLAGS	:= -mthumb-interwork
    CFLAGS	:= $(ARCH) -O2 -Wall -fno-strict-aliasing
    LDFLAGS	:= $(ARCH) $(SPECS)
     
    .PHONY : build clean
     
    # --- Build -----------------------------------------------------------
     
    build : $(TARGET).gba
     
     
    $(TARGET).gba : $(TARGET).elf
    	$(OBJCOPY) -v -O binary $< $@
    	-@gbafix $@ -t$(TITLE)
     
    $(TARGET).elf : $(OBJS)
    	$(LD) $^ $(LDFLAGS) -o $@
     
    $(COBJS) : %.o : %.cpp
    	$(CC) $(CFLAGS) -c $< -o $@
     
    # --- Clean -----------------------------------------------------------
     
    clean : 
    	@rm -fv *.gba
    	@rm -fv *.elf
    	@rm -fv *.o
     
    #EOF
    sortie compilation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    arm-none-eabi-gcc main.o fastrandom.o -mthumb-interwork -mthumb -specs=gba.specs -o main.elf
    /home/name/devkit/devkitARM/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: main.o: in function `bilinearInterpolation(grid2d*)':
    main.cpp:(.text+0xb4): undefined reference to `operator new[](unsigned int)'
    /home/name/devkit/devkitARM/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: main.cpp:(.text+0x10a): undefined reference to `operator delete[](void*)'
    /home/name/devkit/devkitARM/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: main.o: in function `freeGrid(grid2d*)':
    main.cpp:(.text+0x334): undefined reference to `operator delete[](void*)'
    /home/name/devkit/devkitARM/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: main.o: in function `initGrid(int, int)':
    main.cpp:(.text+0x348): undefined reference to `operator new(unsigned int)'
    /home/name/devkit/devkitARM/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: main.cpp:(.text+0x356): undefined reference to `operator new[](unsigned int)'
    /home/name/devkit/devkitARM/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: main.o: in function `createPlasma(int, double, double)':
    main.cpp:(.text+0x416): undefined reference to `pow'
    /home/name/devkit/devkitARM/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: main.o: in function `main':
    main.cpp:(.text.startup+0x80): undefined reference to `operator delete[](void*)'
    /home/name/devkit/devkitARM/lib/gcc/arm-none-eabi/8.2.0/../../../../arm-none-eabi/bin/ld: main.cpp:(.text.startup+0x88): undefined reference to `operator delete(void*, unsigned int)'
    collect2: error: ld returned 1 exit status
    Makefile:59: recipe for target 'main.elf' failed
    make: *** [main.elf] Error 1
    je ne comprends pas ces erreurs.

    Merci de votre aide


    ps: j'avais voulu aussi essayer


    https://github.com/uli/dragonbasic sous linux

    dans le dossier examples quand je fais un make, voici le message:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cd breakout; ../../dbc -sym breakout.dbc breakout.gba
    Segmentation fault (core dumped)
    Makefile:26: recipe for target 'breakout/breakout.gba' failed
    make: *** [breakout/breakout.gba] Error 139

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ton code ne correspond pas au code du tuto: Au lieu d'ajouter la déclaration de la variable manquante videoBuffer, tu as supprimé les références à celles-ci, d'où les avertissements comme quoi les lignes n'ont aucun effet.

    Je constate que ce tutoriel fait grand usage des variables globales, mais puisqu'une GBA ça compte comme de l'Embarqué c'est probablement plus ou moins normal.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    j'ai installé devkitadv pour voir si les programmes veulent se compiler comme dans les cours.

    en faisant un echo $PATH
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /devkitadv/:/devkitadv/bin:/devkitadv/arm-agb-elf/:/devkitadv/arm-agb-elf/bin:/devkitadv/lib/gcc-lib/arm-agb-elf/3.1
    quand j'essaye de compiler le 1er programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ~/gba/cours GBA/cours1$ make
    gcc -c -O3 -mthumb -mthumb-interwork main.cpp
    gcc: error: unrecognized command line option ‘-mthumb’; did you mean ‘-mtbm’?
    gcc: error: unrecognized command line option ‘-mthumb-interwork’
    Makefile:19: recipe for target 'main.o' failed
    make: *** [main.o] Error 1
    Merci de votre aide

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Tu as sûrement mal configurer parce que ça fait appel à gcc qui est un compilateur de base pour le x86
    Surtout que -mthumb c'est une option spécifique pour ARM !

    C'est étrange que le make sélectionne gcc tout de même , rien ne t’empêche de le modifier par contre
    Tu arriver à compiler avant , reste dessus juste évite le main.cpp , ce que tu fais c'est du C et le C++ est beaucoup moins laxiste que le C sur certain point (notamment les casts implicites).

    Normalement si le premier cours marche les autres devrait l’être aussi (et au pire tu écrit toi même sur les I/O que tu veux pour afficher un sprite ou un Background ) , je note juste que le cours me semble pas vraiment être a la porté d'un débutant , c'est presque un cours sur l'embarquée mais sans qu'on te file la doc
    (et puis il parle direct du mode 4 qui n'est pas à mon avis une bonne idée).

    @Médinoc Tu parle de ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    u16* OAM = (u16*) 0x7000000;
    void copyOAMBuffer()
    {
      REG_DMA3SAD = (u32) OAMBuffer;
      REG_DMA3DAD = (u32) OAM;
      REG_DMA3CNT = MAX_SPRITES * 4 | DMA_16NOW;
    }
    Effectivement c'est normal (vu que c'est pour lire/écrire en I/O) par contre c'est pas une façon idéal vu que ça stocke de la RAM pour rien (et quand tu as beaucoup I/O c'est pas forcément top)

    Pour cela que je préfère faire ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define RW_REGISTER_FLOAT(REG) 	*((volatile float *)(REG))
    #define RW_REGISTER_U8(REG) 	*((volatile unsigned char  *)(REG))
    #define RW_REGISTER_U16(REG) 	*((volatile unsigned short *)(REG))
    #define RW_REGISTER_U32(REG) 	*((volatile unsigned int   *)(REG))
    #define RW_REGISTER_U64(REG) 	*((volatile unsigned long  *)(REG))
    (oui je sais short ne fait pas obligatoire 16 bits pareil pour int ne fait pas obligatoire 32 bits, mais c'est un peu les tailles qui reviennes en général sur les plateformes que je vise).
    Du coup cela permet de s'écrire comme ceci : RW_REGISTER_U16(OAM) = 8; (SI OAM est un define 0x7000000)
    ou mavariable = RW_REGISTER_U16(OAM);
    ou comme l'exemple montré : REG_DMA3DAD = RW_REGISTER_U32(OAM);

    Et GCC compile très bien avec un load ou un store pour ce genre I/O
    (Nt : la réponse s'adresse aussi à ludovic787 pour gérer les I/O).

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Merci

    Je vais essayer de voir si je trouve des tutos différents sur la programmation GBA avec des exemples.

    .

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    @Kannagi: Je pensais surtout à videoBuffer, un pointeur déclaré en variable globale (vu qu'elle sert au double-buffering, c'est bien une variable qui varie au cours de l'exécution).
    Sur PC ça ne ferait pas sérieux (il faudrait passer ce pointeur aux fonctions, ou le mettre dans une structure donnée commune dont on passe le pointeur à toutes les fonctions concernées) mais pour de l'embarqué ça a un sens.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. probleme avec jdbc dans un prog Java
    Par 18Marie dans le forum JDBC
    Réponses: 5
    Dernier message: 17/07/2006, 09h40
  2. Réponses: 11
    Dernier message: 17/11/2005, 17h13
  3. Problème avec un prog tcl autonome
    Par jaabouc dans le forum Linux
    Réponses: 3
    Dernier message: 04/06/2004, 21h13
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo