Forum: Mikrocontroller und Digitale Elektronik Speicherschreiber in ATTiny HID Code?


von Satz K. (satz_k)


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...

von holger (Gast)


Lesenswert?

>Allerdings: wieso? Ich sehe das Problem echt
>nicht...

Jeder andere hier auch nicht.
Niemand weiss wie gross keydata[DATA_LENGTH+4] ist, was du mit
currentAddressW sonst noch so machst...

von Satz K. (satz_k)


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
}

von Karl H. (kbuchegg)


Lesenswert?

Satz K. schrieb:

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


dein
  currentAddressW+i
wird halt irgendwann mal größer oder gleich
  DATA_LENGTH + 4
werden.

von holger (Gast)


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.

von Satz K. (satz_k)


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.

von Karl H. (kbuchegg)


Lesenswert?

Wie gross ist DATA_LENGTH?

Überlauf des SRAM durch zuviel verbrauchten Speicher?

von holger (Gast)


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.

von Amateur (Gast)


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.

von Satz K. (satz_k)


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?

von holger (Gast)


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.

von Amateur (Gast)


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.

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.