Discussion:
Quelle équivalence pour une macro C ?
(trop ancien pour répondre)
DrPi
2020-05-13 15:27:38 UTC
Permalink
Bonjour,


Avec les procédures suivantes :

gpio.Set(gpio.GPIO_A, 1); -- LED RED OFF
gpio.Set(gpio.GPIO_A, 2); -- LED GREEN OFF
gpio.Set(gpio.GPIO_D, 5); -- LED BLUE OFF

gpio.Clear(gpio.GPIO_A, 1); -- LED RED ON
gpio.Clear(gpio.GPIO_A, 2); -- LED GREEN ON
gpio.Clear(gpio.GPIO_D, 5); -- LED BLUE ON

Comment faire pour déclarer des procédures plus explicites sans
pénalisation sur le temps d'exécution ?
SetLedRedOn
SetLedGreenOn
SetLedBlueOn
...

En C, j'aurais fais des macros comme ceci :

void gpio_set(int port, int bit);
void gpio_clear(int port, int bit);

#define SetLedRedOn() gpio_clear(PORTA, 1)
#define SetLedGreenOn() gpio_clear(PORTA, 2)
#define SetLedBlueOn() gpio_clear(PORTD, 5)
...


En Ada, il n'y a pas de macros. Quelle est la meilleure solution ? Des
procédures avec un aspect "inline" ?

Nicolas
g***@hotmail.com
2020-05-13 16:28:01 UTC
Permalink
Post by DrPi
En Ada, il n'y a pas de macros. Quelle est la meilleure solution ? Des
procédures avec un aspect "inline" ?
Oui (AMHA).
J-P. Rosen
2020-05-13 16:47:10 UTC
Permalink
Post by g***@hotmail.com
Post by DrPi
En Ada, il n'y a pas de macros. Quelle est la meilleure solution ? Des
procédures avec un aspect "inline" ?
Oui (AMHA).
Et ensuite, faire des mesures avec et sans Inline pour voir la
différence... s'il y en a une, parceque:
1) c'est vraiment de la micro-micro optimisation, qui n'a d'effet que si
on est vraiment dans une boucle ultra-fréquente
2) il y a de bonnes chances que le compilateur optimise l'appel, avec ou
sans inline

Dans un sens ou dans l'autre, faire la mesure sera certainement instructif!
--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr
DrPi
2020-05-14 15:17:25 UTC
Permalink
Post by J-P. Rosen
Post by g***@hotmail.com
Post by DrPi
En Ada, il n'y a pas de macros. Quelle est la meilleure solution ? Des
procédures avec un aspect "inline" ?
Oui (AMHA).
Et ensuite, faire des mesures avec et sans Inline pour voir la
1) c'est vraiment de la micro-micro optimisation, qui n'a d'effet que si
on est vraiment dans une boucle ultra-fréquente
L'exemple de la LED est pour simplifier. Il y a d'autres fonctionnalités
qui ont besoin de temps de traitement le plus court possible pour
obtenir de bonnes performances. Dans certains drivers par exemple.
Post by J-P. Rosen
2) il y a de bonnes chances que le compilateur optimise l'appel, avec ou
sans inline
Certes. En mode debug, on ne voit pas ces optimisations. En mode non
debug, c'est beaucoup plus dur de savoir ce que fait le compilateur.
Post by J-P. Rosen
Dans un sens ou dans l'autre, faire la mesure sera certainement instructif!
Tout à fait.
Jeffrey R. Carter
2020-05-13 20:04:01 UTC
Permalink
Post by DrPi
gpio.Set(gpio.GPIO_A, 1); -- LED RED OFF
gpio.Set(gpio.GPIO_A, 2); -- LED GREEN OFF
gpio.Set(gpio.GPIO_D, 5); -- LED BLUE OFF
gpio.Clear(gpio.GPIO_A, 1); -- LED RED ON
gpio.Clear(gpio.GPIO_A, 2); -- LED GREEN ON
gpio.Clear(gpio.GPIO_D, 5); -- LED BLUE ON
Comment faire pour déclarer des procédures plus explicites sans
pénalisation sur le temps d'exécution ?
SetLedRedOn
SetLedGreenOn
SetLedBlueOn
...
En C
void gpio_set(int port, int bit);
void gpio_clear(int port, int bit);
package Gpio is
type Port_ID is ...;
type Bit_Number is ...;

procedure Clear (Port : in Port_ID; Bit : in Bit_Number);
end Gpio;

procedure Set_Red_LED_On
(Port : in Port_ID := Gpio.A; Bit : in Gpio.Bit_Number := 1)
renames Gpio.Clear;
--
Jeff Carter
"Who wears beige to a bank robbery?"
Take the Money and Run
144
g***@hotmail.com
2020-05-13 22:43:00 UTC
Permalink
Post by Jeffrey R. Carter
package Gpio is
type Port_ID is ...;
type Bit_Number is ...;
procedure Clear (Port : in Port_ID; Bit : in Bit_Number);
end Gpio;
procedure Set_Red_LED_On
(Port : in Port_ID := Gpio.A; Bit : in Gpio.Bit_Number := 1)
renames Gpio.Clear;
Intéressant:

Set_Red_LED_On;
Set_Red_LED_On (Bit => 2); -- *Green* LED On
Set_Red_LED_On (GPIO_D, 5); -- *Blue* LED On

:-)
DrPi
2020-05-14 15:18:13 UTC
Permalink
Post by g***@hotmail.com
Post by Jeffrey R. Carter
package Gpio is
type Port_ID is ...;
type Bit_Number is ...;
procedure Clear (Port : in Port_ID; Bit : in Bit_Number);
end Gpio;
procedure Set_Red_LED_On
(Port : in Port_ID := Gpio.A; Bit : in Gpio.Bit_Number := 1)
renames Gpio.Clear;
Set_Red_LED_On;
Set_Red_LED_On (Bit => 2); -- *Green* LED On
Set_Red_LED_On (GPIO_D, 5); -- *Blue* LED On
:-)
Rusé (mais dangereux) !

Loading...