Speicherschreiber in ATTiny HID Code?

OP #3335469
Lesenswert?

Hi,

ich habe folgenden eientlich recht simplen Code, mit dem ich auf meinem 
ATTiny Daten vom USB empfange:
1
static uchar keyData[DATA_LENGTH+4];
2

3
uchar   usbFunctionWrite(uchar *data, uchar len)
4
{
5
   uchar i;
6

7
   if (bytesRemainingW == 0) return 1;               /* end of transfer */
8
   if (len > bytesRemainingW) len = bytesRemainingW;
9
//   for (i=0; i<len; i++) keyData[currentAddressW+i]=data[i];
10
    currentAddressW += len;
11
    bytesRemainingW -= len;
12
   if (bytesRemainingW==0)
13
   {
14
      return 1;
15
   }
16
   return 0;
17
}

Sobald ich die auskommentierte Zeile reinnehme, wird mein USB-Gerät 
nicht mehr erkannt. Scheinbar schreibe ich da über den gültigen Bereich 
von keyData hinaus. Allerdings: wieso? Ich sehe das Problem echt 
nicht...
OP #3335493
Lesenswert?

Mehr als das ist da nicht:
1
#define DATA_LENGTH    128
2

3
usbMsgLen_t usbFunctionSetup(uchar data[8])
4
{
5
usbRequest_t    *rq = (void *)data;
6

7
    if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){
8
        if(rq->bRequest == USBRQ_HID_GET_REPORT){
9
            bytesRemainingR = DATA_LENGTH;
10
            currentAddressR = 0;
11
            return USB_NO_MSG;
12
        }else if(rq->bRequest == USBRQ_HID_SET_REPORT){
13
            bytesRemainingW = DATA_LENGTH;
14
            currentAddressW = 0;
15
            return USB_NO_MSG;
16
        }
17
    }else{
18
    }
19
    return 0;
20
}
Gast #3335504
Lesenswert?

Ich sehe keinen einzigen Aufruf von

uchar   usbFunctionWrite(uchar *data, uchar len)

>Mehr als das ist da nicht:

Da muss mehr sein!

Machs doch mal so:
1
   for (i=0; i<len; i++) 
2
      if((currentAddressW+i) < sizeof(keyData))
3
         keyData[currentAddressW+i]=data[i];

Das wird dein Problem aber nicht lösen, nur die Überschreiber.
OP #3335513
Lesenswert?

Also: der Code basier auf VUSB, usbFunctionWrite() müsste von usbPoll() 
getriggert werden, welches wiederum aus einer Schleife in main() 
aufgerufen wird.

Was ich überhaupt nicht verstehe: ich sende/lese noch gar keine Daten, 
wenn die schleife drin ist, wird das Gerät gar nicht mehr erkannt, also 
keine Chance, überhaupt damit zu kommunizieren und in einen möglichen 
Speicherschreiber reinzulaufen.
Gast #3335518
Lesenswert?

>Was ich überhaupt nicht verstehe: ich sende/lese noch gar keine Daten,
>wenn die schleife drin ist, wird das Gerät gar nicht mehr erkannt, also
>keine Chance, überhaupt damit zu kommunizieren und in einen möglichen
>Speicherschreiber reinzulaufen.

So ein Tiny ist ja nicht gerade gesegnet mit RAM.
Wenn der Compiler keine Verwendung von keydata[] sieht
legt er es vieleicht nicht an oder der Linker schmeisst es raus
und dein RAM reicht noch.

Wird keydata[] verwendet knallts dann eventuell halt
weil nicht genügend RAM da ist.
Gast #3335540
Lesenswert?

Da ist was faul im Staate...

Funktionen, die nie aufgerufen werden, zeichnen sich durch eine kaum zu 
überbietende Stabilität aus.

Mag ja sein, dass Dein Programm nicht funktioniert, aber nicht wegen 
eines Aufrufes von usbFunctionWrite.
OP #3335558
Lesenswert?

holger schrieb:
>>Was ich überhaupt nicht verstehe: ich sende/lese noch gar keine Daten,
>>wenn die schleife drin ist, wird das Gerät gar nicht mehr erkannt, also
>>keine Chance, überhaupt damit zu kommunizieren und in einen möglichen
>>Speicherschreiber reinzulaufen.
>
> So ein Tiny ist ja nicht gerade gesegnet mit RAM.
> Wenn der Compiler keine Verwendung von keydata[] sieht
> legt er es vieleicht nicht an oder der Linker schmeisst es raus
> und dein RAM reicht noch.
>
> Wird keydata[] verwendet knallts dann eventuell halt
> weil nicht genügend RAM da ist.

Hm, und wie zwinge ich den Compiler, keyData[] tatsächlich anzulegen?
Gast #3335566
Lesenswert?

>Hm, und wie zwinge ich den Compiler, keyData[] tatsächlich anzulegen?

Diese Zeile aktivieren:

//   for (i=0; i<len; i++) keyData[currentAddressW+i]=data[i];

Aber dann macht es bumm weil dein RAM scheinbar nicht ausreicht.
Gast #3335574
Lesenswert?

@Satz K.

Ich bin ja mal gespannt, wann Du das Rätsel, über den verwendeten Typen, 
auflöst.
Praktisch in jedem Post wird erwähnt, dass es bei den Tiny's nicht so 
Doll mit Speicher aussieht und dass der Fehler eventuell damit 
zusammenhängen könnte.
Musst Du aber nicht, vielleicht errät es ja der eine oder andere.

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