Macro richtig lesen

flohaase

Mitglied
Hallo zusammen,

ich habe hier ein Macro und weiß leider nicht ganz, wie ich es richtig lesen muss:

Code:
#define CYG_DEVS_SPI_CORTEXM_STM32_DEVICE( \
  _name_, _bus_, _csnum_, _16bit_, _clpol_, _clpha_, _brate_, _csup_dly_, _csdw_dly_, _trbt_dly_\
) \
cyg_spi_cortexm_stm32_device_t _name_ ##_stm32 CYG_SPI_DEVICE_ON_BUS(_bus_) = { \
{ .spi_bus    = (cyg_spi_bus*) &cyg_spi_stm32_bus## _bus_ }, \
  .dev_num    = _csnum_, \
  .bus_16bit  = _16bit_ ? 1 : 0, \
  .cl_pol     = _clpol_, \
  .cl_pha     = _clpha_, \
  .cl_brate   = _brate_, \
  .cs_up_udly = _csup_dly_, \
  .cs_dw_udly = _csdw_dly_, \
  .tr_bt_udly = _trbt_dly_, \
  .spi_cr1_val = 0, \
}; \
extern cyg_spi_device _name_ __attribute__((alias ( #_name_ "_stm32" )));

Angewendet wird es später folgendermaßen:

Code:
cyg_spi_cortexm_stm32_device_t loopback_device = {
    .spi_device.spi_bus = &cyg_spi_stm32_bus1.spi_bus,
    .dev_num = 0 ,                      // Only 1 device. 
    .cl_pol = 0,
    .cl_pha = 0,
    .cl_brate = 8000000,                // Nominal 8Mhz.
    .cs_up_udly = 1,
    .cs_dw_udly = 1,
    .tr_bt_udly = 1,
    .bus_16bit = false,
};

Dazu habe ich auch noch folgenden struct:

Code:
typedef struct cyg_spi_cortexm_stm32_device_s
{
    // ---- Upper layer data ----
    cyg_spi_device spi_device;  // Upper layer SPI device data.

    // ---- Device setup (user configurable) ----
    cyg_uint8  dev_num;         // Device number.
    cyg_uint8  bus_16bit;       // Use 16 bit (1) or 8 bit (0) transfers.
    cyg_uint8  cl_pol;          // Clock polarity (0 or 1).
    cyg_uint8  cl_pha;          // Clock phase    (0 or 1).
    cyg_uint32 cl_brate;        // Clock baud rate.
    cyg_uint16 cs_up_udly;      // Minimum delay in us between CS up and transfer start.
    cyg_uint16 cs_dw_udly;      // Minimum delay in us between transfer end and CS down.
    cyg_uint16 tr_bt_udly;      // Minimum delay in us between two transfers.

    // ---- Device state (private) ----
    cyg_uint32 spi_cr1_val;     // SPI configuration register (initialised to 0). 

} cyg_spi_cortexm_stm32_device_t;

Meine hauptsächliche Frage ist, warum man das ganze überhaupt als Marco gemacht hat. Wo liegt hier der Vorteil? Warum kann ich den struct nicht einfach verwenden?

Danke, Gruß Flo
 
Hi

Kann man.
Was ein Macro bringt ist a) weniger Schreibarbeit, wenn es mehrmals verwendet wird
und b) Wenn man die Stelle ändern will muss nur das Macro geändert werden,
statt alle Codestellen extra.
 
Hallo,

ich denke mal, dass ist ein Macro das dir die Initialisierung des structs vereinfachen soll. Neben deinem reinen befüllen der Struktur sind in dem Macro selbst ja noch weitere Compiler Attribute (ich glaube das dient dem Compiler) mit eingebunden. Siehe in Zeile 4

Code:
##_stm32 CYG_SPI_DEVICE_ON_BUS(_bus_)

Also eigentlich brauchst du denn in deinem Code nur

Code:
CYG_DEVS_SPI_CORTEXM_STM32_DEVICE(loopbackDevice, ...)

verwenden und kannst direkt danach mit dem Struktur weiterarbeiten. Je nach Konfiguration werden beim Compilieren dann noch verschiedene weitere Parameter für die Struktur verwendet die zum Beispiel der Speicheroptimierung dienen könnten. Um diesen ganzen Kram musst du dich dann nicht kümmern, wenn du das Macro statt der Struktur verwendest.

Viele Grüße,
Wolf

Edit:

Ausserdem ist nicht zu vergessen, dass das Macro am Ende noch eine "extern" declaration besitzt die wohl an irgendeiner anderen Stelle eventuell noch wichtig sein könnte.
 
Hallo flohaase

Wenn du C++ verwendest solltest du so gut wie nie Macros verwenden, sie sind nämlich böse weil 1, 2, 3, 4.

Viele Grüsse
Cromon
 
Das ist ja, so wie ich das sehe, ein Teil einer API von ST Microelectronics, daher sollte er die Macros in seinem Programm-Code ruhig verwenden. Nur halt keine eigenen extra Macros definieren, falls er C++ Code schreibt.

Wobei inline auch nicht immer das Mittel der Wahl ist. Soweit ich weiss steht es ja dem Compiler auch frei, dass inline frei nach Schnauze zu ignorieren.

Gruß,
Wolf
 

Neue Beiträge

Zurück