next up previous contents
suivant: Concepts des systèmes d'exploitation monter: Table des matières précédent: Choix de la plateforme   Table des matières

Sous-sections

Architecture du palm

Tout système d'exploitation est évidemment lié à l'architecture de la machine sur laquelle il tourne. Pour pouvoir implémenter un système d'exploitation temps-réel, nous devons étudier l'architecture des Palm. Il faut notamment être capable de capter les interruptions, piloter l'écran LCD, voir d'utiliser le port série et le port infrarouge.

Description générale du Palm

Les Palms actuels utilisent des processeurs de la famille MC68XX000 de chez Motorola appelés DragonBall. Plus précisément, le Palm III utilise un MC68328, le Palm Vx utilise un MC68EZ328 et le Palm m500 utilise un MC68VZ328. Nous avons travaillé avec un Palm m500, donc nous pourrions nous contenter de regarder le MC68VZ328. Mais les différences entres ces processeurs sont très minimes et nous allons présenter une description commune de ces processeurs, en prenant comme exemple le MC68VZ328, puis nous donnerons brièvement les différences entre chacun d'eux. Cela permet de facilement effectuer le portage de notre système d'exploitation sur différents modèles de Palm.

Le processeur

Architecture de base

Pour améliorer la capacité totale du sytème, réduire le nombre de composants et le coût des implémentations, le DragonBall combine un puissant processeur avec des modules périphériques intelligents. L'architecture des DragonBall est composée des blocs suivants :

Figure: Diagramme du MC68VZ328
\begin{figure}\begin{center}
\epsfig{file=architecture/mc68vz328, height=10cm}
\end{center}\end{figure}

Processeur central

Le processeur central du DragonBall MC68VZ328 est un FLX68000 qui est une version mise a jour du processeur 32-bit M68000. Les caractéristiques principales sont :

Modèle de programmation

Le processeur possède des registres de 32-bit et un compteur de programme (PC) de 32-bit. Les huits premiers registres (D7-D0) sont des registres de données qui sont utilisés pour des opérations sur des byte (8-bit), word (16-bit) ou long (32-bit). Quand on utilise les registres de données pour manipuler les données, ils affectent le registre de status (SR). Les 7 registres suivant (A6-A0) et le pointeur de pile utilisateur (USP) peuvent fonctionner comme pointeur de pile software et comme registre d'adresse. Ces registres peuvent être utilisés pour des opérations sur des word et des long, mais ils n'affectent pas le registre de statut. Les registres D7-D0 et A6-A0 peuvent être utilisés comme registres d'index.

Dans le mode superviseur, le byte de poid fort du registre de statut peut aussi être programmé. Ce registre contient le masque d'interruption avec 7 niveaux disponibles, ainsi que les codes extend (X), negative (N), zero (Z), overflow (V), carry (C) et superviseur (S).

Types de données et mode d'adressage

Il existe 5 types de données et 6 types principaux de modes d'adressage. Ces 6 types principaux se subdivisent en 14 modes d'adressage différents en fonction du type des registres sur lesquels on travaille (données ou adresses), de l'utilisation d'un offset, pré-incrémentation, post-incrémentation, etc (voir [#!M68kUM!#]).


Tableau: Types de données et types de modes d'adressage
Types de données Types de modes d'adressage
Bits Registre direct
Nombre BCD Registre indirect
Bytes Absolu
Words PC relatif
Long words Immédiat
  Implicite


Jeu d'instructions

Le jeu d'instructions supporte les langages de haut niveau, ce qui facilite la programmation. Presque toutes les instructions opèrent sur les bytes, words et long-words, et la plupart peuvent utiliser les 14 modes d'adressage. Les instructions comprennent les multiplications et les divisions, signées et non signées, les opération arithmétiques, les opérations logiques, des instructions spéciales liées aux interruptions et bien d'autres. (Voir [#!MC68VZ328!#] et [#!M68kUM!#]).

Logique chip-select et interface de bus

Le registre de contrôle du système (SCR) permet de configurer le status du système et la logique de contrôle, la génération d'erreur de bus, la violation de privilège, etc.

Le dragonBall fournit 8 signaux chip-select programmables pour autoriser la sélection d'une grande variété de périphériques mémoires ou d'autres périphériques externes. Chaque bloque chip-select configure certains paramètres comme l'accès en lecture seule ou en lecture/écriture, la générération d'un signal d'acquittement (DTACK), le nombre d'état d'attente, un bus 8 ou 16 bit, etc.

Boucle de blocage de phase et contrôle d'alimentation

Le synthétiseur d'horloge fonctionne avec un crystal externe en utilisant une boucle de blocage de phase interne (PLL) pour générer les différents signaux d'horloges. Une horloge externe peut être utilisée pour piloter directement le signal d'horloge à la fréquence opérationnelle.

Le module de contrôle d'alimentation peut être configuré pour optimiser la consommation. Le contrôle d'alimentation offre 3 modes de fonctionnements : normal, assoupi (doze) et dormant (sleep). Une interruption permet de passer d'un mode économique au mode normal.

Contrôleur d'interruption

Le contrôleur d'interruption classe les requètes d'interruption internes ou externes par ordre de priorité et génère un vecteur d'interruption pendant le cycle d'acquittement du CPU. Un emboitement d'interruptions est aussi fourni, ainsi les routines d'interruption de plus faible priorité peuvent être suspendues pour une requète d'interruption de priorité supérieure. Nous reviendrons en détails sur ce contrôleur dans une section ultérieure.

Ports d'entrée/sortie

Le dragonBall supporte un ensemble de ports d'entrée/sortie à utilité générale que l'on peut configurer en broche d'entrée/sortie générale ou pour des périphériques spécifiques. Chaque broche peut être programmée indépendamment comme broche d'entrée/sortie générale ou broche spécifique.

Modulateur d'impulsion

Le modulateur d'impulsion (PWM) peut être utilisé pour générer du son. Le modulateur possède un tampon FIFO de 5 bytes qui permet d'améliorer les performances en autorisant le CPU à servir une autre interruption.

Timer

Le dragonBall dispose de 1 ou 2 timers qui peuvent être utilisés de plusieures façons pour capturer la valeur du timer lors d'un événement externe, pour déclencher un événement externe ou une interruption quand le timer atteint une certaine valeur ou pour compter un nombre d'événements externes. Le timer possède un registre de mise à l'échelle de 8 bits pour fournir une fréquence d'horloge programmable dérivée de l'horloge du système.

Interface de périphérique série

L'interface de périphérique série (SPI) est utilisée principalement pour contrôler des périphériques externes. Les données passées sont synchronisées avec l'horloge SPI et sont transmises et envoyées avec la même fréquence. Le module SPI est uniquement en mode maître, ce qui signifie qu'il initialise les transferts SPI du DragonBall vers le périphérique.

UART et support de communication infra-rouge

L'UART communique avec les composants externes suivant un protocole standard asynchrone avec un débit entre 300 bps et 1152 kbps. L'UART fournit le signal pour piloter directement les récepteurs infra-rouge. Dans le 68VZ328, il y a deux UARTs disponible.

Contrôleur LCD

Le contrôleur LCD est utilisé pour afficher des données sur un module LCD. Il prend les données de la mémoire et fournit les signaux de contrôle et les données au module LCD.

Horloge temps-réel

L'horloge temps-réel fournit l'heure du jour avec une résolution d'une seconde. Il utilise le crystal (32,768 ou 38,4 kHz) comme source d'horloge pour garder l'heure correcte. Il garde l'heure tant que le DragonBall est alimenté même si celui-ci est en mode sleep ou doze. Le timer logiciel chien de garde protège contre les pannes du système en fournissant un moyen d'échapper à une situation inattendue des entrées, d'événements extérieurs ou d'erreurs de programmation. Une fois démarré, le timer doit être effacé par logiciel régulièrement pour éviter qu'il n'atteigne la valeur de time-out. Quand il atteint sa valeur de time-out, le timer reset ou interrompt le processeur.

Contrôleur DRAM

Le contrôleur DRAM fournit une interface unifiée 8 ou 16 bits pour la plupart des composants mémoires du marché.

Module de génération d'horloge (CGM) et de contrôle d'alimentation (PCM)

Le module de génération d'horloge (CGM)

Dans le DragonBall MC68VZ328, on ne parle plus de boucle de blocage de phase (PLL) mais de module de génération d'horloge (CGM). Nous utiliserons la nouvelle syntaxe. Le CGM utilise un oscillateur à basse fréquence avec une chaine de multiplication/division pour produire le signal d'horloge utilisé dans le processeur. La fréquence de chaque horloge (excepté celle à basse fréquence) est paramètrée individuellement par logiciel.

Le CGM produit quatre signaux d'horloge (voir [#!MC68VZ328!#] pour la répartition des signaux d'horloge):

Le CGM est constitué de 6 parties principales (voir Fig [*]). L'horloge pour le CGM est un oscillateur composé d'un crystal externe connecté au circuit oscillateur interne XTAL. La sortie de l'oscillateur XTAL est le signal CLK32, dont la fréquence est déterminée par la fréquence du crystal externe. Le signal d'horloge CLK32 sert de source pour le PLL et la plupart des autres modules dans le MC68VZ328.

La fréquence de sortie du PLL (PLLCLK) est déterminée par la fréquence de CLK32 et par les valeurs des champs PC et QC du registre de sélection de la fréquence du PLL (PLLFSR). La sortie du PLL est appliquée à une chaine de division composée de 2 diviseurs (prescalers). Le signal PLLCLK passe dans le premier diviseur, sa fréquence de sortie est déterminée par un bit dans le registre PLLCR. La sortie est envoyée dans le deuxième diviseur dont la fréquence de sortie (DMACLK) est contrôlée par un bit (PRESC2) dans le register PLLCR. Le signal DMACLK est appliqué au contrôleur LCD dans le MC68VZ328 et sert aussi de signal d'horloge pour le diviseur d'horloge LCD et le diviseur de SYSCLK.

La sortie du diviseur d'horloge LCD est LCDCLK dont la fréquence est paramétrable par le champs LCDCLK du registre PLLCR. Le signal LCDCLK est utilisé uniquement par le contrôleur LCD. Le diviseur SYSCLK produit le signal d'horloge SYSCLK qui est utilisé dans le MC68VZ328. SYSCLK est aussi utilisé comme signal d'horloge CPU (CPUCLK) par le CPU central. SYSCLK est le seul signal d'horloge du CGM disponible pour les composants externes via la sortie bufferisée du port F (CLKO/PF2). La sortie est disponible si le bit CLKEN est mis à 1 dans le registre PLLCR et si le bit 2 du registre de sélection du port F (PFSEL) est mis à 0.

Figure: Module de génération d'horloge (CGM)
\begin{figure}\begin{center}
\epsfig{file=architecture/CGM2, height=6.5cm}
\end{center}\end{figure}

Le PLL utilise un compteur à coefficient dual pour multiplier la fréquence CLK32 avant de l'envoyer vers les prescalers et le reste de la chaîne de division. Un compteur à coefficient dual fonctionne différemment d'un autre compteur car le coefficient de mutliplication dépend de deux valeurs séparées, PC et QC.

La valeur du coefficient est donnée par l'équation suivante dans laquelle, la valeur de $Q$ varie entre $1\ \leq\ Q\ \leq\ 14$, et la valeur de $P$ est bornée par $P\ \geq\ Q\ +\ 1$.


\begin{displaymath}
Multiplicateur\ = \ 2\ (14\ (P+1)\ +\ Q\ +\ 1)
\end{displaymath} (3.1)

Par exemple, si $Q=3$ et $P=71$, on obtient $Multiplicateur = 2024$ donc $2024\ *\ 32,768\ kHz\ \simeq\ 66\ MHz$. Par defaut, la valeur du multiplicateur est 2024.

Module de contrôle d'alimentation (PCM)

Le module de contrôle d'alimentation (PCM) du MC68EZ328 possède 4 modes d'exécutions : normal, burst, doze et sleep. Dans le mode normal le PCM ne fonctionne pas. Le DragonBall entre dans le mode burst quand le PCM fonctionne. Dans le mode burst, le PCM contrôle l'espacement des impulsions du signal CPUCLK vers le CPU. Si l'espacement des impulsions est réduit à 0, CPUCLK ne fonctionne plus et le MC68VZ328 entre dans le mode doze. Le mode d'alimentation le plus bas est le mode sleep. Le mode sleep est activé quand on désactive le PLL grâce au bit DISPLL dans le registre PLLCR. Quand le PLL est désactivé,tous les signaux d'horloge sont désactivés dans le CGM sauf CLK32.

Contrôleur d'interruption

Le contrôleur d'interruption supporte les interruptions internes ainsi que les interruptions externes, sur flancs ou sur niveaux. Il y a sept niveaux d'interruption. Le niveau 7 à la plus haute priorité et le niveau 1 la plus basse. Les interruptions peuvent provenir entre autre des sources suivantes sur le MC68EZ328:

Fonctionnement des interruptions

Les interruptions sur le MC68VZ328 sont traitées comme illustré sur la Fig [*]

Figure: Diagramme de traitement des interruptions
\begin{figure}\begin{center}
\epsfig{file=architecture/irq1, height=8cm}
\end{center}\end{figure}

  1. Le contrôleur d'interruption collecte les interruptions des périphériques internes et externes, il les classe pas ordre de priorité et présente la requète de plus haute priorité au CPU si il n'y a pas d'interruption de plus haute priorité en cours. Sinon, l'interruption de plus haute priorité en cours est traitée en premier.
  2. Le CPU répond à la requète d'interruption en exécutant un cycle d'acquittement d'interruption après la fin de l'instruction en cours.
  3. Le contrôleur d'interruption reconnait le cycle d'acquittement d'interruption (IACK) et place le vecteur d'interruption pour cette requète sur le bus CPU.
  4. Le CPU lit le vecteur et l'adresse du handler d'interruption dans la table des vecteurs d'interruption et commence l'exécution à cette adresse.

Les étapes 2 et 4 sont la responsabilité du CPU, tandis que les étapes 1 et 3 sont la responsabilité du contrôleur d'interruption. Les composants externes ne doivent pas répondre aux cycles d'acquittement avec un vecteur car la réponse est uniquement de la responsabilité du contrôleur d'interruption.

A l'étape 2, le registre de statut (SR) du CPU est utilisé pour masquer les interruptions globalement ou pour déterminer quel niveau de priorité peut actuellement générer des interruptions.

A l'étape 4, le CPU lit le vecteur, le multiplie par 4 pour obtenir l'adresse du vecteur (car les adresses sont sur 32 bits et les vecteurs sur 8 bits) et ensuite saute à cette adresse de 4 bytes. Cette adresse de 4 bytes est l'adresse de la première instruction de la routine d'interruption.

Vecteurs d'exception

Un vecteur est un nombre de 8 bits qui peut être multiplié par 4 pour obtenir l'adresse d'un vecteur d'exception. Le vecteur d'exception permet au processeur d'obtenir l'adresse de la routine d'exception (handler). Chaque exception possède un vecteur, comme décrit dans la Table [*]. Les interruptions utilisateurs font partie du traitement des exceptions dans le DragonBall et les vecteurs pour les interruptions utilisateurs sont configurables.

Le DragonBall ne fournit pas d'auto-vecteur d'interruption. Au démarrage du système, il faut programmer le vecteur d'interruption utilisateur pour que le processeur puisse gérer les interruptions correctement.


Tableau: Assignation des vecteurs d'exception
Vecteur Adresse Assignation
HEX DECIMAL DECIMAL HEX  
0 0 0 000 Reset : Initial SSP
1 1 4 004 Reset : Initial PC
2 2 8 008 Bus Error
3 3 12 00C Address Error
4 4 16 010 Illegal Instruction
5 5 20 014 Divide-by-zero
6 6 24 018 CHK Instruction
7 7 28 01C TRAPC Instruction
8 8 32 020 Privilege Violation
9 9 36 024 Trace
A 10 40 028 Line 1010 Emulator
B 11 44 02C Line 1111 Emulator
C-E 12-14 48-56 030-038 Unassigned, Reserved
F 15 60 03C Uninitialized Interrupt Vector
10-17 16-23 64-92 040-05C Unassigned, Reserved
18 24 96 060 Spurious Interrupt
19 25 100 064 Level 1 Interrupt Autovector
1A 26 104 068 Level 2 Interrupt Autovector
1B 27 108 06C Level 3 Interrupt Autovector
1C 28 112 070 Level 4 Interrupt Autovector
1D 29 116 074 Level 5 Interrupt Autovector
1E 30 120 078 Level 6 Interrupt Autovector
1F 31 124 07C Level 7 Interrupt Autovector
20-2F 32-47 128-188 080-0BC TRAP Instruction Vectors
30-3F 48-63 192-255 0C0-0FF Unassigned, Reserved
40-FF 64-255 256-1020 100-3FC User Interrupt Vectors


Reset

L'exception reset correspond au niveau d'exception le plus haut. Une exception reset est traitée pour l'initialisation du sytème et lors d'une panne importante. Tout traitement en cours lors d'un reset est abandonné et ne peut plus être récupéré. Ni le compteur de programme (PC), ni le registre de statut (SR) ne sont sauvés. Le processeur est forcé dans l'état superviseur. Le masque de priorité d'interruption est mis à 7. L'adresse dans les 2 premiers mots du vecteur d'exception du reset est utilisée par le processeur comme SSP (Supervisor stack pointer) initial et l'adresse dans les 2 mots suivants du vecteur d'exception du reset est utilisée comme PC initial.

Au démarrage ou lors d'un reset, le chip-select par défaut (CSA0) est activé et tous les autres chip-select sont désactivés. Il faut utiliser CSA0 pour décoder un espace mémoire EPROM/ROM. Dans ce cas, les deux premiers mots "long" de la mémoire EPROM/ROM doivent être programmés pour contenir les SSP et PC initiaux. Le SSP initial doit pointer vers un espace RAM et le PC initial doit pointer vers le code de démarrage dans l'espace EPROM/ROM pour que le processeur puisse exécuter le code de démarrage et lancer le système.

Opération du contrôleur d'interruption

Quand les interruptions sont recues par le contrôleur, elles sont classées par ordre de priorité et l'interruption autorisée, en attente et de niveau le plus haut est transmise au processeur. Avant que le CPU ne réponde à cette interruption, le registre de statut est copié en interne. Puis le bit S du registre de statut est mis à 1 ce qui place le processeur dans le mode superviseur. Ensuite, le CPU répond avec un cycle d'acquitement, dans lequel les 3 bits de poids faible du bus d'adresse reflètent le niveau de l'interruption courante. Le contrôleur d'interruption génère le vecteur pendant le cycle d'accusé de réception et le CPU utilise ce nombre pour obtenir l'adresse de la routine d'interruption. Sauf pour l'exception reset, le CPU sauve sur la pile le statut courant du processeur : la valeur du PC (qui pointe vers la prochaine instruction à exécuter après l'interruption), et la copie sauvée du registre de statut. Le nouveau PC est mis à jour avec l'adresse de la routine d'interruption. Ensuite, le CPU exécute cette routine d'interruption.

La priorité des interruptions est basée sur le niveau d'interruption. Si le CPU est en train de traiter une routine de service d'interruption et qu'une interruption de priorité supérieure est reçue, le processus décrit ci-dessus est repété et l'interruption de priorité supérieure est traitée. Si la priorité de la nouvelle interruption est inférieure ou égale à l'interruption courante, l'exécution de la routine d'interruption courante continue. Cette nouvelle interruption est postposée jusqu'à ce que sa priorité deviennent la plus élevée. Les interruptions dans un même niveau de priorité doivent être classées dans la routine d'interruption. La routine du service d'interruption doit se terminer par l'instruction RTE, qui restaure l'état du processeur avant l'interruption.

Toutes les interruptions sont masquables par le contrôleur d'interruption. Placer un bit à 1 dans le registre de masquage des interruptions (IMR) désactive cette interruption. Si une interruption est masquée, son statut est toujours accessible par le registre d'interruption en suspens (IPR).

Génération de vecteur

Le DragonBall fournit un vecteur d'interruption pour chacun des 7 niveaux d'interruptions utilisateurs. Ces vecteurs d'interruption forment la section vecteur d'interruption utilisateur de la Table [*]. Les vecteurs d'interruptions utilisateurs peuvent être situés n'importe où dans l'intervalle d'adresse 0x100 à 0x400. Il est possible de programmer les 5 bits de poids fort du vecteur d'interruption (IVR) pour autoriser le vecteur d'interruption à pointer n'importe quelle adresse dans la table des vecteurs d'exception. Mais les 3 bits de poids faible reflètent le niveau d'interruption en cours.

Cependant, beaucoup des vecteurs sont assignées aux exceptions internes du CPU et ne peuvent être réutilisés. Cela laisse seulement un petit intervalle d'espace d'adresse (de 0x100 à 0x400) ou il est possible de configurer l'IVR pour localiser les vecteurs d'interruptions utilisateurs. Par exemple, si l'on place la valeur 0x40 dans l'IVR, la base du vecteur d'interruption pointe vers 0x100 (0x40 « 2), qui est le début des vecteurs d'interruption utilisateurs. Le codage pour les vecteurs est fourni dans la Table [*]


Tableau: Vecteurs d'interruption
Interruption Vecteur
Niveau 7 xxxxx111
Niveau 6 xxxxx110
Niveau 5 xxxxx101
Niveau 4 xxxxx100
Niveau 3 xxxxx011
Niveau 2 xxxxx010
Niveau 1 xxxxx001
xxxxx est remplacé par les 5 bits de poids fort
du registre de vecteur d'interruption (IVR)


Timer

Le Timer possède plusieurs utilités :

Le timer possède aussi un registre de mise à l'échelle (prescaler) de 8 bits qui fournit une fréquence d'horloge programmable (voir Fig [*]).

Figure: Diagramme du timer
\begin{figure}\begin{center}
\epsfig{file=architecture/timer1, height=5cm}
\end{center}\end{figure}

L'horloge source du timer est sélectionée par logiciel. L'horloge choisie est passée à travers le registre de mise à l'échelle qui agit comme un diviseur avec un facteur programmable entre 1 et 256. La sortie de ce diviseur pilote le compteur du timer. Les sources d'horloge sont SYSCLK, SYSCLK/16, CLK32 et une horloge externe venant de la pin timer I/O (TIN). L'horloge est séléctionnée par le champ CLKSOURCE du registre de contrôle du timer (TCTL). Le champ PRESCALER du registre de mise à l'échelle (TPRER) sélectionne le coefficient de division de la fréquence de l'horloge d'entrée. Le facteur de mise à l'échelle permet d'obtenir une période maximum de 512 secondes avec un crystal de 32,768 KHz et de 436 secondes avec un crytal de 38,4 khz. Des 4 horloges d'entrée possibles, seul CLK32 continue à fonctionner quand le DragonBall est en mode SLEEP.

Il y a deux types d'évènements qui produisent des interruptions : les évènements de comparaison et les évènements de capture. Les évènements de comparaison surviennent quand la valeur du compteur correspond au contenu du registre de comparaison. Les évènements de capture surviennent quand une transition définie de la pin TOUT/TIN est détectée.

Le compteur peut être programmé pour fonctionner dans 2 modes : restart et free-running. Le bit FRR dans le registre TCRL contrôle la manière dont le compteur fonctionne après un évènement de comparaison.

Mode Restart :
quand la valeur dans le registre de comparaison (TCMP) correspond à la valeur du compteur (TCN), le compteur est réinitialisé à 0, le bit d'évènement de comparaison (COMP) du registre de statut du timer (TSTAT) est mis à 1, l'interruption TIMER est déclenchée vers le contrôleur d'interruption si le bit IRQEN du registre de statut est à 1, le compteur recommence à compter. Ce mode est utile pour générer des évènements périodiques.
Mode free-running :
ce mode est similaire au mode Restart excepté que le compteur continue à compter sans être réinitialisé à 0 quand un évènement de comparaison apparaît. Quand le compteur atteint 0xFFFF, le compteur redémarre à 0 et continue à compter.

Le timer a un registre de capture de 16 bits qui peut prendre une photo du compteur quand une transition définie du signal appliquée à la pin TIN est reconnu par le détecteur de capture de flanc. Le type de transition qui déclenche la capture est séléctionné par le champ CAP du registre TCTL. Quand un évènement de capture apparaît, le bit CAPT du registre de statut est mis à 1. Une interruption de TIMER est déclenchée vers le contrôleur d'interruption si la fonction de capture est autorisée et si les interruptions de timer sont autorisées. Le timer est désactivé au reset.

Les pins TOUT/TIN sont multiplexées avec le bit 6 du port B. Le registre du port B détermine si la pin est assignée au timer ou à la pin 6 du port B. TOUT/TIN/PB6 est une pin bidirectionnelle. Quand la pin est configurée en entrée, la pin TIN est disponible comme source d'horloge pour le timer ou comme signal d'entrée pour les captures. Quand la pin est configurée en sortie, cette pin (TOUT) est utilisée pour basculer ou déclencher un signal quand un évènement de comparaison apparaît.

UART : Universal Asynchronous Receiver/Transmitter

L'UART permet d'incorporer des communications série, les données sont transmises en bloc de caractères à l'UART qui les envoie de manière série en utilisant le format standard "start-stop" (RS-232). Le module UART a les caractéristiques suivantes :

Dans le MC68VZ328, il y a deux modules UART dont le deuxième est une version améliorée avec notamment des buffers FIFO plus grands. Le module UART effectue toutes les opérations normales associées à la communication start-stop asynchrone. Les données séries sont transmises et recues au débit binaire standard en utilisant le générateur de débit interne.

Figure: Diagramme de l'UART
\begin{figure}\begin{center}
\epsfig{file=architecture/uart1, height=6.5cm}
\end{center}\end{figure}

Opération série

Le module UART a deux modes d'opérations :

Le module UART possède 5 signaux pour communiquer avec des composants externes compatibles UART :

TXD :
le signal de transmission de données RS-232 est le signal de sortie de l'émetteur série. Quand l'UART est en mode NRZ, les données normales sont sorties avec les marques transmises en logique haute et les espaces sont transmis en logique basse. Dans le mode IrDa, la pin est active pour chaque bit zéro à transmettre.
$\overline{\mbox{CTS}}$ :
le signal Clear To Send est une entrée active basse utilisée pour le contrôle du flux de transmission. L' émetteur attend que ce signal soit bas avant de commencer la transmition d'un caractère. Si le signal est inversé pendant la transmission d'un caractère, le caractère sera terminé mais plus aucun autre caractère ne sera transmis jusqu'à ce que le signal redevienne bas. On peut supprimer l'utilisation du signal CTS.
RXD :
le signal Receive Data est le signal d'entrée du récepteur série. Comme la pin TXD, quand le mode est NRZ, des données NRZ standard sont attendues. Dans le mode IrDa, un pulse d'au moins 1,63 $\mu$sec est attendu pour chaque bit 0 recu.
$\overline{\mbox{RTS}}$:
le signal Request To Send a 2 usages. Normalement, ce signal est utilisé pour le contrôle de flux quand le récepteur indique qu'il est prêt à recevoir des données en plaçant la pin à 0. Cette pin est connectée à la pin CTS de l'émetteur. Quand le buffer FIFO du récepteur est presque plein, la pin est inversée (haute). On peut aussi utiliser cette pin comme sortie générale.
UCLK :
la pin (entré/sortie) d'horloge de l'UART sert à deux usages. Elle peut servir comme source d'horloge pour l'horloge du générateur de débit ou elle peut servir pour émettre le bit d'horloge à un débit précis pour la synchronisation des opérations.

Emetteur

L'émetteur accepte un caractère du bus CPU et le transmet en série. Quand le buffer FIFO est vide, la sortie de l'émetteur est idle en continu (1 en mode NRZ et une polarité sélectionnable dans le mode IrDA). Quand un caractère est disponible pour la transmission, les bits start, stop et la polarité (si utilisée) sont ajoutés au caractère et il est transmis de manière série au débit binaire selectionné. L'émetteur présente un nouveau bit sur chaque flanc descendant du signal d'horloge.

L'émetteur envoie une interruption quand il a besoin de données (TX AVAIL). Il y a 3 interruptions masquables. Pour prendre le plein avantage du buffer FIFO de 8 bytes, il faut autoriser l'interruptions de buffer FIFO vide. La routine d'interruption chargera des données jusqu'à ce que le bit TX AVAIL dans le registre UTX soit 0 ou jusqu'à ce qu'il n'y ait plus de donnée à transmettre. L'émetteur ne génèrera pas une autre interruption tant que le buffer FIFO ne sera pas complètement vide. Si le driver logiciel a un grand temps de latence d'interruption, il faut utiliser l'interruption FIFO HALF. Dans ce cas, l'émetteur génère une interruption quand le buffer FIFO a moins de 4 bytes. Si on ne veut pas utiliser le buffer FIFO, il faut utiliser l'interruption TX AVAIL. Cette interruption est générée quand au moins une place est disponible dans le buffer. Toute donnée écrite dans le buffer quand le bit TX AVAIL est à 0 est ignorée.

$\overline{\mbox{CTS}}$ est utilisé pour le contrôle de flux hardware. Si $\overline{\mbox{CTS}}$ est à 1, l'émetteur termine l'envoie du caractère en cours, et attend que $\overline{\mbox{CTS}}$ s'inverse avant d'envoyer le caractère suivant. Une interruption peut être générée quand la pin $\overline{\mbox{CTS}}$ change d'état. Pour les applications qui n'utilisent pas de contrôle de flux hardware, comme les applications IrDA, le bit NOCTS du registre UTX doit être mis à 1. Quand ce bit est mis à 1, les caractères sont envoyés dès qu'ils sont disponibles dans le buffer.

Le bit SENDBREAK du registre UTX est utilisé pour générer un caractère Break. Si le bit TXEN du registre USTCNT est à 0 quand un caractère est en train d'être transmis, le caractère sera fini avant que l'émetteur ne devienne IDLE. Le buffer de l'émetteur est immédiatement purgé quand le bit TXEN est mis à 0. Quand le message a été complètemet envoyé et que l'UART est prête à être désactivée, il faut surveiller le bit BUSY pour déterminer quand l'émetteur a fini l'envoi du dernier caractère.

Quand le mode IrDA est sélectionné, l'émetteur produit une impulsion de moins de $3/16$ d'un temps de bit pour chaque zéro envoyé. Quand le bit TXPOL du registre UMISC est bas, le pulse est actif haut. Si le bit TXPOL est haut, le signal est actif bas et le niveau idle est haut.

Récepteur

Le récepteur accepte le flux de données séries et le convertit en caractères. Il opère en 2 modes : synchrone et asynchrone. Dans le mode synchrone, il recherche un bit start, le reconnait et échantillonne les bits de données suivants. La tolérence Jitter et l'imunité contre le bruit sont fournis en échantillonnant 16 fois par seconde chaque bit et en utilisant un circuit de "vote" pour améliorer l' échantillonnage. Les opérations IrDA doivent utiliser le mode asynchrone. Dans le mode synchrone, RXD est échantillonné à chaque flanc montant du bit d'horloge, qui est généré par le module d'UART ou fourni de l'extérieur. Quand le bit start est identifié, les bits restants sont décalés et chargés dans le buffer FIFO.

Si la parité est activée, le bit de parité est vérifié et son statut est reporté dans le registre URX. Similairement, les erreurs de trame, pauses et dépassements de la capacité des buffers (overrun) sont vérifiées et reportées. Les 4 bits de statut du registre URX sont valides uniquement quand on les lit comme un mot de 16 bits avec les caractères reçus.

Comme l'émetteur, le récepteur FIFO est possède trois interruptions concernant son buffer FIFO. Le bit OLD DATA dans le registre URX indique qu'il y a des caractères dans le buffer et que la ligne de réception est inactive depuis plus de 30 temps de bit. Ceci est utile pour déterminer la fin d'un bloc de caractères.

Quand le mode IrDA est activé, le récepteur attends une impulsion (1,6 msec nominale) pour chaque bit "zero" reçu.

Générateur de fréquence de modulation

Le générateur de fréquence de modulation 3.1 fournit l'horloge pour les blocs émetteur et récepteur. Il consiste en deux registres prescaler 3.2, un entier et un non entier, ainsi que d'un diviser $2^{n}$.

L'horloge source du générateur peut être l'horloge système (SYSCLK) ou peut être fournie sur la pin UCLK (dans le mode entrée). Pour les applications synchrones, la pin UCLK peut être configurée en entrée ou en sortie pour l'horloge d'un bit.

Le diviseur est un diviseur binaire $2^{n}$ avec 8 valeurs : 1,2,4,8,16,32,64 et 128. La valeur sélectionnée est l'horloge 16x (CLK16) pour le récepteur. Cette horloge est divisée par 16 pour fournir une horloge 1x (CLK1). Quand le bit CLKM du registre USTCNT est à 1, CLK1 est directement connectée avec le signal CLK16.

Le prescaler non entier est utilisé pour les opérations IrDA ou pour générer une fréquence de baud non standard. Par exemple dans le mode IrDA, le prescaler non-entier fournit une horloge at 1,843200 MHz (115,200 kHz x 16). Cette horloge est utilisé pour générer les impulsions transmises qui sont les $3/16$ d'un temps de bit de 115,200 kHz.

Le générateur de débit en baud peut fournir des débits en baud standard à partir d'horloge de plusieurs fréquences. Bien que la précision du débit soit optimale si le PLL opère avec le multiplicateur par défaut. Avec un crystal à 38,400 khz, l'horloge peut être généré avec une erreur infime et avec un crystal de 32,76 kHz, l'horloge standard peut être générée avec 0,1% d'exactitude.

Figure: Diagramme du générateur de débit en baud
\begin{figure}\begin{center}
\epsfig{file=architecture/uart2, height=6.5cm}
\end{center}\end{figure}

Le contrôleur LCD

Le contrôleur LCD (Liquid Crystal Display) fournit les données à afficher pour un écran LCD externe. Le contrôleur prend les données à afficher directement de la mémoire du système en utilisant des cycles de transfert DMA (Direct Memory Access) périodiques. Il utilise une bande passante très faible, ce qui laisse au CPU un temps de traitement suffisant.

Le contrôleur LCD est constitué de registres d'interface MPU, d'une logique de contrôle, d'un contrôleur d'écran DMA, d'un buffer de ligne, d'une logique de curseur, d'un contrôle de taux de frame et d'une interface pour panneaux LCD.

Opération

Les registres d'interface MPU paramètrent les différentes caractéristiques du contrôleur LCD. Ils sont connectés au bus du DragonBall. La logique de contrôle fournit le contrôle interne et calcule les signaux pour les autres blocs. Le DMA génère un signal de requête de bus ($\overline{BR}$) au CPU et quand le bus est libéré, il effectue quelques copies mémoires en rafale pour remplir le buffer de ligne.

Le buffer de ligne collecte les données à afficher de la mémoire du système pendant un cycle DMA et les fournit au bloc de logique du curseur. L'entrée est synchronisée avec l'horloge DMA rapide, alors que la sortie est synchronisée avec l'horloge de pixel LCD relativement lente. La logique de contrôle du curseur, quand elle est active, est utilisée pour générer un curseur en forme de bloc sur l'écran LCD. On peut changer la hauteur et la largeur du curseur en utilisant un nombre entre 1 et 31. Le curseur peut être complètement noir ou en mode vidéo inversé et le niveau du clignotement est ajustable quand le bit BKEN dans le registre de contrôle de clignotement du LCD (LBLKC) est activé.

Le contrôle du débit de frame est principalement utilisé pour des afficheurs à niveaux de gris et peut générer un maximum de 16 niveaux d'une échelle de gris représentés par 16 niveaux de densité. Le niveau de densité correspond au nombre de fois qu'un pixel est allumé quand l'affichage est rafraîchi. Comme le crystal et la tension peuvent varier, la qualité de l'échelle de gris peut être parametrée finement en programmant le registre de correspondance de la palette de gris du LCD (LGPMR).

La logique d'interface du LCD est utilisée pour placer les données à afficher dans l'ordre correcteet de les placer sur le bus de donnée du panneau LCD. La polarité des signaux LFLM, LP et LCKL et la valeur des pixels peuvent être programmées pour correspondre aux caractéristiques de différents panneaux LCD.

Pour plus d'information sur la programmation du contrôleur LCD voir [#!MC68VZ328!#]

Calcul de la bande passante nécessaire

Comme le rafraichissement de l'écran LCD intervient périodiquement, la charge que le contrôleur LCD ajoute au bus de données doit être prise en compte pour des applications temps-réel. Essayons d'estimer cette bande passante sur le bus de données.

Il faut prendre en compte quelques paramètres :

La période $T_{l}$ utilisée par le contrôleur LCD pour mettre à jour une ligne de l'écran est :

\begin{displaymath}T_{l} = \frac{1}{85\ \mbox{Hz}} \quad \frac{1}{160\ \mbox{lignes}}\ =\ 73,53\ \mu s\end{displaymath}


Pendant la même période, le buffer de ligne doit être rempli. Le temps $T_{DMA}$ correspond au temps que le cycle DMA va utiliser le bus :


\begin{displaymath}T_{DMA}\ =\ \frac{160\ \mbox{pixels}\ *\ 1\ \mbox{bits par pi...
...ks}}{33 \mbox{Mhz}\ *\ 16\ \mbox{bits de
bus}}\ =\ 0,61\ \mu s\end{displaymath}


Donc, le pourcentage d'utilisation du bus par le contrôleur DMA pour rafraîchir l'écran LCD est $P_{DMA}$ :

\begin{displaymath}P_{DMA}\ =\ \frac{0,61}{73,53}\ =\ 0,8\ \%\end{displaymath}

Comparaison des différents processeurs

Les 3 processeurs DragonBall 68328 (DB), 68EZ328 (EZ) et 68VZ328 (VZ) possèdent les mêmes caractéristiques à quelques détails près. Le 68VZ328 est le plus récent, c'est celui qui équipe le Palm m500, tous ses composants sont comparables ou sont des versions améliorées des anciens. La table [*] fournit un bref résumé des différences (voir [#!l_comp68k!#] pour plus d'information).


Tableau: Comparaison des processeurs DB, EZ, VZ
Module DB EZ VZ
CPU 68EC000 68EC000 FLX68000
Contrôleur LCD 4 gris (1024x512) 16 gris en (320 x 240) 16 gris (640x512)
Contrôleur DRAM Non fourni Fourni supporte SDRAM
Timers 2 1 2
RTC 1 Amélioré Amélioré
UART avec IrDA 1 1 2
Vitesse 16,58 Mhz 20 Mhz 33,16 Mhz
Port I/O 77 54 76
Tension 3,0 V à 3,6 V 3,0 V à 3,6 V 2,7 V à 3,3 V


La batterie

Comme le Palm m500 n'est pas plus gros ni plus lourd que le Palm Vx et comme le processeur est plus rapide, le temps de fonctionnement devrait avoir tendance à diminuer. Mais Palm a doté le m500 de la technologie la plus avancée à l'heure actuelle concernant les batteries. Le m500 est équipé d'une batterie rechargeable Lithium Ion Polymère, l'évolution de la batterie LiIon normale. Cette batterie possède un meilleur rapport énergie-poids et énergie-volume. Elle pèse 16 grammes, a une taille de 62x35mm et a une capacité de 540 mAh à 3,7V.

En mode idle (allumé, aucune action, pas de rétroéclairage), le m500 consomme a peut près 22mA par rapport à un Palm Vx qui fait 16 mA. Avec le rétroéclairage, la consommation aproche les 45 mA. Le m500 affiche un temps de fonctionnement de 21 heures sans rétroéclairage et de 11 heures avec rétroéclairage.

Le connecteur universel

Le m500 possède un nouveau connecteur de périphériques. Ce nouveau port fournit les fonctions USB et série. Le brochage du port est donné dans la table [*]. Les pins les plus intéressantes à remarquer sont les pins VOUT et ID.

Le Palm m500 est le premier Palm à fournir du courant aux périphériques externes. Les périphériques externes peuvent être construits plus petits et, après tout, pourquoi dépenser dans des batteries externes quand le Palm dispose déjà d'une batterie rechargeable ? La pin VOUT fournit un 3,3V régulé avec un courant de maximum 100 mA. Attention, VOUT est équipé d'un fusible de 250 mA.

La pin ID permet aux périphériques de s'identifier. En fonction de la résistance à la masse, les périphériques externes peuvent s'identifer comme berceau USB, berceau série, périphérique USB, périphérique série ou modem.

Tableau: Brochage du port universel du Palm M500
Pin du berceau de Nom du signal Descrition du signal
gauche à droite    
1 GND masse (connecté à la pin 7)
2 USB_D+ signal de donnée USB positif
3 USB_D- signal de donnée USB negatif
4 VBUS signal USB VBUS
5 HOTSYNC bouton hotsync : connecté
    au +3.3V déclenche un hotsync
6 - non connecté
7 GND masse (connecté à la pin 1)
8 ID indentification pour les périphiques
9 VOUT tension de sortie de +3.2V , 100mA max.
10 RxD signal RS-232 RxD (entrée)
11 TxD signal RS-232 TxD (sortie)
12 DETECT détection de péripherique
    tiré à la masse par les péripheriques
13 CTS signal RS-232 CTS (entrée)
14 RTS signal RS-232 RTS (sortie)
15 DTR signal RS-232 DTR (sortie)
16 CHARGE tension d'entrée +5V pour recharger
    500-700mA min.


Palm OS

Palm OS est le standard pour l'informatique de poche, cette forme d'informatique est destinée à aider les utilisateurs à gérer et accéder à toute l'information à n'importe quel moment et n'importe quel endroit. Les assistants utilisant Palm OS permettent d'effectuer cette gestion personnelle. Palm OS est un système d'exploitation optimisé pour fournir l'information demandée très rapidement.

Les contraintes de mémoire et de vitesse imposées par les assistants personnels de type Palm Pilot imposent de disposer d'un système d'exploitation très petit et bien conçu. Dans le cadre de ce travail, la partie la plus important de Palm OS que nous allons devoir étudier est l'architecture de la mémoire. En effet, pour placer un autre système d'exploitation dans le Palm, il faut comprendre comment la mémoire est organisée et pouvoir ainsi placer notre code dans la mémoire. Il nous suffira ensuite de déplacer le compteur de programme vers notre code pour que celui-ci soit exécuté.


Architecture mémoire

Toute la mémoire ROM et RAM de la machine réside dans un module mémoire appelé carte (card). Chaque carte peut contenir ROM, RAM ou les deux. Une carte est simplement une construction logique utilisé par le système d'exploitation.

La ROM et la RAM sur chaque carte sont divisées en un ou plusieurs tas (heap) de 64K. Tous les tas de RAM sur une carte mémoire sont traités comme le magasin de RAM et tous les tas de ROM sont traités comme le magasin de ROM. Les tas dans un magasin ne sont pas nécessairement adjacents dans l'espace d'adresses. Ils peuvent être éparpillés dans l'espace mémoire sur la carte mais ils doivent tous résider sur la même carte.

Les applications fournies avec les machines Palm OS sont placées en ROM. Cette conception permet à l'utilisateur de remplacer le système d'exploitation et l'entièreté des application simplement en installant un module de remplacement. Des applications additionnelles et des extentions du système peuvent être chargées en RAM.

Les adresses 32 bits fournissent un espace d'adressage de 4Gb pour l'enregistrement du code et des données. Cette espace d'adressage fournit un large potentiel de croissance pour les versions futures du matériel et du logiciel sans affecter le modèle d'exécution. Bien que l'on dispose d'un large espace d'adressage, Palm OS est conçu pour travailler avec une RAM de taille relativement petite. Le Palm m500 est un des plus gros modèles actuels. Il dispose d'une RAM de 8Mb.

Chaque carte a un espace d'adressage réservé de 256 MB. La carte 0 commence en 0x10000000, la carte 1 commence en 0x20000000, etc.

Figure: Représentation de la carte mémoire 0
\begin{figure}\begin{center}
\epsfig{file=architecture/memory1, height=4cm}
\end{center}\end{figure}

Palm OS divise la quantité totale du magasin de RAM en deux parties logiques : la RAM dynamique et la RAM de stockage. La RAM dynamique est utilisée comme espace de travail pour les allocations temporaires. Le reste de la RAM disponible sur la carte est utilisé comme zone de stockage.

Comme la mémoire du système est toujours alimentée, les deux parties de la RAM préservent leur contenu quand la machine est éteinte (faible consommation, mode SLEEP). Toute la mémoire de stockage est préservée quand on effectue un reset de la machine. Dans la séquence de démarrage, le système réinitialise la partie dynamique et laisse la partie de stockage intacte.

La partie de RAM dynamique est utilisée entièrement dans un simple tas (heap) qui fournit la mémoire pour les allocations dynamiques. A partir de cette zone dynamique, le système fournit la mémoire pour les variables globales, allocations dynamiques du système (TCP/IP, IrDA, ...), les piles des applications, etc.

La portion restante de RAM est configurée en un ou plusieurs tas utilisés pour le stockage des données utilisateurs non volatiles comme l'agenda, les mémos, le carnet d'adresses, etc. Une application accède à une zone de stockage en utilisant le gestionnaire de base de données (database manager) ou le gestionnaire de ressources (resource manager), selon qu'elle veut accéder à des données utilisateurs ou des ressources.

Figure: Représentation des tas dans une carte mémoire
\begin{figure}\begin{center}
\epsfig{file=architecture/memory2, height=5cm}
\end{center}\end{figure}

La taille et le nombre de tas de stockage disponibles sur une machine particulière dépendent de la version du système d'exploitation, de la quantité de RAM physique disponible, des exigences de stockages des applications utilisateurs (carnet d'adresses, agenda, etc).

Dans l'environnement Palm OS, toutes les données sont enregistrées dans des "chunks 3.3" du gestionnaire de mémoire. Un "chunk" est une zone de mémoire contiguë entre 1 byte et un peu moins de 64 Kb dans la zone qui a été allouée par le gestionnaire de mémoire. Toutes les implémentation actuelles de Palm OS limitent la taille maximum de chaque "chunk" à un peu moins de 64Kb. Chaque "chunk" réside dans un tas (heap). Certains tas en ROM contiennent seulement des chunks non déplacables, certains autres sont en RAM et peuvent être déplaçables ou non.

Chaque "chunk" mémoire utilisé pour stocker des données est un enregistrement dans une base de données implémentée par le gestionnaire de données du Palm OS. Dans l'environnement Palm OS, une base de données est simplement un liste de "chunks" mémoire et un en-tête d'information associé à la base de données. Normalement, les entrées dans une base de données partagent certaines associations logiques; par exemple, une base de données peut contenir une collection de toutes les entrées d'un carnet d'adresse, etc.

Une base de données est analogue à un fichier sur un PC. Comme pour un fichier traditionnel, les applications Palm OS peuvent créer, supprimer, ouvrir et fermer des bases de données si nécessaire. La seule restriction sur la localisation des enregistrements pour une base de données est qu'ils soient tous dans la même carte mémoire.

Enregistrer des données dans une base de données s'intègre parfaitement dans la conception du gestionnaire de mémoire. Chaque enregistrement dans une base de données est en fait un "chunk" du gestionnaire de mémoire. Le gestionnaire de données peut utiliser le gestionnaire de mémoire pour allouer, supprimer et redimensionner les enregistrements de la base de données. Tous les tas exceptés ceux du tas dynamique sont non volatiles, donc les enregistrements de la base de données peuvent être enregistrés dans n'importe quel tas excepté les tas dynamiques. Vu que les enregistrements peuvent être situés n'importe ou dans la carte mémoire, les bases de données peuvent être distibuées sur de multiples zones de RAM physique discontinues.

Pour plus d'information sur la manipulation des bases de données ou sur la représentation des "chunks" et des tas en mémoire, voir [#!PalmCompanion!#], [#!PalmReference!#] et [#!PalmMemory!#]


next up previous contents
suivant: Concepts des systèmes d'exploitation monter: Table des matières précédent: Choix de la plateforme   Table des matières
Fabian Skivee 2002-06-04