Question Programmation en métal nu Beagleboard


Je viens de recevoir mon BeagleBoard-Xm et je me demande s'il existe des didacticiels détaillés sur la façon de faire fonctionner un simple logiciel sur le matériel?

La raison pour laquelle je pose la question est que je veux comprendre en profondeur le fonctionnement de l’architecture matérielle, du bootloader, des linkers, des interruptions, des exceptions, de la MMU, etc. un OS. Rien de plus avancé, il suffit de démarrer le tableau et d'obtenir une sortie "hello world" à l'écran. c'est tout!

L'étape suivante consisterait à exécuter un petit système d'exploitation, qui peut planifier des tâches très simples. Aucun système de fichiers nécessaire, juste pour comprendre les bases du système d'exploitation.

Toute aide appréciée!

Meilleures salutations

M. Gigu


28
2017-07-29 08:45


origine


Réponses:


Absolument pas de problème ...

Tout d'abord, lancez le port série, j'ai un des anciens tableaux beagle et souvenez-vous du port série et à peu près tout ce qui concerne les E / S est douloureux, mais obtenez un port série pour le voir démarrer.

Je pense que ça démarre et que vous pouvez appuyer sur une touche ou sur une touche échap ou quelque chose du genre pour interrompre le démarrage normal (dans Linux). À l'invite du démarrage, il est facile de charger vos premiers programmes simples.

J'ai un code beagleboard à portée de main pour le moment mais je n'ai pas mon tableau de bord lui-même à portée de main pour les essayer. Alors allez à http://sam7stuff.blogspot.com/ pour avoir une idée de la manière de combiner un assembleur de démarrage et un code C pour des programmes intégrés sans OS (pour arm, j'ai un certain nombre d'exemples pour d'autres plates-formes thumb / cortex-m3, mais celles-ci sont légèrement différentes).

Les ports sam7 pour les choses et l'espace d'adressage en mémoire sont totalement différents du tableau de bord / omap. Ce qui précède est un cadre que vous pouvez modifier ou réinventer.

Vous aurez besoin du manuel de référence technique OMAP 35x sur ti.com. Recherchez la partie omap sur leur site OMAP3530.

Aussi la documentation de beagleboard. Par exemple, cette déclaration:

Un seul port RS232 est fourni sur le BeagleBoard et donne accès au TX et Lignes RX de UART3

Donc, dans le trm pour la recherche omap pour UART3 montre qu'il est à une adresse de base de 0x49020000. (il est souvent très difficile de trouver l'adresse complète pour quelque chose car les manuels ont généralement une partie de la carte mémoire ici, et une autre partie, et près des descriptions des registres, seuls les quelques bits inférieurs de l'adresse sont appelés.)

En regardant les registres uart, THR_REG est l'endroit où vous écrivez les octets à envoyer à l'uart, notez qu'il s'agit d'un registre de 16 bits.

Sachant cela, nous pouvons faire le premier programme:

.globl _start
_start:
    ldr r0,=0x49020000
    mov r1,#0x55
    strh r1,[r0]
    strh r1,[r0]
    strh r1,[r0]
    strh r1,[r0]
    strh r1,[r0]
hang: b hang

Voici un makefile pour cela:

ARMGNU = arm-none-linux-gnueabi

AOPS = --warn --fatal-warnings
COPS = -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding 

uarttest.bin : uarttest.s
    $(ARMGNU)-as $(AOPS) uarttest.s -o uarttest.o
    $(ARMGNU)-ld -T rammap uarttest.o -o uarttest.elf
    $(ARMGNU)-objdump -D uarttest.elf > uarttest.list
    $(ARMGNU)-objcopy uarttest.elf -O srec uarttest.srec
    $(ARMGNU)-objcopy uarttest.elf -O binary uarttest.bin

Et le script de l'éditeur de liens utilisé:

/* rammap */
MEMORY
{
    ram : ORIGIN = 0x80300000, LENGTH = 0x10000
}

SECTIONS
{
    .text : { *(.text*) } > ram
}

Notez que la version Linux de codesourcery est appelée, vous n'avez pas besoin de cette version d'un compilateur gnu cross, en fait, ce code étant asm n'a besoin que d'un assembleur et d'un éditeur de liens (binutils). Le compilateur croisé de type arm-none-eabi -... fonctionnera également (en supposant que vous obteniez les outils lite à partir de codesourcery).

Une fois que vous avez un fichier .bin, regardez l’aide sur uboot, je ne me souviens pas de la commande exacte mais c’est probablement un 0x80300000 ou un load_xmodem ou quelque chose du genre. Fondamentalement, vous voulez x, ou y ou z, modifiez le fichier .bin sur le port série en espace mémoire pour le processeur, puis en utilisant un go ou n'importe quelle commande, indiquez à uboot de se connecter à votre programme.

Vous devriez voir une poignée de caractères U (0x55 est «U») qui sortent du port série lors de l'exécution.

Votre objectif principal est d'obtenir une routine de port série simple afin que vous puissiez imprimer des choses pour déboguer et voir ce que font vos programmes. Plus tard, vous pouvez entrer dans les graphiques, etc., mais utilisez d'abord le port série.

Il y avait de la triche en cours. Depuis le lancement d'Uboot et l'initialisation du port série que nous n'avions pas à faire, il suffit de pousser les octets dans le thr. mais rapidement vous allez déborder le stockage de thr et perdre des octets, donc vous devez alors lire l'omap pour l'omap et trouver une sorte de bit qui indique que l'émetteur est vide, il a tout transmis, puis crée une fonction de type uart_send qui interroge l'émetteur vide alors envoie le premier octet.

oubliez également printf (), vous devez créer votre propre impression, un nombre (octal ou hex est le plus facile) et peut-être imprimer une chaîne. Je fais ce genre de travail toute la journée et toute la nuit et 99% du temps, tout ce que j'utilise est une petite routine qui imprime des nombres hexadécimaux 32 bits sur le uart. à partir des chiffres, je peux déboguer et voir le statut des programmes.

Prenez donc le modèle sam7 ou quelque chose du genre (notez que les options de ligne de commande du compilateur et de l'éditeur de liens sont importantes car l'ordre des fichiers sur la ligne de commande du lien est le premier si vous voulez avoir la première instruction / word dans le fichier .bin soit votre point d’entrée, ce qui est généralement une bonne idée, car vous voulez savoir comment le contrôler pour démarrer à partir d’une ROM.

Vous pouvez probablement faire beaucoup de choses sans supprimer ou remplacer uboot, si vous commencez à regarder les commandes de démarrage basées sur Linux pour uboot, vous verrez qu'il copie ce qui est à peu près un fichier .bin , puis se ramifier à elle. Si vous branchez maintenant sur linux, esp arm linux implique des tables de bras et la configuration possible de certains registres, là où vos programmes ne le veulent pas ou n'en ont pas besoin. Fondamentalement, quelle que soit la commande à utiliser, une fois que vous avez copié votre programme sur ram, vous devez créer un script de démarrage pour uboot si vous souhaitez que la carte démarre et fonctionne comme avec Linux.

Dire que vous pouvez utiliser jtag et ne pas utiliser uboot pour travailler, si vous devez suivre ce chemin, il y a probablement un certain nombre de choses à faire au démarrage pour faire fonctionner la puce, en particulier la configuration de l'uart peu de diviseurs d’horloge quelque part, l’horloge active, I / O active, des choses comme ça. C'est pourquoi l'exemple sam7 commence par un clin d'œil au lieu d'une chose uart. L'amotek jtag-tiny est un bon wiggler jtag, j'ai été très content, je les utilise tous les jours au travail. Le tableau beagle utilise probablement un brochage TI et non le brochage ARM standard. Vous devrez donc probablement changer le câblage. Et je ne sais pas si l'OMAP vous donne un accès direct au contrôleur de prise du bras ou si vous devez faire quelque chose de spécifique. Il vaut mieux que vous alliez simplement sur la route pour le moment.

Une fois que vous avez un framework où vous avez une petite quantité d'ASM pour configurer la pile et accéder au code C de votre point d'entrée, vous pouvez commencer à transformer ce code C en système d'exploitation ou à faire ce que vous voulez. Si vous regardez des chibios ou des prex ou d’autres, vous constaterez qu’ils ont un petit code de démarrage asm qui les place dans leur système. De même, il existe des routines de débogage et de non-débogage. De nombreuses solutions vont vouloir utiliser les interruptions et ne pas interroger pour que thr soit vide.

Si ce post ne vous permet pas de travailler avec votre monde salutaire (vous permettant de faire une partie du travail), faites-le moi savoir et je déterrerai mon tableau d'affichage et créerai un exemple complet. Mon tableau ne correspond pas exactement au vôtre, mais pour ce qui est de bonjour tout le monde, ça devrait être assez proche.


40
2017-07-29 14:34



Vous pouvez également essayer TI StarterWare:

http://www.ti.com/tool/starterware-sitara


4
2017-08-03 03:42