Taille de la compilation Keil et instructions de stockage

Keil, informations imprimées sur la fenêtre de compilation IAR (Build) :

Taille du programme : Code=2596 RO-data=268 RW-data=44 ZI-data=1028

72765 octets de mémoire de code en lecture seule

3508 octets de mémoire de données en lecture seule

20202 octets de mémoire de données en lecture-écriture

5676 octets de mémoire CODE

926 octets de mémoire CONST

1148 octets de mémoire DATA

Je crois que tout le monde a vu les informations ci-dessus et devrait connaître leur signification générale, mais combien d'amis ont une compréhension approfondie des détails du stockage ?

Pour savoir où sont stockés le code, les constantes, les variables globales et locales, vous devez comprendre certaines caractéristiques de FLASH et de RAM. Dans le projet, vous devez analyser leur taille et l'adresse de stockage correspondante, qui peut être analysée à partir du fichier de carte. .

Afin de prendre soin de la plupart des gens, parlez brièvement de la signification des informations imprimées ci-dessus. Ici, je voudrais rappeler à tous qu'il existe de nombreuses informations connexes sur Internet, mais que de nombreuses informations sur Internet sont ambiguës et peuvent induire tout le monde en erreur, telles que: RW-data est une variable globale initialisée. Les variables avec modification statique sont appelées variables statiques, qui sont toujours différentes des variables globales, mais les variables statiques initialisées seront également incluses dans RW-data .

1. Informations sur la fenêtre de compilation Keil

Taille du programme : Code=2596 RO-data=268 RW-data=44 ZI-data=1028

Code : fait référence à la taille du code ;

Ro-data : fait référence à des données constantes autres que des données en ligne ;

Données RW : se réfère à des données variables initialisées lisibles et inscriptibles (RW) ;

Données ZI : fait référence aux données variables non initialisées (ZI) ;

Code, Ro-données : situé dans FLASH ;

Données RW, données ZI : situées dans la RAM ;

Rappel : les données initialisées des données RW seront stockées dans Flash et seront déplacées de FLASH vers RAM lors de la mise sous tension.

La relation est la suivante :

Taille RO = Code + Données RO

Taille RW = Données RW + Données ZI

Taille ROM = Code + Données RO + Données RW

2. Informations sur la fenêtre de compilation IAR

Il existe deux situations dans IAR, mais les significations sont similaires, mais l'affichage est différent :

Compilez le projet (cliquez sur Make), et les informations suivantes apparaîtront :

72 765 octets de mémoire de code en lecture seule

3 508 octets de mémoire de données en lecture seule

20 202 octets de mémoire de données en lecture-écriture

Compilez un seul fichier (cliquez sur Compiler), et les informations suivantes apparaîtront (s'il n'y a pas de DATA, il n'y aura pas de ligne) :

5 676 octets de mémoire CODE

926 octets de mémoire CONST

1 148 octets de mémoire DATA

code en lecture seule : taille du code (similaire à CODE) ;

données en lecture seule : données constantes (similaire à CONST );

readwrite data : les données variables peuvent être lues et écrites (similaire à DATA) ;

illustrer:

Les données dans IAR sont équivalentes aux données RW + données ZI dans Keil

Allocation de mémoire (RAM)

Cette section développe certaines connaissances de la RAM, ce qui vous aidera à comprendre la situation de la RAM lorsque le programme est en cours d'exécution.

La mémoire est divisée en 5 catégories :

1. Zone de pile (pile) : allouée et libérée automatiquement par le compilateur, stockant les valeurs des paramètres de la fonction, les valeurs des variables locales, etc.

2. Zone de tas (heap) : Elle est généralement allouée par le programmeur (à l'aide de malloc) et libérée (à l'aide de free), si le programmeur ne la libère pas, elle sera toujours occupée. D'une manière générale, les programmes MCU n'utilisent généralement pas le tas.

3. Zone globale (zone statique) (statique) : les variables globales et les variables statiques sont stockées ensemble, les variables globales initialisées et les variables statiques sont dans la même zone, les variables globales non initialisées et les variables statiques non initialisées sont adjacentes à une autre zone de.

4. Zone constante littérale (const) : La chaîne constante est placée ici.

5. Zone de code de programme (code) : stocke le code binaire du corps de la fonction.

Exemple classique :

int a = 0; 全局初始化区
char *p1; 全局未初始化区

main(void)
{
    
    
  int b;// 栈
  char s[] = "abc"; //栈
  char *p2; //栈
  char *p3 = "123456"; 123456\0";//在常量区,p3在栈上。
  static int c =0//全局(静态)初始化区
  p1 = (char *)malloc(10);
  p2 = (char *)malloc(20);

  //分配得来得10和20字节的区域就在堆区。
  strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

}

Je suppose que tu aimes

Origine blog.csdn.net/m0_50862404/article/details/125993621
conseillé
Classement