2017-02-03 2 views
0

Je travaille sur un simple programmeur AVR pour mon projet universitaire, et je suis bloqué par la compréhension de la façon dont je peux mapper la mémoire d'un fichier hexadécimal à la mémoire flash réelle. Par exemple, Intel hex fournit des informations sur l'adresse de début du bloc de données, le nombre d'octets qu'il contient et les données elles-mêmes. Le problème vient de ce que AVR MCUs, en particulier ATmega16, ont souvent une adresse pour deux octets: haut et bas. Dans un premier temps, j'ai écrit une fonction simple, qui lit simplement toutes les données du fichier hex et l'écrit séquentiellement, en augmentant l'adresse d'une unité tous les deux octets passés. À ma grande surprise, cela fonctionne sur un code blinky simple. Cependant, je ne suis pas sûr, si cette approche fonctionne, si quelqu'un a besoin d'une structure de mémoire complexe.Mémoire AVR et intel hex

Ainsi, les questions sont les suivantes:

  1. Est-ce que cette solution fonctionne sur les structures de mémoire complexes?
  2. Si non, comment puis-je mapper l'adresse hexadécimale intel en adresse flash réelle? Le problème est qu'il n'y a pas d'octets hauts et bas au format hexadécimal, seulement adresse = octet.

Répondre

0

Intel hex utilise des adresses octets. Le compteur de programmes PC fait référence à des adresses de mots de 16 bits. Si vous voulez dire que l'adresse de mot est "l'adresse réelle", doublez simplement le nombre qui représente l'adresse de départ de la ligne dans le fichier hexadécimal. Qu'entendez-vous par «structures de mémoire complexes»? Les emplacements de mémoire ont besoin d'adresses uniques, peu importe la façon dont cet espace d'adressage est brisé. Je ne suis pas familier avec les espaces de mémoire de programme qui ne commencent pas par 0 et continuent linéairement, mais s'il existait un tel schéma, une ligne dans un fichier hexel intel peut spécifier le contenu de toute section mémoire contiguë commençant à n'importe quelle adresse.

Edit:

Chaque ligne d'un fichier hex intel ne peut contenir jusqu'à 255 octets. Généralement, les données sont divisées en blocs de 16 ou 32 octets. Chaque ligne contient l'adresse de début du morceau (qui est ajouté à l'adresse de base si elle est utilisée). Un morceau ne doit pas commencer à la fin d'un morceau précédent, et ils peuvent également être hors service. En ce qui concerne les structures de mémoire complexes que vous décrivez, la plupart des programmes les possèdent déjà. Il y a habituellement une table de vecteurs au début, suivie d'un espace, suivie par le programme crt et le programme principal. Les données pour initialiser les variables globales suivent cela. S'il y a un chargeur de démarrage, il est placé dans une section spéciale à la fin de la mémoire.

+0

Et si je crée une section personnalisée à la fin de la mémoire flash et que j'y place des données, quelque chose comme cela se réfère aux "structures de mémoire complexes". En fait ce n'est pas vraiment complexe;) Donc je dois juste diviser l'adresse par deux et c'est ça? –