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?
Dank, ich auch vermutet, aber nicht sicher. Immer noch nicht klar, wie es geht. – PredragN
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
Ich denke, dass Sie nur NEQUEUE_DEF_INIT Makro vermeiden müssen. Haben Sie versucht, Speicher und Größe wie user694733 vorgeschlagen zu setzen? –