Hi,
ich habe folgenden eientlich recht simplen Code, mit dem ich auf meinem
ATTiny Daten vom USB empfange:
1
staticucharkeyData[DATA_LENGTH+4];
2
3
ucharusbFunctionWrite(uchar*data,ucharlen)
4
{
5
uchari;
6
7
if(bytesRemainingW==0)return1;/* 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
return1;
15
}
16
return0;
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...
>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...
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.
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.
>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.
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.
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?
>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.
@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.