Frage zu Libnodave daveWriteS5Bytes()

funkey

Level-2
Beiträge
363
Reaktionspunkte
109
Hallo. Ich habe eine Frage bezüglich Libnodave und zwar verwende ich die Funktion daveWriteS5Bytes() und frage mich ob das ein Bug ist.

Hier der betreffende Code:

Code:
int DECL2 daveWriteS5Bytes(daveConnection * dc, uc area, uc BlockN, int offset, int count, void * buf)
{
    int res,datastart;
    daveS5AreaInfo ai;
    uc b1[daveMaxRawLen];
//    if (_daveIsS5DBlockArea(area)==0) {
    if (area==daveDB) {
// LOG1("_daveIsS5DBlockArea\n");
        res=_daveReadS5BlockAddress(dc,area,BlockN,&ai);
        if (res<0) {
            LOG2("%s *** Error in WriteS5Bytes.BlockAddr request.\n", dc->iface->name);
            return res-50;
        }
 datastart=ai.address;
    } else {
        switch (area) {
     case daveRawMemoryS5: datastart=0; break;
     case daveInputs: datastart=dc->cache->PAE; break;
     case daveOutputs: datastart=dc->cache->PAA; break;
     case daveFlags: datastart=dc->cache->flags; break;
     case daveTimer: datastart=dc->cache->timers; break;
     case daveCounter: datastart=dc->cache->counters; break;
     case daveSysDataS5: datastart=dc->cache->systemData; break;
     default:
      LOG2("%s *** Unknown area in WriteS5Bytes request.\n", dc->iface->name);
  return -1;
 }
    }
    if ((count>daveMaxRawLen)||(offset+count>ai.len)) {
        LOG2("%s writeS5Bytes *** Requested data is out-of-range.\n", dc->iface->name);
        return -1;
    }
    
    ....
}

Wie man sehen kann wird die daveS5AreaInfo-Struktur 'ai' nur gefüllt, wenn der Bereich ein Datenbaustein ist. Weiter unten wird aber 'ai.len' zur Überprüfung des Bereiches verwendet, wo dann die Meldung 'Requested data is out-of-range' kommt. Hat da jemand schon einen Fix dafür?

Gruß
funkey
 
Bei daveReadS5Bytes() ist das einfach auskommentiert worden.
Kannst du ja auch so machen, oder die Prüfung in den DB-Pfad verschieben wo es eigentlich hingehört.
 
Ich mache das jetzt so

Code:
        switch (area)
        {
     case daveRawMemoryS5:
         datastart=0;
         ai.len = daveMaxRawLen; // ??
         break;
     case daveInputs:
         datastart=dc->cache->PAE;
         ai.len = dc->cache->PAA - datastart;
         break;
     case daveOutputs:
         datastart=dc->cache->PAA;
         ai.len = dc->cache->PAA - dc->cache->PAE; //gleiche Länge angenommen wie Eingänge
         break;
     case daveFlags:
         datastart=dc->cache->flags;
         ai.len = dc->cache->PAE - datastart;
         break;
     case daveTimer:
         datastart=dc->cache->timers;
         ai.len = dc->cache->counters - datastart;
         break;
     case daveCounter:
         datastart=dc->cache->counters;
         ai.len = dc->cache->flags - datastart;
         break;
     case daveSysDataS5:
         datastart=dc->cache->systemData;
         ai.len = dc->cache->timers - datastart;
         break;
     default:
      LOG2("%s *** Unknown area in WriteS5Bytes request.\n", dc->iface->name);
  return -1;
 }
 
Zuletzt bearbeitet:
Ist die Reihenfolge der Speicherbereiche in der S5 denn definitiv so festgelegt, damit das bei allen S5en funktioniert?
 
Das weiß ich leider nicht. Ich bin einfach mal davon ausgegangen und habe gehofft, das es immer so ist.
 
Zuletzt bearbeitet:
Für die Nutzung dieser Website sind Cookies erforderlich. Du musst diese akzeptieren, um die Website weiter nutzen zu können. Erfahre mehr…