GCC Komisches Verhalten

Gast #4226690
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.
Angehängte Dateien:
Gast #4226695
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
}
Gast #4226698
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.
Gast #4226707
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
Gast #4226710
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...
Gast #4226715
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.
#4226858
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren