24.06.2013 Views

Programmation proche du hardware avec le kit de développement ...

Programmation proche du hardware avec le kit de développement ...

Programmation proche du hardware avec le kit de développement ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Avec une macro<br />

Hardwarenahe Programmierung in C<br />

/* Definition of the macro instruction,<br />

which could be done in a hea<strong>de</strong>r fi<strong>le</strong> */<br />

#<strong>de</strong>fine Paral<strong>le</strong>lport *((volati<strong>le</strong> unsigned char *) 0x00F1)<br />

/* Call the macro */<br />

Paral<strong>le</strong>lport = 0x12;<br />

Toutes <strong>le</strong>s variab<strong>le</strong>s, qui peuvent changer sans que <strong>le</strong> compilateur <strong>le</strong> remarque ou dont <strong>le</strong> changement<br />

peut influencer <strong>le</strong> <strong>hardware</strong>, doivent toujours être définies <strong>de</strong> façon volati<strong>le</strong>. C'est-à-dire, toutes <strong>le</strong>s<br />

variab<strong>le</strong>s qui ont un rapport <strong>avec</strong> <strong>le</strong> <strong>hardware</strong>, ou qui peuvent être changée dans une routine<br />

d’interruption.<br />

Le co<strong>de</strong> peut souvent fonctionner sans <strong>le</strong> mot clé volati<strong>le</strong>. Toutefois un complément ou une<br />

modification <strong>du</strong> co<strong>de</strong> peuvent engendrer <strong>de</strong>s problèmes, qui seront diffici<strong>le</strong>ment localisab<strong>le</strong>s.<br />

Les optimisations <strong>du</strong> compilateur peuvent éga<strong>le</strong>ment être d’autres natures, que cel<strong>le</strong>s décrites ci<strong>de</strong>ssus.<br />

Par exemp<strong>le</strong>, <strong>le</strong> contenu d’une variab<strong>le</strong> peut être stocké dans un registre <strong>du</strong> processeur tout au<br />

début <strong>de</strong> la fonction. L’accès à ce type <strong>de</strong> registre est en généra<strong>le</strong> beaucoup plus rapi<strong>de</strong> que l’accès à la<br />

mémoire <strong>de</strong>s données. Tous <strong>le</strong>s traitements <strong>de</strong> la variab<strong>le</strong> s’effectueront alors à l’ai<strong>de</strong> <strong>de</strong> ce registre. A<br />

la fin <strong>de</strong> la fonction, <strong>le</strong> contenu <strong>du</strong> registre sera écrit dans la variab<strong>le</strong>. Le co<strong>de</strong> <strong>de</strong>vient ainsi beaucoup<br />

plus rapi<strong>de</strong>. Mais si cette optimisation se fait toujours au détriment <strong>de</strong> l’accès direct <strong>hardware</strong>. Par<br />

conséquent, <strong>le</strong> co<strong>de</strong> ne pourrait plus fonctionner correctement.<br />

4.5 Déviation <strong>de</strong>s fonctions d’entrée et <strong>de</strong> sortie<br />

Les microprocesseurs ne possè<strong>de</strong>nt ni <strong>de</strong> système <strong>de</strong> fichiers ni <strong>de</strong> fonctions d’entrée et <strong>de</strong> sortie. Les<br />

bibliothèques standards permettent néanmoins d’adapter ces fonctions au <strong>hardware</strong>. Dans <strong>le</strong> cas <strong>le</strong> plus<br />

simp<strong>le</strong>, il suffit <strong>de</strong> redéfinir <strong>le</strong>s fonctions putc(), getc() et éventuel<strong>le</strong>ment ungetc(). Les autres<br />

fonctions <strong>de</strong> la librairie standard d’entrée et <strong>de</strong> sortie (stdio.h) utilisent ces fonctions.<br />

Si l’on veut utiliser un système <strong>de</strong> fichier <strong>avec</strong> plusieurs canaux d’entrée et <strong>de</strong> sortie, on doit<br />

éga<strong>le</strong>ment programmer <strong>le</strong>s fonctions fopen(), fclose() et éventuel<strong>le</strong>ment d’autres fonctions<br />

spécia<strong>le</strong>s comme ftell() ou fseek().<br />

L’argument pointeur sur fichier (FILE *) peut être ignoré dans <strong>le</strong>s fonctions getc() et putc()<br />

lorsque l’on ne travail<strong>le</strong> pas <strong>avec</strong> un système <strong>de</strong> fichier. La déviation <strong>de</strong>s entrées et <strong>de</strong>s sorties sur<br />

notre système <strong>de</strong> <strong>développement</strong> peut être définie <strong>de</strong> la manière suivante :<br />

int putc (int c, FILE *stream)<br />

{<br />

SendByteToSerialPort(c);<br />

return c; /* Should return EOF when an error has occured */<br />

}<br />

int getc (FILE *stream)<br />

{<br />

/* return next character (or EOF when an error has occurred)*/<br />

return GetByteFromSerialPort();<br />

}<br />

34 / 41

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!