2016-04-19 8 views
-2

Ich schreibe einen embedded C Code basierend auf State Machine in MDK-ARM Umgebung, die RealView (ARMCC basiert) Compiler verwendet.MDK-ARM C-Fehler: Ausdruck muss einen konstanten Wert haben

IDE erzeugt einen Fehler:

error: #28: expression must have a constant value.

Ein Teil des Codes ist folgende:

struct wspace 
{ 
    struct netimer period; 
    struct nequeue deferred; 
    struct nevent *deferred_queue_storage[EPA_EEPROM_QUEUE_SIZE]; 
    struct nepa *producer; 
    struct event_i2c_transfer transfer; 
    uint32_t i2c_retry; 
    uint8_t i2c_buffer[3]; 
    uint32_t address; 
    uint8_t *raw_buffer; 
    uint32_t size; 
    uint32_t idx; 
    uint32_t max_size; 
    uint32_t dev_id; 
}; 

static naction state_init_eeprom(struct nsm * sm, const struct nevent * event) { 
    struct wspace * ws = nsm_wspace(sm); 

    switch (event->id) { 
     case NSM_INIT : { 
      struct nequeue_define deferred_queue = 
      **NEQUEUE_DEF_INIT(ws->deferred_queue_storage, sizeof(ws->deferred_queue_storage));** // this is the line pointed by compiler 

      netimer_init(&ws->period); 
      nequeue_init(&ws->deferred, &deferred_queue); 
      ws->transfer.super   = g_default_event; 
      ws->transfer.super.producer = nepa_get_current(); 
      ws->transfer.dev_id   = EEPROM_I2C_ID; 
      ws->transfer.timeout_ms  = EEPROM_I2C_TIMEOUT_MS; 
      ws->max_size    = 8 * 1024; 
      ws->dev_id     = EEPROM_I2C_ID; 

      return (naction_transit_to(sm, state_idle)); 
     } 
     default : { 
      return (naction_ignored()); 
     } 
    } 
} 

wichtige Definitionen:

#define NEQUEUE_SIZEOF(elements)             
    (sizeof(struct nevent * [elements])) 

#define NEQUEUE_DEF_INIT(storage, size)           
    {storage, size}  

struct nequeue_define 
{ 
    struct nevent ** storage;/**<@brief Allocated memory storage */ 
    size_t size; /**<@brief Size of queue in bytes  */ 
}; 


struct nequeue 
{ 
    struct nqueue    queue; 
    #if (CONFIG_REGISTRY == 1) 
    ncore_reg     min; 
    #endif 
    #if (CONFIG_API_VALIDATION == 1) 
    unsigned int    signature; 
    #endif 
}; 

Alles, was ich zu diesem Thema gefunden ist verwandten mit der Tatsache, dass die konstante Variable nicht assi sein kann auf das Element eines Arrays oder Elements der Struktur als Initialisierer gesetzt, auch wenn es zuvor initialisiert wurde.

Hat jemand eine Idee, wie man dieses Problem löst?

Antwort

0

Sie können den Inhalt von Variablen nicht in konstanten Ausdrücken verwenden, und Ihr Strukturinitiator ist ein konstanter Ausdruck.

Während sizeof(ws->deferred_queue_storage) ist OK, da es Wert zur Kompilierzeit bestimmt werden kann; ws->deferred_queue_storage ist ungültig, weil der Inhalt dieser Variablen alles sein kann.

Lösung ist Zuordnung nach der Zuordnung zu verwenden:

struct nequeue_define deferred_queue; 
deferred_queue.storage = ws->deferred_queue_storage; 
deferred_queue.size = sizeof(ws->deferred_queue_storage); 
0

Compiler beschwert sich über die Verwendung von Variablen in der NEQUEUE_DEF_INIT(ws->deferred_queue_storage, sizeof(ws->deferred_queue_storage));

Sie es wie NEQUEUE_DEF_INIT(100, 200) verwenden könnte, aber nicht mit Variablen als Makroargumente da es in diesem Fall vor dem Kompilieren bekannt sein müssen.

+0

Dank, ich auch vermutet, aber nicht sicher. Immer noch nicht klar, wie es geht. – PredragN

+0

Ich bin mir nicht sicher, aber ich denke, ich sollte Zeiger als erstes Mitglied der Struktur übergeben, aber weiß nicht, wie es geht? Die Idee scheint in Ordnung zu sein, aber könnten Sie genauer sein? Wenn Sie sich wspace struct genau ansehen, können Sie sehen, dass struct nevent * deferred_queue_storage [EPA_EEPROM_QUEUE_SIZE] eine Kette von Zeigern ist, wobei jeder Zeiger einen Ereignispuffer darstellt. Was ich vorübergehend mache, versucht, Software von GCC zum Keil RealView Compiler zu portieren. Dieser NEQUEUE_DEF_INIT sollte nur der Warteschlangeninitialisierer sein. – PredragN

+0

Ich denke, dass Sie nur NEQUEUE_DEF_INIT Makro vermeiden müssen. Haben Sie versucht, Speicher und Größe wie user694733 vorgeschlagen zu setzen? –

Verwandte Themen