Problem mit Zeigern



  • Ich muss den Buffer inklusive Kommando aber als einen einzigen Bytestrom übergeben, sonst funktioniert das Kommando nicht.



  • Dann verwende doch einen Puffer für's Lesen und einen Puffer für's Schreiben 😉



  • Dummerweise ist das bei SPI nicht möglich, da dort genau während ich mein Zeug raustakte gleichzeitig die Antwort reingetaktet wird. Das ist leider Hardwaremäßig so in diesem Bus. Mir wäre es auch lieber das Teil würde warten bis es alles hat und dann antworten.



  • Tom555 schrieb:

    Dummerweise ist das bei SPI nicht möglich, da dort genau während ich mein Zeug raustakte gleichzeitig die Antwort reingetaktet wird. Das ist leider Hardwaremäßig so in diesem Bus. Mir wäre es auch lieber das Teil würde warten bis es alles hat und dann antworten.

    das ist aber eher ein softwareproblem. natürlich kann man eine spi schnittstelle so schreiben, dass die empfangenen daten in einem anderen puffer landen als dem, den man senden möchte. beschreib doch mal deine umgebung, also welchen controller, welche libraries, compiler etc. benutzt du?



  • Ich habs gefunden.

    Steinigt mich, ich hab in einer ganz anderen Funktion weiter unten ein Datenbyte falsch umkopiert und so hat er immer ein Byte zu wenig abgeschickt. Ich könnt gegen die Mauer rennen. Sowas sucht man dann stundenlang.

    Danke denjenigen die sich das angeschaut haben.

    @net
    Ja man kann das schon so machen, ist aber bei HIS standardisierten Treibern eher unpraktisch weil man da die Schnittstellen vorgegeben kriegt. Und da is leider nur ein Buffer vorgesehen.



  • Tom555 schrieb:

    @net
    Ja man kann das schon so machen, ist aber bei HIS standardisierten Treibern eher unpraktisch weil man da die Schnittstellen vorgegeben kriegt. Und da is leider nur ein Buffer vorgesehen.

    also wenn ich mir deine 'IO_RWriteAsync' angucke, dann sieht man schon, dass man der einen pointer und die anzahl der daten übergeben kann, die man versenden will. was ist der letzte parameter? (sieht aus wie eine callback-function/completion routine etc.). ich wette es gibt auch eine dazugehörige IO_RReadAsync, der du auch die adresse eines buffers geben kannst...und der kann sicherlich ein anderer sein, als der, den IO_RWriteAsync bekommen hat, oder?



  • Man kann der Funktion übergeben :

    address --> pointer auf datenbuffer
    size --> anzahl der Blöcke
    location--> Startblock

    Die Blöcke sind frei definierbar.

    Read und Write ind den RWriteAsync und RReadAsync funktionen unterscheiden sich lediglich darin, das der RWrite einen schreibjob auf das Externe Flash startet und der RReadAsync einen Lesejob. Dieser wird dann im Hintergrund von Interrupts abgearbeitet.

    Den Aufruf IO_RWriteAsync den du meinst, hat unser Kunde geschrieben, das heisst für mich Finger weg und Hinnehmen so wie es ist. Das ist ein Aufruf der HIS IO Library. Das dahinter ist tatsächlich eine Callback, die aufgerufen werden soll, wenn der Befehl fertig ist.



  • so hab ich mir das vorgestellt. also muss man nach dem aufruf der funktion den buffer in ruhe lassen, bis die callback angesprungen wurde. das ist an sich nichts, was stress machen sollte. während die 'write'-funktion brav den buffer versendet, kannst du sicherlich mit der 'read'-funktion arbeiten (das 'async' im namen veranlasst mich zu der annahme). d.h. während 'write' aktiv ist, sollte die read-funktion natürlich mit einem anderen buffer arbeiten, sonst gibts datensalat.



  • Im Moment gehts leider nicht so schön, man kann immer nur einen Job gleichzeitig ausführen. Erst wenn die Callback Funktion angesprungen wurde, kann man den nächsten Job starten. Ist leider nur ein kleiner Atmel chip, der hat nur 4 K Ram. Da kann man leider nicht so viele Buffer einbauen wie man gerne möchte :).



  • Tom555 schrieb:

    Ist leider nur ein kleiner Atmel chip, der hat nur 4 K Ram. Da kann man leider nicht so viele Buffer einbauen wie man gerne möchte :).

    4k sind doch sehr viel 😉
    der trick bei solchen dingern ist eben 'buffer sharing', also alle variablen, arrays, etc. mehrfach zu verwenden wenn's die funktion nicht beeinträchtigt. aber klar, solange die 'write' funktion läuft, darfste den einen buffer nicht benutzen...


Anmelden zum Antworten