Firmware

De Wikinxt-fr.

Aller à : Navigation, rechercher


Le Firmware se traduit en français par micrologiciel.

Sommaire

[modifier] Qu'est-ce que c'est ?

C'est le «système d'exploitation» qui fait fonctionner votre brique !

Le code source est disponible sur le site LEGO : le code source. Alors hop par curiosité j'y ai été fouillé, voici ce que j'ai pu trouver :

[modifier] Les opérations de bases

Croyez-moi ou pas, mais votre robot, au final ne sait faire que ça :

OPCODE_COUNT  0x36
//Family: Math => opérateur mathématique
OP_ADD  => additionne
OP_SUB  => soustrait
OP_NEG  => donne l'opposé
OP_MUL  => multiplie
OP_DIV  => divise
OP_MOD  => donne le reste de la division
//Family: Logic => opérateur logique
OP_AND => l'opérateur logique et
OP_OR  => l'opérateur logique ou
OP_XOR => l'opérateur logique ou exclusif
OP_NOT => l'opérateur logique non et
//Family: Bit manipulation => manipulations des bits
OP_CMNT  
OP_LSL 
OP_LSR     
OP_ASL    
OP_ASR   
OP_ROTL    
OP_ROTR 
//Family: Comparison => comparaison
OP_CMP     => compare deux nombres
OP_TST     => compare un nombre / à zéro
OP_CMPSET  => compare deux nombres et inscrit le résultat dans tstsrc
OP_TSTSET  => compare un nbrs /0 et inscrit le résultat dans tstsrc
//Family: Array ops => les tableaux
OP_INDEX     => récupère un élément d'un tableau      
OP_REPLACE   => remplace un élément d'un tableau
OP_ARRSIZE   => retourne la longueur du tableau
OP_ARRBUILD  => construit un tableau
OP_ARRSUBSET => retourne un morceau du tableau
OP_ARRINIT   => initialise un tableau
//Family: Memory ops => la mémoire
OP_MOV  => déplace la valeur d'une variable dans une autre
OP_SET  => déplace la valeur d'une constante dans une variable
//Family: String ops => les chaînes de caractère 
OP_FLATTEN    
OP_UNFLATTEN  
OP_NUMTOSTRING  => transforme un nombre en chaîne de caractère
OP_STRINGTONUM  => transforme une chaîne de caractère en un nombre
OP_STRCAT       => opérateur de concaténation
OP_STRSUBSET    => récupère un morceau de la chaîne de caractère
OP_STRTOBYTEARR => transforme une chaîne de caractère en un tableau de byte
OP_BYTEARRTOSTR => transforme un tableau de byte en une chaîne de caractère
//Family: Control flow => l'exécution d'un programme
OP_JMP      => saut inconditionnel
OP_BRCMP    => saut conditionnel
OP_BRTST    => saut conditionnel (comparaison /0)
OP_SYSCALL  => appel au système
OP_STOP     => stop 
//Family: Clump scheduling
OP_FINCLUMP 
OP_FINCLUMPIMMED  
OP_ACQUIRE        => acquiert un mutex
OP_RELEASE        => relâche un mutex
OP_SUBCALL        => appelle une sous-routine
OP_SUBRET         => retourne à l'appelant d'une sous-routine
//Family: IO ops => les entrées et sorties
OP_SETIN    => définit les propriétés d'une entrée (capteur)
OP_SETOUT   => définit les propriétés d'une sortie (moteur)
OP_GETIN    => récupère les propriétés d'une entrée (capteur)
OP_GETOUT   => récupère les propriétés d'une sortie (moteur)
//Family: Timing => la gestion du temps
OP_WAIT     => attendre
OP_GETTICK  => récupère la valeur de l'horloge interne
// condition code definitions => les opérateurs de comparaison
OPCC1_LT    => strictement inférieur
OPCC1_GT    => strictement supérieur
OPCC1_LTEQ  => inférieur ou égal
OPCC1_GTEQ  => supérieur ou égal
OPCC1_EQ    => égal
OPCC1_NEQ   => différent
// short op definitions
#define USE_SHORT_OPS
#define SHORT_OP_MOV  0
#define SHORT_OP_ACQUIRE  1
#define SHORT_OP_RELEASE  2
#define SHORT_OP_SUBCALL  3

Ce qui fait tout de même à peu près 80 opérations de bases. Et à part ça ? Ben rien ! Tout peut se coder à partir de ces opcodes. Leurs définitions ont été trouvées dans le fichier c_cmd_bytescode.h. Et j'ai expliqué, quand je le savais, à quoi ils servaient.


[modifier] Les fichiers de Format

Vient de modules.h :

 FILEFORMAT_SOUND    = 0x0100,   // rso
 FILEFORMAT_BITMAP   = 0x0200,
 FILEFORMAT_FONT     = 0x0300,
 FILEFORMAT_ICON     = 0x0400,
 FILEFORMAT_TEXT     = 0x0500,
 FILEFORMAT_MELODY   = 0x0600,
 FILEFORMAT_MENU     = 0x0700,   // rms
 FILEFORMAT_PROGRAM  = 0x0800,   // rpg
 FILEFORMAT_DATALOG  = 0x0900    // rdt


[modifier] les capteurs

Tiré de c_input.iom

/* Constants related to sensor type  */ => les types de capteurs
 NO_SENSOR      => pas de capteur
 SWITCH         => capteur tactile
 TEMPERATURE    => capteur de température
 REFLECTION     => 
 ANGLE          => capteur de rotation
 LIGHT_ACTIVE   => capteur photosensible : lampe allumée
 LIGHT_INACTIVE => capteur photosensible : lampe éteinte
 SOUND_DB       => capteur sonore en dB
 SOUND_DBA      => capteur sonore en dBa
 CUSTOM         => capteur personnel (analogique)
 LOWSPEED       => capteur utilisant le protocole I2C
 LOWSPEED_9V    => capteur utilisant le protocole I2C nécessitant un apport d'énergie
 HIGHSPEED      => capteur utilisant le port à haute vitesse (port 4) inutile pour l'instant.
 NO_OF_SENSOR_TYPES  =>  ?
/* Constants related to sensor mode */
 RAWMODE           => donnée brute
 BOOLEANMODE       => mode booléen (vrai/faux)
 TRANSITIONCNTMODE => compte les changements d'états (vrai=>faux=>vrai : 2 changements)
 PERIODCOUNTERMODE => compte les périodes (vrai=>faux=>vrai : 1 seul changement)
 PCTFULLSCALEMODE  => donne une valeur sous forme de pourcentage
 CELSIUSMODE       => donne une température en celsius
 FAHRENHEITMODE    => donne une température en farenheit
 ANGLESTEPSMODE    => donne une rotation
 SLOPEMASK         => ?
 MODEMASK          => ?


[modifier] Loader : gestion des fichiers

 OPENREAD        => ouvre et écrit un fichier 
 OPENWRITE       => ouvre et lit un fichier 
 READ            => lit
 WRITE           => écrit
 CLOSE           => ferme
 DELETE          => supprime
 FINDFIRST       = 0x86,
 FINDNEXT        = 0x87,
 VERSIONS        => donne la version (de quoi ? firmware et/ou protocole je pense)
 OPENWRITELINEAR => ouvre et écrit un fichier linéaire
 OPENREADLINEAR  => ouvre et lit un fichier linéaire
 OPENWRITEDATA   => ouvre et écrit un fichier de données
 OPENAPPENDDATA  => ouvre et lit un fichier de données
 FINDFIRSTMODULE = 0x90,
 FINDNEXTMODULE  = 0x91,
 CLOSEMODHANDLE  = 0x92,
 IOMAPREAD       => utilisé pour lire dans les IO Maps
 IOMAPWRITE      => utilisé pour écrire dans les IO Maps
 BOOTCMD         = 0x97,     /* external command only */
 SETBRICKNAME    => donne un nom à la brique
 BTGETADR        = 0x9A,
 DEVICEINFO      = 0x9B,
 DELETEUSERFLASH => vide la mémoire flash
 POLLCMDLEN      = 0xA1,
 POLLCMD         = 0xA2,
 RENAMEFILE      => renommer un fichier
 BTFACTORYRESET  = 0xA4

trouvé dans c_loader.iom

Ce sont les définitions des différentes opérations pour gérer les fichiers.

Un point important à remarquer est la différence entre OPENWRITELINEAR, OPENWRITE et OPENWRITEDATA. OPENWRITELINEAR permet d'écrire le fichier sur un espace continu de la mémoire flash. Ce qui est obligatoire pour les programmes(“.rxe”) et les images(“.ric)

Outils personnels
Espaces de noms
Variantes
Actions
Navigation
Boîte à outils