Je ne suis pas un expert, mais au fil du temps j'ai pu écrire certains utilitaires à inclure pour simplifier la tâche et surtout pour rendre certaines partie de code modulable et donc facilement réutilisable.
il y a peut-être des bugs, le fait de partager peut en faire apparaitre certains. Merci pour votre indulgence !
Je partage ici un premier module qui sert de base à la conception... d'autres modules !
Il s'agit d'un gestionnaire de mémoire RAM. A quoi ça sert me direz-vous puisque sous MPLAB on peut facilement déclarer nos variables avec CBLOCK/ENDC ? Prenons un exemple pour illustrer le concept:
Imaginons qu'un projet soit composé d'un fichier principal 'main.asm' utilisant ses variables, d'une bibliothèque utilitaire 'lcd.asm' utilisant aussi des variables et une deuxième bibliothèque d'utilitaire 'serial.asm' utilisant encore des variables. Si les variables sont déclarées avec CBLOCK/ENDC leurs adresses sont donc fixées "en dur" et là on se trouve face à un possible problème de collision d'adresse entre les variables distribuées sur 3 fichiers différents... Donc chaque fois qu'on inclu un nouveau module, on doit re-vérifier s'il n'y a pas collision d'adresse. ça peut être vite gonflant si on a beaucoup de module bibliothèque à inclure.
C'est là qu'intervient le gestionnaire de mémoire RAM: à l'aide de macros, on lui demande de déclarer une variable dans la bank de notre choix et c'est lui qui fixe son adresse physique.
Pour que ça marche, le gestionnaire doit d'abord connaître les adresses de début et de fin de la zone de mémoire commune (partagée) et celles de chaque bank. Pour cela, on ouvre le datasheet du pic utilisé et on utilise les macros suivantes:
Déclaration de la zone mémoire commune
AddSharedRamArea startadress, endadress
Déclaration d'une bank
AddRamBank bankid, startadress, endadress
Déclaration de plusieurs banks en même temps
AddRamBanks first_bankid, last_bankid, first_bank_startadress, first_bank_endadress, byte_offset_between_bank
exemple:
Code : Tout sélectionner
AddSharedRamArea 0x70, 0x7F ; ajoute une zone de mémoire commune de l'adresse 0x70 à 0x7F (inclue)
AddRamBank 0, 0x20, 0x6F ; ajoute la bank0 de l'adresse 0x20 à 0x6F
AddRamBanks 1, 11, 0xA0, 0xEF, 0x80 ; ajoute les bank1 à bank11, la bank1 commençant à 0xA0 jusque 0xEF
; et il y a un offset de 0x80 octets entre chaque bank
Maintenant qu'on a informé le gestionnaire de RAM de la configuration de notre PIC, on peut déclarer nos variables avec les macros suivantes:
AddSharedVar varname, bytecount
RamTargetBank bankid
AddVar varname, bytecount
exemple:
Code : Tout sélectionner
AddSharedVar w_temp, 1 ; ajoute la variable w_temp de 1 octet dans la mémoire commune
AddSharedVar status_temp, 1 ; ajoute la variable status_temp de 1 octet dans la mémoire commune
RamTargetBank 0 ; désigne la bank dans laquelle se trouveront les variables suivantes
AddVar compteur, 1 ; ajoute la variable compteur de 1 octet (donc dans la bank0)
AddVar buffer, 8 ; ajoute la variable buffer de 8 octets dans la bank0
RamTargetBank 1 ; désigne la bank1
AddVar buffer2, 80 ; buffer2 occupe 80 octets dans la bank1
En incluant le gestionnaire en début de notre fichier principal, et si chacune de nos bibliothèques utilisent ces macros, on peut toujours déclarer des variables dans la bank de notre choix sans se soucier de leur adresse physique, le gestionnaire s'occupe de les ranger et il génèrera un message d'erreur en cas de dépassement mémoire.
Je vous joint un zip d'exemple utilisant ce principe et contenant 4 fichiers:
principal.asm : le programme principal à compiler
Random.asm : module de génération de nombre aléatoire qui déclare ses propres variables
RamDefinition.asm : contiend la définition des zones de RAM du pic
RamManager.asm : le gestionnaire de RAM
Le RamManager n'occupe aucun emplacement programme du PIC, il est uniquement écrit avec des directives de compilation.
ça ne révolutionnera rien mais j'espère que ça puisse être utile


pour ses macros, si ça continu on va concurrencer 