2016-01-15 1 views
0

Je peux facilement placer certaines de mes sections RO de code dans des régions d'exécution spécifiques à des adresses spécifiques (qui peuvent être des adresses RAM). Il n'y aura pas de problème dans l'intégrité de mon programme en raison d'une liaison correcte. Le problème est que ces sections RO placées aux adresses RAM n'apparaîtront pas sur la RAM après la mise hors tension/sous tension. Ils seront manquants. Ai-je raison? Bien sûr, je peux les charger avec bootloader, mais ce n'est pas le cas actuellement. Ma question est: existe-t-il une méthode par défaut fiable pour résoudre ce problème? Peut-être quelques attributs etc. Par exemple, peut-être il y a une méthode de copie des sections RO (comme RW) au démarrage par la bibliothèque C?ARM exécuter le code à partir de la RAM intégrée

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka11494.html Comme ce post le suggère, c'est incorrect. Comme je l'ai mentionné précédemment, après le redémarrage RAM ne contiendra pas de données RO.

Répondre

2

Vous avez déjà ce problème dans un système embarqué avec la zone .data. .bss est mis à zéro dans le bootstrap, mais .data doit être en stockage non volatil donc il est là quand vous le mettez sous tension, mais il doit vivre en RAM. La solution typique est de le marquer comme tel dans le script de l'éditeur de liens car je cours normalement à partir de ram mais je veux être stocké dans le binaire en rom.

avec des outils gnu vous faites quelque chose à quelque chose chose

MEMORY 
{ 
    bob : ORIGIN = 0x8000, LENGTH = 0x1000 
    ted : ORIGIN = 0xA000, LENGTH = 0x1000 
} 

SECTIONS 
{ 
    .text : { *(.text*) } > bob 
    __data_rom_start__ = .; 
    .data : { 
    __data_start__ = .; 
    *(.data*) 
    } > ted AT > bob 
    __data_end__ = .; 
    __data_size__ = __data_end__ - __data_start__; 
    .bss : { 
    __bss_start__ = .; 
    *(.bss*) 
    } > bob 
    __bss_end__ = .; 
    __bss_size__ = __bss_end__ - __bss_start__; 
} 

scripts Linker ou d'autres façons de contrôler l'éditeur de liens sont très spécifiques à la chaîne d'outils, je ne reviendrai pas attendre automatiquement des outils d'armes à utiliser la même solution que gnous outils ou autres outils. Ils pourraient garder le reste d'entre nous sain d'esprit, mais ce n'est pas quelque chose qu'un organisme de normalisation gère. Ensuite, vous devez faire correspondre votre code d'amorçage au schéma de script de l'éditeur de liens et copier les données. Si vous avez des sections de code que vous voulez déplacer et pas seulement des données ou à la place des données vous utiliseriez le même schéma, ajoutez des choses de script d'éditeur de liens pour marquer ce blob de code comme si vous vouliez vivre ici mais voulez vivre là dans l'image binaire. et votre bootstrap ou un code doit copier cette fraction du programme à ram avant qu'il ne soit utilisé.

2

Il est (entre autres tâches) la responsabilité du code de démarrage C runtime (celui qui s'exécute avant que main() ne soit exécuté) pour copier le code exécutable RAM de l'image ROM vers la RAM. Dans certains cas, l'image ROM peut être compressée de sorte que le code de démarrage doit également effectuer une décompression.

Votre chaîne d'outils peut déjà fournir un code de démarrage approprié, ou vous devrez peut-être modifier le code de démarrage existant pour le prendre en charge.