Précédent   Forum du club des développeurs et IT Pro > Général Développement > Programmation système > Embarqué
Embarqué Forum d'entraide sur la programmation des systèmes embarqués
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 15/11/2012, 19h09   #1
Daddy75
Invité de passage
 
Homme
Inscription : novembre 2012
Messages : 1
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Etats-Unis

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : novembre 2012
Messages : 1
Points : 0
Points : 0
Par défaut Ecriture/Lecture d'une adresse memoire

Bonjour,

Question basique pour la plupart d'entre vous mais j'aimerais votre confirmation.
J'ai besoin de lire la valeur d'un port et d'ecrire a l'adresse d'un autre sur un microcontroller ARM.
Voici mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* Port address */
#define INPUT_PORT_ADDR      0x40    //Input Port Address - to be defined
#define OUTPUT_PORT_ADDR   0x80  //Output Port Address  - to be defined

void Output_to_keypad(unsigned char output)
{
     unsigned char * KeypadRowPort = (unsigned char *)OUTPUT_PORT_ADDR;
     // Set output to keypad row
    *KeypadRowPort = output;
}

bit_8_e Input_from_keypad(void)
{
    bit_8_e InputKey;

    // Get input from keypad column
    InputKey = * ((bit_8_e *) INPUT_PORT_ADDR);

    return (InputKey);
}
N.B: "bit_8_e" est un typedef enum


Pouvez-vous me confirmer que cela est correct?
Daddy75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 12h51   #2
Anouschka
Membre régulier
 
Femme
Développeur en systèmes embarqués
Inscription : juin 2005
Messages : 95
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 30
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur en systèmes embarqués
Secteur : Conseil

Informations forums :
Inscription : juin 2005
Messages : 95
Points : 73
Points : 73
Envoyer un message via MSN à Anouschka Envoyer un message via Yahoo à Anouschka
Salut Daddy,

Tes fonctions sont correctes.

A+
Anouschka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 22h12   #3
prgasp77
Membre Expert
 
Avatar de prgasp77
 
Homme Yankel Scialom
Ingénieur en systèmes embarqués
Inscription : juin 2004
Messages : 1 001
Détails du profil
Informations personnelles :
Nom : Homme Yankel Scialom
Âge : 26
Localisation : France, Eure (Haute Normandie)

Informations professionnelles :
Activité : Ingénieur en systèmes embarqués
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : juin 2004
Messages : 1 001
Points : 1 422
Points : 1 422
Bonjour,
l’absence de l'utilisation du mot clé volatile pourrait te jouer de sales coups, de manière aléatoire.

Code C :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* Port address */
#define INPUT_PORT_ADDR      0x40    //Input Port Address - to be defined
#define OUTPUT_PORT_ADDR   0x80  //Output Port Address  - to be defined
 
void Output_to_keypad(unsigned char output)
{
     volatile unsigned char * KeypadRowPort = (volatile unsigned char *)OUTPUT_PORT_ADDR;
     // Set output to keypad row
    *KeypadRowPort = output;
}
 
bit_8_e Input_from_keypad(void)
{
    volatile bit_8_e InputKey;
 
    // Get input from keypad column
    InputKey = * ((volatile bit_8_e *) INPUT_PORT_ADDR);
 
    return (InputKey);
}

Cdlt,
__________________
gasp in touch
-- Yankel Scialom
prgasp77 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/11/2012, 11h43   #4
mith06
Membre confirmé
 
Ingénieur développement matériel électronique
Inscription : juillet 2010
Messages : 142
Détails du profil
Informations professionnelles :
Activité : Ingénieur développement matériel électronique
Secteur : Industrie

Informations forums :
Inscription : juillet 2010
Messages : 142
Points : 203
Points : 203
Salut,

Je pense que tu peux aussi déclarer ces méthodes inline.
mith06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2012, 07h44   #5
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 717
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur systèmes embarqués
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2009
Messages : 1 717
Points : 4 217
Points : 4 217
Je pense qu'on ne met inline à une fonction que si on a montré que cela était nécessaire avec profiler.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/11/2012, 12h56   #6
Anouschka
Membre régulier
 
Femme
Développeur en systèmes embarqués
Inscription : juin 2005
Messages : 95
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 30
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur en systèmes embarqués
Secteur : Conseil

Informations forums :
Inscription : juin 2005
Messages : 95
Points : 73
Points : 73
Envoyer un message via MSN à Anouschka Envoyer un message via Yahoo à Anouschka
@Bktero -> tu peux m'en dire plus sur profiler? Ca semble intéressant comme programme.
Sinon pour rebondir sur le inline, je suis de l'avis de mith06. En effet, ces fonctions comportent très peu d'instructions, donc elles s'exécuteront plus vite en inline (càd que l'appel de la fonction est remplacé par le compilateur par son contenu) que par un appel de fonction "classique", qui va en plus nécessiter une sauvegarde/restauration de la pile et des registres non volatiles, et des instructions de branchement.
Anouschka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 18h38   #7
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 717
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur systèmes embarqués
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2009
Messages : 1 717
Points : 4 217
Points : 4 217
Pour ce qui est du profiling (qu'on réalise avec un profiler) : http://en.wikipedia.org/wiki/Profili...er_programming)

Inline est un mot-clé que le compilateur n'est pas obligé de respecté, s'il juge que cela ne sert à rien de la rendre inline. Il est communément admis qu'on me mettra ce qualificatif à une fonction que si on se rend compte que cette fonction occupe un temps important (avec un profiler justement) et qu'on souhaite l'optimiser. On vérifiera que l'effet est vraiment positif. Le résultat pourrait être contre productif ! Voir la FAQ C++ à ce sujet : http://cpp.developpez.com/faq/cpp/?page=inline
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2012, 10h55   #8
daniel06600
Nouveau Membre du Club
 
Homme
Ingénieur Temps Réel Multitâche
Inscription : décembre 2007
Messages : 39
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 56
Localisation : France

Informations professionnelles :
Activité : Ingénieur Temps Réel Multitâche
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : décembre 2007
Messages : 39
Points : 29
Points : 29
Bonjour. Ton code semble correcte dans la théorie. Dans la pratique il peut y avoir un petit soucis avec le compilateur qui va chercher à optimiser ton code et il ne comprendra pas (bien sur) que tu travaille sur des valeurs qui sont des adresses physiques et non pas de simples valeurs qu'il peut traiter dans des registres internes au processeur. Slt.
daniel06600 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2012, 20h36   #9
monnoliv
Membre habitué
 
Inscription : août 2003
Messages : 127
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2003
Messages : 127
Points : 137
Points : 137
Si tu programmes en ARM (je suppose que c'est un Cortex-M puisque tu parles de Microcontrôleur), je te conseille vivement d'utiliser les librairies CMIS. Ton code sera plus portable et ce genre d'écriture directe de port n'est plus nécessaire:
Ex code:
Code :
1
2
3
4
#define mainLED_BIT       ( 7 )      //LED sur bit7
LPC_GPIO0->DIR |= ( 0x1 << mainLED_BIT );  //Port0.7 en sortie
LPC_GPIO0->MASKED_ACCESS[ ( 1 << mainLED_BIT) ] = ( ulLEDState << mainLED_BIT );  //affecter ulLEDState à LED
__________________
Cortex M0 M3 A8
monnoliv est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h52.


 
 
 
 
Partenaires

Hébergement Web