Forum: Mikrocontroller und Digitale Elektronik GCC Komisches Verhalten


von Thom (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe folgendes Problem, ich übergebe an eine Funktion einen 96 Byte 
großen Buffer, wenn ich jedoch in die Funktion Springe ist dieser immer 
mit 0x00 (1 Byte) übgergeben.

Anbei der Source
1
int8_t as3911WriteFifo(const uint8_t* values, uint8_t length)
2
{
3
    int8_t err;
4
    uint8_t cmd = AS3911_FIFO_LOAD;
5
  cmd = 0x80;
6
    /* make this operation atomic */
7
    cpu_irq_disable();//IRQ_INC_DISABLE();
8
    {
9
    as3911_SPI_Select();
10
        {
11
            err = spi_master_transfer(cmd, 1);
12
13
            if (ERR_AMS_NONE == err)
14
            {
15
                err = spi_master_transfer(&values,  length);
16
            }
17
        }    
18
    cpu_irq_enable();//IRQ_DEC_ENABLE();
19
        as3911_SPI_DeSelect();
20
21
    }
22
    return err;
23
}

Ich habe noch 2 Bilder angehänt vom Debuggen wo man es sehen sollte.

von Peter II (Gast)


Lesenswert?

Thom schrieb:
> spi_master_transfer(&values,  length);

was macht das & da?

Vermutlich falsch, ich glaube kaum das spi_master_transfer ein Zeiger 
auf Zeiter erwartet.

von Thom (Gast)


Lesenswert?

Die Funktion ist bis dato immer so gegangen, ich habe noch einige andere 
befehle die das genau so nutzen...

Anbei der Code des Transfer:
1
/**
2
 * \brief Perform SPI master transfer.
3
 *
4
 * \param pbuf Pointer to buffer to transfer.
5
 * \param size Size of the buffer.
6
 */
7
int8_t spi_master_transfer(void *p_buf, uint32_t size)
8
{
9
  uint32_t i;
10
  uint8_t uc_pcs;
11
  static uint16_t data;
12
  int8_t err;
13
14
  uint8_t *p_buffer;
15
16
  p_buffer = p_buf;
17
18
  for (i = 0; i < size; i++) {
19
    err = spi_write(SPI_MASTER_BASE, p_buffer[i], 0, 0);
20
    /* Wait transfer done. */
21
    while ((spi_read_status(SPI_MASTER_BASE) & SPI_SR_RDRF) == 0);
22
    err = spi_read(SPI_MASTER_BASE, &data, &uc_pcs);
23
    p_buffer[i] = data;
24
  }
25
  return err;
26
}

von Thom (Gast)


Lesenswert?

Leider wird der Buffer aus dem Bild sentFifo.jpg nicht an die Funktion 
aus dem Bild wFifo übergeben...

von Peter II (Gast)


Lesenswert?

Thom schrieb:
> Die Funktion ist bis dato immer so gegangen, ich habe noch einige andere
> befehle die das genau so nutzen...

kann kaum sein, du hast schon ein zeiger und die Funktion braucht einen 
Zeiger. Damit ist das & falsch.

Lass es doch einfach mal weg.

von Max H. (hartl192)


Lesenswert?

Thom schrieb:
> spi_master_transfer(cmd, 1);
> spi_master_transfer(&values,  length);
Du kannst nicht einmal einen Zeiger, das andere Mal einen Wert übergeben 
cmd wird als Adresse (0x80) interpretiert.

Mit &values erhältst du einen Zeiger auf den Zeiger uint8_t* values und 
nicht einen Zeiger auf das was im (vermutlich) Array steht.

von Peter II (Gast)


Lesenswert?

Nachtrag:

das kann doch alles nicht ordentlich funktionieren.

 cmd = 0x80;
 err = spi_master_transfer(cmd, 1);

hier übergibst du einen Wert, die Funktion braucht aber ein zeiger


 err = spi_master_transfer(&values,  length);
hier übergibst du einen Adresse von einer Zeiger - auch falsch




spi_master_transfer ändert die Daten in p_buffer.
Aber du hast es als const übergeben

const uint8_t* values

von Thom (Gast)


Lesenswert?

Wenn ich es ändere bringt es auch nichts...

Mein Problem ist das die Funktion

int8_t as3911WriteFifo(const uint8_t* values, uint8_t length)

schon keine Daten enthält siehe Bild wFifo.jpg dort ist nichts in dem 
Array (bei anderen Funktionen schon) und übergeben an die oben genannte 
Funktion übergebe ich das sentFifo.jpg angezeigte Array...

Alle anderen Funktionen die ich Debugge zeigen mir immer das Quell Array 
an bzw. dessen Daten...

von Peter II (Gast)


Lesenswert?

Thom schrieb:
> Mein Problem ist das die Funktion
>
> int8_t as3911WriteFifo(const uint8_t* values, uint8_t length)
>
> schon keine Daten enthält siehe Bild wFifo.jpg dort ist nichts in dem
> Array (bei anderen Funktionen schon) und übergeben an die oben genannte
> Funktion übergebe ich das sentFifo.jpg angezeigte Array...

ich sehen keine Fehler - die Ausgabe ist richtig. Die Debugger kennt die 
länge von values nicht und der erste warte ist 0 - auf beiden 
Screenshots.

von Max H. (hartl192)


Lesenswert?

values ist ein kein Array, sondern ein Pointer auf das erste Element 
von, in diesem Fall, as3911StreamBuffer, welches null ist. Damit ist es 
auch vollkommen korrekt, dass *values gleich 0x00 ist.

von Jim M. (turboj)


Lesenswert?

Thom schrieb:
>            err = spi_master_transfer(cmd, 1);`
>
>             if (ERR_AMS_NONE == err)
>             {
>                 err = spi_master_transfer(&values,  length);
>             }

Falsch herum.
Bei der Zeile `err = spi_master_transfer(cmd, 1);` muss der Compiler 
auch eine Warning ausspucken. Wenn er das nicht tut, schalte die mal an 
(-Wall -Wextra im GCC).

So herum ist richtig:
1
err = spi_master_transfer(&cmd, 1);
2
3
if (ERR_AMS_NONE == err)
4
{
5
  err = spi_master_transfer(values,  length);
6
}

Falls Du Dich fragst: Warum so herum? Dann solltest Du Dir ein gutes 
Buch über die C Programmiersprache besorgen und mal durchlesen. C ist 
nicht selbsterklärend und auch nicht so leicht erlernbar.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.