Je travaille actuellement sur la mise en place d'un framework en C pour l'utilisation entre plusieurs microcontrôleurs. Le cadre doit porter tout le code spécifique à l'appareil, donc l'application ne contient que l'utilisation abstraite des périphériques (comme SerialPort_Read, write, SetBaudRate, etc etc)LUT dans une macro C
Une des choses avec lesquelles je suis aux prises pour trouver une solution pour en C sont la carte des broches d'E/S. J'ai vu des projets (comme l'Arduino très très populaire) où la carte de broche est mise dans une LUT (table de consultation) qui est utilisée pendant l'exécution. Cependant, cette LUT ne sera jamais modifiée pendant l'exécution, il n'est donc pas utile de l'avoir dans la mémoire. Par exemple, cette fonction résout certains indices de bits et registres de quelques tables « const uint », et soit fixe ou efface un peu:
void pinMode(uint8_t pin, uint8_t mode)
{
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *reg;
if (port == NOT_A_PIN) return;
// JWS: can I let the optimizer do this?
reg = portModeRegister(port);
if (mode == INPUT) {
uint8_t oldSREG = SREG;
cli();
*reg &= ~bit;
SREG = oldSREG;
} else {
uint8_t oldSREG = SREG;
cli();
*reg |= bit;
SREG = oldSREG;
}
}
Parce que ce code est réel C en cours d'exécution sur le contrôleur, il est drainant effiency et la vitesse . Je préfère définir une sorte de macro qui fait la même chose, mais est déjà résolu lors de la compilation d'un « one-liner » qui peut être compilé beaucoup plus efficace:
GPIO_Write(PORTA, 5, 1); // Write '1' to pin 5 on PORTA
> LATA |= 1<<5; // Sets bit 5 high
GPIO_Tris(PORTA, 4, OUTPUT); // Set pin 4 on PORTA to output
> PORTA &= ~(1<<4); // sets pin 4 as output I/O type
Est-ce que quelqu'un sait s'il est possible (et comment) définir et utiliser une table de correspondance avec une macro en C? En ce moment j'utilise le compilateur MicroChip C30, qui, je crois, est basé dans GCC. Il est supposé être portable entre différents compilateurs, y compris MicroChip C18, C32 et en plus également ARM et AVR.
S'il vous plaît ne pas lier au code sur des sites externes. –
Très bien, j'ai enlevé les liens et je l'ai expliqué ici. – Hans
Dans votre exemple de code, que voulez-vous que l'optimiseur fasse? Si le port peut avoir des valeurs différentes au moment de l'exécution, selon la fonction appelée. – blueshift