MAM

Ici, on met le turbo ...

Au chapitre Mémoire, nous avons vu que le LPC2106 intégrait un MAM qui accélérait les accès à la Flash.

De quoi s'agit-il ? Peut-on encore accélérer notre Blinky ou Quicky ??

L'acronyme MAM est la contraction de Memory Accelerator Module. Il s'agit d'un système mis en place par Philips (NXP) pour accélérer les accès à la mémoire Flash, mémoire qui est très lente de part sa technologie.

Nous avons vu que notre programme est stocké en Flash et que le pipeline accélère déjà le traitement par la lecture anticipée des instructions et des données à traiter.

L'idée supplémentaire retenue pour le LPC2106 est d'utiliser deux buffers 128 bits à accès rapide entre le coeur ARM et la mémoire Flash. Ces deux buffers vont engranger chacun leur tour 4 instructions en mode ARM 32 bits (ou 8 en mode Thumb 16 bits).

A chaque lecture dans la Flash, on aura donc préfetché 4 instructions/datas qui seront mises à disposition dans les buffers du MAM (puis 4 autres dans le second buffer). Lorsque le code se déroule de façon séquentielle, donc sans sauts ou boucles quelconques, le code à exécuter sera alors déjà contenu dans le buffer du MAM et sera donc fetché depuis là pour ensuite être décodé puis exécuté en entrant dans le pipeline.


Si on a de petits sauts arrières dans notre code, il se peut fort bien que ce code où l'on doit sauter soit encore dans les buffers du MAM, et s'il s'agit de petits sauts avant, il se peut également qu'il soit déjà préfetché dans ces mêmes buffers du MAM. S'il n'y est pas, la Flash sera alors directement lue.


On voit bien l'intérêt de ce Module d'Accélération, mais on se rend compte également que le programme ne sera pas tout le temps accéléré de la même façon, et qu'il sera très dépendant de ce que le MAM trouvera dans ses buffers à chaque instant.

On peut donc difficilement prévoir le Timing de notre code, c'est à dire combien de temps mettra telle ou telle partie de code à s'exécuter.

On dit alors que le système ne sera pas déterministe.


Pour y remédier, le MAM possède trois niveaux d'activation:


Modes MAM:


Mode 0:

Le MAM est désactivé et tous les accès se font directement en Flash. On sera plus lent, mais le code sera déterministe.



Mode 1:

Le MAM est partiellement activé et ne sera utilisé que pour dérouler du code séquentiel. Au niveau du timing, tout se passera comme si les sauts dans le programme étaient quant à eux directement fetchés en Flash.



Mode 2:

Le MAM est entièrement activé. Il sera utilisé pour exécuter le code séquentiel, mais recherchera aussi les portions de code déjà préfetchées qui seront utilisables dans le cas de sauts avant et arrière.



Le passage d'un mode à l'autre est logiciel et peut se faire à la volée. On pourra dès lors très bien utiliser le MAM en mode 2 en permanence pour profiter de toutes les performances du LPC2106, et passer en mode 0 pour les portions de code qui ont un timing très précis à respecter. Ceci fait, on repasse en mode 2 pour repartir à pleine vitesse !!





Configuration du MAM:


Le MAM est géré très simplement par deux registres 8 bits qui sont MAMCR et MAMTIM.



MAMCR (0xE01FC000):



Le registre MAMCR est le Registre de Contrôle qui va permettre de choisir parmi les trois mode de fonctionnement que l'on vient de décrire:



b1-b0: MAM Control bits:


00 MAM mode 0, désactivé


01 MAM mode 1, partiellement activé


10 MAM mode 2, totallement activé.


11 Réservé.



MAMTIM (0xE01FC004)


Le registre MAMTIM est le registre gérant le Timing du MAM, c'est à dire le nombre de cycles d'horloge du coeur Cclk qui seront utilisés pour les accès à la mémoire Flash.

Comme la vitesse du Core est variable suivant la programmation qui est faite de la PLL, on peut ici ajuster l'horloge du Core au bus de la Flash.




b2-b0:

000 Réservé


001 CycleMAM = 1 cycle Core


010 CycleMAM = 2 cycle Core


011 CycleMAM = 3 cycle Core


100 CycleMAM = 4 cycle Core


101 CycleMAM = 5 cycle Core


110 CycleMAM = 6 cycle Core


111 CycleMAM = 7 cycle Core



b7-b3: Réservés.



Les recommandations de NXP pour régler le MAMTIM sont les suivantes:


Cclk < 20MHz => MAMTIM = 1


20 < Cclk < 40MHz => MAMTIM = 2


Cclk > 40MHz => MAMTIM = 3.




On ne pourra pas overclocker le MAM sans risque de perdre des données. Il faut donc bien se fier aux indications données par NXP sur ce paramètre.



Pour notre Core clock à 58,98MHz, on choisira donc MAMTIM = 3.

Testons à présent l'influence du MAM sur notre programme, Speedy.