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.
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.
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 :
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).
|
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.
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.
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.
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 varie entre
, et
la valeur de
est bornée par
.
![]() |
(3.1) |
Par exemple, si et
, on obtient
donc
. Par defaut, la valeur
du multiplicateur est 2024.
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:
Les interruptions sur le MC68VZ328 sont traitées comme illustré sur la Fig
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.
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.
|
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.
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).
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
xxxxx est remplacé par les 5 bits de poids fort
du registre de vecteur d'interruption (IVR) |
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 ).
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.
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.
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.
Le module UART possède 5 signaux pour communiquer avec des composants externes compatibles UART :
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.
est utilisé pour le contrôle de flux hardware. Si
est à 1, l'émetteur termine l'envoie du caractère en
cours, et attend que
s'inverse avant d'envoyer le caractère suivant. Une interruption peut être générée quand la pin
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 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.
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.
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 .
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 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 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.
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.
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
() 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!#]
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 utilisée par le contrôleur LCD pour mettre à jour une ligne de l'écran est :
Pendant la même période, le buffer de ligne doit être rempli. Le temps correspond au temps que le cycle DMA va utiliser
le bus :
Donc, le pourcentage d'utilisation du bus par le contrôleur DMA pour rafraîchir l'écran LCD est :
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).
|
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 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.
|
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é.
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.
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.
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!#]