1. #1
    Futur Membre du Club
    Femme Profil pro
    licence fac des sciences
    Inscrit en
    mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : licence fac des sciences

    Informations forums :
    Inscription : mai 2016
    Messages : 11
    Points : 7
    Points
    7

    Par défaut [ARM][Débutante] Exercice sur Périphérique / Les Bus et Polling

    Bonjour,

    Je suis en L3, nous avons fait de l'assembleur avec des instructions ARM dans la matière architecture des ordinateurs.
    J'ai un petit exo + corrigé que je ne comprends pas du tout, si vous pouviez m'expliquer un peu ce que font les lignes ce serait super !

    Enoncé :
    On souhaite utiliser un périphérique avec boucle d'interrogation (polling). Ecrivez le code assembleur ARM pour pouvoir programmer l'accès au Périphérique en Polling. On suppose que l'Architecture est la suivante:
    a/ 4 Bus I/O (in / out?): BUS0 BUS1 BUS2 BUS3
    b/ Chaque Bus possède les registres suivants :
    *BUSx_MOD :
    - 00 polling
    - 01 interrupt
    *BUSx_IO :
    - 0 input
    - 1 output
    *BUS_DATA
    - 0 no data

    c/ Le périphérique est connecté au BUS2.
    Voilà le CORRIGÉ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    .global Config
     
    Config:
     
    	mov r1, 0x0 /* 00 */
    	str r1, [BUS2_MOD]
    	mov r1, 0x0 /* 0 */
    	str r1, [BUS2_IO]
     
     
    loop_polling:
     
    	ldr r1, [BUS2_DATA]
    	cmp r1, #0
    	beq loop_polling
    	/* ** */
     
    	bl loop_polling
     
    	bx lr
    __
    Mercii !!!

  2. #2
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    2 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 2 225
    Points : 6 425
    Points
    6 425

    Par défaut

    Citation Envoyé par myoui Voir le message
    Personne pour m'aider ?
    Je suis preneuse de tout, rien que quelques petites explications pourront m'aider mercii
    On est a pas a ta disposition...
    Tu n'as attendu que 2 heures pour un forum c'est assez court, après il y'a peut être certain langage ou on peut avoir une réponse dans l'heure mais en assembleur c'est pas le cas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    .global Config // ce n est pas de l assembleur a proprement parler , juste une commande pour le programme assembleur sûrement pour le GNU AS ici 
     
    Config:  //Un simple Label , niveau code  ça ne fait rien , sert a sûrement appeler la "fonction" Config (mais je ne vois pas d instrution retour
     
    mov r1, 0x0 // r1 = 0 
    str r1, [BUS2_MOD] // envoie la valeur de r1 sur I/O BUS2_MOD
    mov r1, 0x0// r1 = 0 
    str r1, [BUS2_IO] // envoie la valeur de r1 sur I/O BUS2_IO
     
     
    loop_polling: // Label pour la boucle
     
    ldr r1, [BUS2_DATA] //Lis BUS2_DATA
    cmp r1, #0 //Compare r1 avec 0
    beq loop_polling  //si r1 est égal de 0 alors on saute à loop_polling
     
     
    //Voila ce que j ai compris
    bl loop_polling // le registre lr = loop_polling et saute sur loop_polling
     
    bx lr //passe en mode Thump (mode 16 bits mais plus rapide que le mode par défaut 32 bits) et saute sur loop_polling

  3. #3
    Futur Membre du Club
    Femme Profil pro
    licence fac des sciences
    Inscrit en
    mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : licence fac des sciences

    Informations forums :
    Inscription : mai 2016
    Messages : 11
    Points : 7
    Points
    7

    Par défaut

    Citation Envoyé par Kannagi Voir le message
    On est a pas a ta disposition...
    Tu n'as attendu que 2 heures pour un forum c'est assez court, après il y'a peut être certain langage ou on peut avoir une réponse dans l'heure mais en assembleur c'est pas le cas


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    .global Config // ce n est pas de l assembleur a proprement parler , juste une commande pour le programme assembleur sûrement pour le GNU AS ici 
     
    Config:  //Un simple Label , niveau code  ça ne fait rien , sert a sûrement appeler la "fonction" Config (mais je ne vois pas d instrution retour
     
    mov r1, 0x0 // r1 = 0 
    str r1, [BUS2_MOD] // envoie la valeur de r1 sur I/O BUS2_MOD
    mov r1, 0x0// r1 = 0 
    str r1, [BUS2_IO] // envoie la valeur de r1 sur I/O BUS2_IO
     
     
    loop_polling: // Label pour la boucle
     
    ldr r1, [BUS2_DATA] //Lis BUS2_DATA
    cmp r1, #0 //Compare r1 avec 0
    beq loop_polling  //si r1 est égal de 0 alors on saute à loop_polling
     
     
    //Voila ce que j ai compris
    bl loop_polling // le registre lr = loop_polling et saute sur loop_polling
     
    bx lr //passe en mode Thump (mode 16 bits mais plus rapide que le mode par défaut 32 bits) et saute sur loop_polling
    Merci beaucoup! Grace au lignes de commentaire je comprends que : quand il dit dans l'énoncé qu'on aimerait "accéder au périphérique" il veut dire "envoyer une donnée, qui est contenue dans un registre, au périphérique" donc ==> on doit configurer le BUS_MOD en polling (c'est pour quoi on y met la valeur 0) et le BUS_IO en input (c'est pour quoi on y met la valeur 0 aussi)
    On fait une boucle car c'est en polling.

    J'ai quelques questions:
    - Dans la boucle, il ne fait que Lire le registre du BUS_data et le met dans le registre r1, suppose il ici que on prend pas compte comment le contenu du Bus_data change? Car aucune ligne ne le change dans le code...

    - Question de syntaxe est ce que au lieu de "mov r1, 0x0" on peut écrire "mov r1, #0" ?

    - Je suppose que si c'etait "Interrupt" (au lieu de Polling), on devrait faire un Jump / Branchement puis on retourne a la ligne avant l'interruption avec un autre(?) Branchement?

    Mercii encore!!

  4. #4
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    2 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 2 225
    Points : 6 425
    Points
    6 425

    Par défaut

    Ce qu'on appelle accéder au périphérique c'est en lisant ou écrivant au I/O (si on veut afficher un truc on va écrire , si on veut lire quelque chose , clavier , joypad ou autre on va lire).
    Pour les I/O BUS, je pourrait pas te dire a quoi il serve exactement , ce que fait BUS ou comment le 'configurer' pour les I/O ben ça sera ta machine cible qui te l'indiquera
    ( Je précise les I/O BUS n'existe pas sur toutes les architecture ARM ).

    Pour tes questions :
    1) Alors pour mov r1,#0 oui c'est la bonne syntaxe , parce que j'ai beau regarder la doc mais mov r1,0x0 ça n'existe pas comme syntaxe
    2)Je n'ai pas compris ? utiliser une interruption ? Une interruption comme son nom l'indique va interrompre le processeur en cours pour sauter (automatiquement) sur un autre bout de code ,la nature de cet l'interruption dépend la aussi de la machine cible , en général l'adresse des interruptions se trouve dans une table des interruptions spécifique pour cela.

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    8 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 8 387
    Points : 18 788
    Points
    18 788

    Par défaut

    Information sur le polling.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Futur Membre du Club
    Femme Profil pro
    licence fac des sciences
    Inscrit en
    mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : licence fac des sciences

    Informations forums :
    Inscription : mai 2016
    Messages : 11
    Points : 7
    Points
    7

    Par défaut

    Citation Envoyé par Kannagi Voir le message
    Ce qu'on appelle accéder au périphérique c'est en lisant ou écrivant au I/O (si on veut afficher un truc on va écrire , si on veut lire quelque chose , clavier , joypad ou autre on va lire).
    Pour les I/O BUS, je pourrait pas te dire a quoi il serve exactement , ce que fait BUS ou comment le 'configurer' pour les I/O ben ça sera ta machine cible qui te l'indiquera
    ( Je précise les I/O BUS n'existe pas sur toutes les architecture ARM ).

    Pour tes questions :
    1) Alors pour mov r1,#0 oui c'est la bonne syntaxe , parce que j'ai beau regarder la doc mais mov r1,0x0 ça n'existe pas comme syntaxe
    2)Je n'ai pas compris ? utiliser une interruption ? Une interruption comme son nom l'indique va interrompre le processeur en cours pour sauter (automatiquement) sur un autre bout de code ,la nature de cet l'interruption dépend la aussi de la machine cible , en général l'adresse des interruptions se trouve dans une table des interruptions spécifique pour cela.
    Merci beaucoup pour les explications!
    J'ai une derniere question, supposons que j'ai une fonction dont le prototype est:

    void fonction(char* chaine);
    Je dois créer une librairie qui a deux fichier:
    Fichier1.h : contient le prototype de cette fonction
    Fichier2.s : contient le code assembleur de cette fonction
    Puis je dois ecrire le programme main.c pour tester.

    Je sais ecrire le code assembleur donc (le fichier2.s) mais que mettre dans le fichier1.h, ecrire au sens propre
    void fonction(char* chaine); et seulement ça ? Ou bien autre chose, par exemple quelques chose en assembleur?
    Mercii!

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    8 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 8 387
    Points : 18 788
    Points
    18 788

    Par défaut

    Si tu écris une fonction en assembleur, tu peux le faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void fonction() 
    {
      asm {
       mov eax,1
       ...
     }
    }
    ou la déclarer en extern, assembler le fichier.S et lier les fichiers objets.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  8. #8
    Futur Membre du Club
    Femme Profil pro
    licence fac des sciences
    Inscrit en
    mai 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : licence fac des sciences

    Informations forums :
    Inscription : mai 2016
    Messages : 11
    Points : 7
    Points
    7

    Par défaut

    Citation Envoyé par chrtophe Voir le message
    Si tu écris une fonction en assembleur, tu peux le faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void fonction() 
    {
      asm {
       mov eax,1
       ...
     }
    }
    ou la déclarer en extern, assembler le fichier.S et lier les fichiers objets.
    Merci pour votre reponse, le probleme c'est que la fonction on doit l'écrire en assembleur dans le fichier.S donc ça je sais faire, quelques chose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     .data
    .text
    .global fonction
    fonction: 
    MOV R1, #0 
    ............
    bx lr 
    .end
    Ce que je ne sais pas faire c'est quoi écrire dans le Fichier.h, il dit d'y écrire le prototype sauf, comment faire cela?
    Et puis dans le main, je suppose qu'on doit déclarer le fichier.h et le fichier.s pour tester (par exemple en language C on fait un #include ) mais en assembleur, je ne sais pas comment procéder.

  9. #9
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    8 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 8 387
    Points : 18 788
    Points
    18 788

    Par défaut

    Un prototype, c'est une définition des paramètres d"une fonction.
    Tu dois compiler tes fichiers .c et .S à part (pour un fichier en assembleur on dit assembler) et les regrouper en un exécutable en utilisant le linker.

    exemple sous Linux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc fichier_c.c -c fichier_c.o
    Ceci va crée un fichier objet non exécutable pour fichier_c.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nasm -f elf fichier_asm.S
    Ceci va créer un fichier objet (au format ELF, le format objet par défaut sous Linux).

    Ensuite pour créer exécutable il faut lier les deux fichiers objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc fichier_c.o fichier_s.o -o fichier_executable
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

Discussions similaires

  1. Réponses: 8
    Dernier message: 13/03/2017, 15h54
  2. [Débutant] Exercice sur les nombres en précision arbitraire
    Par LeFredd dans le forum Général Algorithmique
    Réponses: 14
    Dernier message: 21/02/2015, 14h11
  3. [Débutant] exercice sur la récursivité
    Par neufrdb dans le forum Général Algorithmique
    Réponses: 2
    Dernier message: 03/03/2011, 17h59
  4. [Turbo Pascal] [Débutante] Exercice sur l'héritage
    Par sandra-n dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 09/01/2009, 23h49
  5. [débutant] question sur les #
    Par Ultros dans le forum C
    Réponses: 3
    Dernier message: 29/04/2004, 12h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo