Info interaction loader-jeu - espace mémoire occupée

Bonjour,

J’essaye de comprendre l’interaction du loader/jeu en cours via le code source. Je n’ai pas trouvé d’info sur le site sur ce sujet. J’aimerai savoir quelle place occupe les fonctions du bootloader (gui, menu, etc.) dans le binaire du jeu (en flash, ram, etc.). Les fonctions du bootloader (comme game() loader(), etc.) font appel à des adresses fixes comme 0x3FF4 … d’ou viennent ces adresses et que font elles exactement?

Merci d’avance!

1 Like

Bonjour Lezardo,
Le loader (pour sélectionner les jeux) est une application comme les autres, similaire à un jeu. Il n’en reste rien quand on lance autre chose. Le loader passe la commande « charger le jeu X » au bootloader quand on sélectionne un nouveau jeu.

Le bootloader, lui reste toujours en flash. Quand un jeu est lancé, il n’utilise pas de RAM, mais occupe les 32 premiers Ko de Flash (de mémoire, c’est 32k…). Il possède une table de fonctions qui permettent de l’appeler pour des fonctions variées comme flasher une app par l’USB, ou depuis la carte SD.

Les fonctions type GUI : menu de réglage volume, faire un capture écran sont embarquées dans l’application/jeu en cours d’exécution. Ce sont des modules qui font parti du kit de développement.

PS: les adresses fixes correspondent à des fonctions du bootloader, et peuvent être appellées tout simplement depuis l’API Gamebuino META avec les fonctions gb.bootloader.xxx.

Merci pour la rapidité de la réponse!!

Donc si je comprends bien, c’est le compilateur d’Arduino qui va fixer les adresses des fonctions du bootloader pour que tous les jeux aient les mêmes appels… en mettant simplement l’adresse hexa plutôt qu’un nom?

Car je ne vois pas dans le code une table de redirection commune … ou settings du compilateur pour réserver les premiers 32ko au bootloader.

Est-ce que le compilateur/linker d’arduino exclu du jeu toutes les méthodes/variables des classes Gamebuino non utilisées … ou elles sont malheureusement toutes incluses (moins de place pour l’application).

1 Like

Le compilateur fixe les adresses lors du link la ou ça l’arrange (bootloader ou application, même combat)

Pour que l’application puisse appeler les fonctions externalisées su bootloader, il y a une table qui fait référence à ces fonctions à la fin des 16K du bootloader (c’est 16K et pas 32k :wink: )
cf : Gamebuino-META/Bootloader.cpp at master · Gamebuino/Gamebuino-META · GitHub

La place occupée par le bootloader est définie dans le fichier de link, qui est … quelque part. C’est le système mis en place par Arduino pour la carte Arduino Zero.

Pour le 3eme point, le linker exclue peu de choses lors du link car la majorité des choses sont utilisées, à minima pour le menu GUI embarqué dans l’application. On réfléchit depuis quelques temps sur une version plus customisable de la librairie pour justement ce type de demandes.

Compris, merci!

J’ai fait des recherches un peu plus approfondies, pas facile car on rentre dans les entrailles de l’arduino :wink: Je ne sais pas si ça intéresse quelqu’un qui cherche aussi à comprendre le changement entre l’application gamebuino loader et jeu sur carte SD, je vais quand même poursuivre… :slight_smile:

J’avais lu quelque part que la version du bootloader d’arduino était ses derniers octets … donc la fonction Gamebuino Bootloader::version() a bien 0x3FFC + 3 = 16ko!

Donc ma compréhension de ces adresses fixes du bootloader.cpp, c’est certainement une table de routines à la fin du bootloader d’arduino. Le changement d’application (loader vecteur 0x3FF4 et jeu sélectionné vecteur 0x3FF8) pointent certainement sur une routine qui copie le PATH_TO_GAME.BIN de la carte SD en mémoire flash (après les premiers 16ko) et fait un reset (vecteur Reset_handler)

Est-ce que cela semble correct ou je fais fausse route? Avez vous du débugger le bootloader pour connaître ces adresses fixes? car c’est indiqué nulle part …

Maintenant, là ou je suis dans le doute, le code source du bootloader de l’arduino zero (bootloaders/zero/bootloader_samd21x18.ld) indique ceci:

FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x2000 / First 8KB used by bootloader /

“Applications compiled to be executed along with the bootloader will start at 0x2000 (see linker script bootloader_samd21x18.ld). Before jumping to the application, the bootloader changes the VTOR register to use the interrupt vectors of the application @0x2000

Le bootloader ne ferait donc que 8ko? Pourquoi changer l’emplacement de la table de vecteurs??

1 Like

C’est bien ça, il y a une table à la fin.

Le bootloader de la Gamebuino META est une version spéciale qui a été développé par @Sorunome.
Il intègre (en plus des fonctionnalités de la version Arduino zero) la capacité de charger un binaire depuis la carte SD. Cette version du bootloader fait bien 16k (il intègre notamment la gestion de la FAT et/de la carte SD)

Ces adresses fixes sont dans le code source dont le lien est dans le message ci dessus. C’est une partie de la librairie Gamebuino.

Perso, je n’ai pas fait de debuggage sur Gamebuino.
@minirop le fait.

oui, les adresses sont des fonctions (une jumptable pour être exact) à la fin du bootloader. Pour information, la fonction à l’adresse 0x3FF8 fait 2/3 trucs (genre un reset de la pile d’appels) puis appelle cette fonction :

void sd_load_game_int(const char* filename){
  FATFS FatFs;
  FIL Fil;
  BYTE* buf = (BYTE*)(&__buff__);
  
  if(!filename) {
    strcpy((char*)buf, BOARD_SD_LOADER);
    BOOT_DOUBLE_TAP_DATA = 0x0000FFFF & BOOT_MAGIC3_DATA;
    BOOT_DOUBLE_TAP_DATA |= LOADER_MAGIC;
  } else if ((uint32_t)filename == 1) {
    BOOT_DOUBLE_TAP_DATA = 0;
  } else {
    // we copy the filename to a safe buffer so that we won't accidentally overwrite it. Later on we use this buffer for sd reads
    memmove(buf, (char*)filename, 512);
  }
  board_init();
  display_init(false);
  display_draw_sprite(0, 0, sprite_gamebuino_logo, 0x0000, 0xFFFF);
  load_block_blink();
  #define ALTER_SPEED 10
  uint8_t alter_counter = ALTER_SPEED;
  
  uint8_t cond = sd_mount(&FatFs);
  if(!cond){
    // no SD card present, fallback to bootloader (can't load loader anyways)
    BOOT_MAGIC3_DATA = BOOTLOADER_NO_SD_MAGIC;
    reset_bootloader();
  }
  
  load_block_blink();
  
  if (f_open(&Fil, (const char*)buf, FA_READ) != FR_OK)
  {
    // file not found, fall back to loader
    sd_load_loader();
  }
  
  load_block_blink();
  
  // yay, we found our file to flash!
  
  UINT br;
  uint32_t addr = PROGRAM_START_ADDRESS;
  flash_delete(PROGRAM_START_ADDRESS);
  do {
    if (!(--alter_counter)) {
      alter_counter = ALTER_SPEED;
      load_block_blink();
    }
    if(f_read(&Fil, buf, 512, &br) != FR_OK){
      // something went wrong reading the sd card, so we might as well go to the bootloader....
      BOOT_MAGIC3_DATA = BOOTLOADER_NO_SD_MAGIC;
      reset_bootloader();
    }
    flash_write((br + 3) / 4,(uint32_t*)buf,(uint32_t*)addr);
    addr += br;
  } while(br == 512);
  f_close(&Fil);
  
  
  
  if(NVMCTRL->STATUS.bit.NVME){
    // something went wrong flashing, off we go to the bootloader!
    BOOT_MAGIC3_DATA = BOOTLOADER_NO_SD_MAGIC;
    reset_bootloader();
  }
  
  // ok, let's just reset the device and thus start the sketch!
  reset();
}

Donc comme tu peux le voir, elle lit le fichier passé en paramètre et l’écrit à l’adresse PROGRAM_START_ADDRESS (0x4000) puis reset la console.

1 Like

Merci!

Je pensais que le bootloader était celui de base de l’arduino … si c’est du custom, tout s’explique maintenant!!

Par contre, le code est confidentiel? Car je ne trouve pas le bootloader dans Gamebuino github. Si on doit le réinstaller, on fait comment?

1 Like

Il faut demander au SAV, et ce n’est jamais arrivé.
De toute façon, il faut une sonde pour flasher le bootloader.

Le code n’est pas confidentiel, il n’est simplement pas sur le GIT;)

Bonjour à tous , J’ai fais une grosse connerie de débutant . J’ai commencé ce matin , j’arrive à télèverser Hello World . Mais j’ai oublié la micro sd dans la Gamebuino . Quelqu’un pourrai m’envoyer une copie de la carte svp

1 Like

Pourquoi, ce n’est pas grave ? Tu peux téléverser un programme ave la carte SD dans la Gamebuino. C’est toujours ce que je fais de mon côté. Si tu fermes le programme en passant par le menu, tu reviens sur le loader standard. Par contre ce serait bien de ne pas réouvrir un ancien sujet sur un problème. N’hésite pas à ouvrir un nouveau sujet quand tu en as besoin. C’est plus simple de ne pas mélanger 2 sujets différents si on veut pouvoir retrouver les réponses.

1 Like

Bonjour,
Comme le dit @Jicehel, on peut laisser la carte SD lors des téléversements. C’est même complètement fait pour.
Que se passe t il quand on éteint et qu’on allume la console ?
Le bootloader devrait toujours fonctionner.

Bonjour, est-ce que ton petit problème est résolu ?
On aile bien prendre des nouvelles !