Changeset 3626 in Sophya for trunk


Ignore:
Timestamp:
May 22, 2009, 6:18:06 PM (16 years ago)
Author:
ansari
Message:

Introduction numero d'ordre de remplissage, mask de recyclage,
et sequence de traitement procA/B/C dans le gestionnaire de
memoire - Reza 22/05/2009

Location:
trunk/AddOn/TAcq
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/AddOn/TAcq/brpaqu.cc

    r3625 r3626  
    483483    lostframes += (unsigned long long)delfc - 1;
    484484    if (delfc != 1) {
    485     cnt_pb++;
    486     if (cnt_pb < 5) paq.Print();
     485      cnt_pb++;
     486      if (cnt_pb < 5) {
     487        cout << "BRPaqChecker::Check([NumFrameOK=" << nframeok
     488             << ")/Debug  FrameCounter Cur=" << curfc
     489             << " Last=" << frclst << " -> delta=" << delfc << endl; 
     490        paq.Print();
     491      }
    487492    }
    488493  }
  • trunk/AddOn/TAcq/pciewrap.cc

    r3625 r3626  
    4848    bp[kk] = (Byte)(sin(0.0345*kk)*78.+127.5);
    4949*/
    50   for(UInt32 kk=0; kk<paq.DataSize(); kk++)
     50  UInt32 kkmax = paq.DataSize();
     51  for(UInt32 kk=0; kk<kkmax; kk++)
    5152    bp[kk] = (Byte)(kk%200+20);
    5253  tottransfer_ += size_;
  • trunk/AddOn/TAcq/racqumem.cc

    r3623 r3626  
    66//----------------------------------------------------------------
    77
    8 
     8/* --Methode-- */
    99RAcqMemZoneMgr::RAcqMemZoneMgr(uint_4 nz, uint_4 np, uint_4 psz)
    1010  : mex(true), nzones(nz), npaq(np), paqsz(psz), stop_(false)
     
    1212  St_MemZ st;
    1313
     14  st.serial = 0;
    1415  st.act = (uint_4)MemZA_None;
    15   st.stat = (uint_8)MemZS_Free;
    16   for(int k=0; k<3; k++) st.nbact[k] = 0;
     16  st.stat = (uint_4)MemZS_Free;
     17  for(int k=0; k<6; k++) st.nbact[k] = 0;
    1718  uint_8 mzsz = npaq*paqsz;
    1819
     
    2122     states.push_back(st);
    2223   }
    23  
     24  serial_ = 0;
     25  SetFinalizedMask();
    2426}
    2527
     28/* --Methode-- */
    2629RAcqMemZoneMgr::~RAcqMemZoneMgr()
    2730{
     
    2932}
    3033
     34/* --Methode-- */
    3135int RAcqMemZoneMgr::FindMemZoneId(MemZaction act)
     36// Recherche et renvoie une zone memoire compatible pour effectuer l'operation act
     37// Pour act = MemZA_Fill : Zone vide ou satisfaisant la condition mask_finalized_
     38// On recherche a chaque fois la zone ayant le plus petit numero de serie
     39// cad le numero d'ordre de remplissage
     40// Pour ProcA/B/C on attend que la zone avec le plus petit numero soit disponible
     41
    3242{
    3343  int rid = -1;
     
    3545  if ((act != MemZA_Fill) && (act != MemZA_Save) && (act != MemZA_Proc)) return rid;
    3646  mex.lock();
     47  uint_8 bestserial = serial_ + 5;
    3748  while ((rid < 0)&&(!stop_)) {
    38     switch (act)
    39       {
     49    switch (act)  {
    4050      case MemZA_Fill:
    4151        if (rid < 0) for(uint_4 k=0; k<NbZones(); k++) {
    4252          if ((states[k].act == MemZA_None) &&
    43               ((states[k].stat == MemZS_Free)||(states[k].stat & MemZS_Saved)) )
    44             { rid = k; break; }
     53              ((states[k].stat == MemZS_Free)||(states[k].stat & mask_finalized_)) ) {
     54            if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
     55          }
    4556        }
    4657        if (rid >= 0) { states[rid].act = MemZA_Fill; states[rid].stat = MemZS_Free; }
     
    4859      case MemZA_Save:
    4960        for(uint_4 k=0; k<NbZones(); k++) {
    50           if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
    51               !(states[k].stat & MemZS_Saved) ) { rid = k; break; }
     61          if ((states[k].act == MemZA_None) &&
     62              (states[k].stat & MemZS_Filled) && !(states[k].stat & MemZS_Saved) ) {
     63            if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
     64          }
    5265        }
    5366        if (rid >= 0) states[rid].act = MemZA_Save;
     
    5568      case MemZA_Proc:
    5669        for(uint_4 k=0; k<NbZones(); k++) {
     70          if ((states[k].act == MemZA_None) &&
     71              (states[k].stat & MemZS_Filled) && !(states[k].stat & MemZS_Proc) ) {
     72            if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
     73          }
     74        }
     75        if (rid >= 0) states[rid].act = MemZA_Proc; 
     76        break;           
     77      case MemZA_ProcA:
     78        for(uint_4 k=0; k<NbZones(); k++) {
    5779          if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
    58               !(states[k].stat & MemZS_Proc) ) { rid = k; break; }
     80              !(states[k].stat & MemZS_ProcA) ) {
     81            if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
     82          }
    5983        }
    60         if (rid >= 0) states[rid].act = MemZA_Proc;               
     84        if (rid >= 0) states[rid].act = MemZA_ProcA;             
     85        break;
     86      case MemZA_ProcB:
     87        for(uint_4 k=0; k<NbZones(); k++) {
     88          if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
     89              (states[k].stat & MemZS_ProcA) && !(states[k].stat & MemZS_ProcB) ) {
     90            if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
     91          }
     92        }
     93        if (rid >= 0) states[rid].act = MemZA_ProcB;             
     94        break;
     95      case MemZA_ProcC:
     96        for(uint_4 k=0; k<NbZones(); k++) {
     97          if ((states[k].act == MemZA_None) && (states[k].stat & MemZS_Filled) &&
     98              (states[k].stat & MemZS_ProcB) && !(states[k].stat & MemZS_ProcC) ) {
     99            if (states[k].serial < bestserial) { rid=k; bestserial=states[k].serial; }
     100          }
     101        }
     102        if (rid >= 0) states[rid].act = MemZA_ProcC;             
    61103        break;
    62104      case MemZA_None:   // MTQ pour supprimer un warning
    63105        break;
    64       }
     106      }  // Fin de switch
    65107    if (rid < 0)  mex.wait();
    66   }
     108  }  // Fin de while
    67109  mex.unlock();
    68110  return rid;
    69111}
    70112
     113/* --Methode-- */
    71114int RAcqMemZoneMgr::FreeMemZone(int id, MemZStatus st)
    72115{
     
    75118  mex.lock();
    76119  switch (st) {
    77         case MemZS_Free :
    78           states[id].stat = MemZS_Free;
    79           states[id].act = MemZA_None;
    80         break;
    81         case MemZS_Filled :
    82           if (states[id].act != MemZA_Fill)  rc = 2;
    83           else states[id].nbact[0]++;
    84           states[id].stat |= MemZS_Filled;
    85           states[id].act = MemZA_None;
    86         break;
    87         case MemZS_Saved :
    88           if (states[id].act != MemZA_Save)  rc = 4;
    89           else states[id].nbact[1]++;     
    90           states[id].stat |= MemZS_Saved;
    91           states[id].act = MemZA_None;
    92         break;
    93         case MemZS_Proc :
    94           if (states[id].act != MemZA_Proc)  rc = 8;
    95           else states[id].nbact[2]++;     
    96           states[id].stat |= MemZS_Proc;
    97           states[id].act = MemZA_None;
    98         break;
    99         default :
    100           rc = 16;
    101           states[id].stat = MemZS_Free;
    102           states[id].act = MemZA_None;
    103         break;
    104   }
     120    case MemZS_Free :
     121      states[id].serial = 0;
     122      states[id].stat = MemZS_Free;
     123      states[id].act = MemZA_None;
     124      break;
     125    case MemZS_Filled :
     126      if (states[id].act != MemZA_Fill)  rc = 2;
     127      else states[id].nbact[0]++;
     128      serial_ ++;
     129      states[id].serial = serial_;
     130      states[id].stat |= MemZS_Filled;
     131      states[id].act = MemZA_None;
     132      break;
     133    case MemZS_Saved :
     134      if (states[id].act != MemZA_Save)  rc = 4;
     135      else states[id].nbact[1]++;         
     136      states[id].stat |= MemZS_Saved;
     137      states[id].act = MemZA_None;
     138      break;
     139    case MemZS_Proc :
     140      if (states[id].act != MemZA_Proc)  rc = 8;
     141      else states[id].nbact[2]++;         
     142      states[id].stat |= MemZS_Proc;
     143      states[id].act = MemZA_None;
     144      break;
     145    case MemZS_ProcA :
     146      if (states[id].act != MemZA_ProcA)  rc = 16;
     147      else states[id].nbact[3]++;         
     148      states[id].stat |= MemZS_ProcA;
     149      states[id].act = MemZA_None;
     150      break;
     151    case MemZS_ProcB :
     152      if (states[id].act != MemZA_ProcB)  rc = 32;
     153      else states[id].nbact[4]++;         
     154      states[id].stat |= MemZS_ProcB;
     155      states[id].act = MemZA_None;
     156      break;
     157    case MemZS_ProcC :
     158      if (states[id].act != MemZA_ProcC)  rc = 64;
     159      else states[id].nbact[4]++;         
     160      states[id].stat |= MemZS_ProcC;
     161      states[id].act = MemZA_None;
     162      break;
     163    default :
     164      rc = 128;
     165      states[id].serial = 0;
     166      states[id].stat = MemZS_Free;
     167      states[id].act = MemZA_None;
     168      break;
     169  }  // Fin de switch
    105170  mex.unlock();
    106171  mex.broadcast();
     
    121186  for(uint_4 k=0; k<states.size(); k++)
    122187    os << " [" << k << "] Act=" << states[k].act << " Stat=" << states[k].stat
    123        << " NbAct[0..2]=" << states[k].nbact[0] << "," << states[k].nbact[1]
    124        << "," << states[k].nbact[2] << endl;   
     188       << " NbAct[0..5]=" << states[k].nbact[0] << "," << states[k].nbact[1]
     189       << "," << states[k].nbact[2] << "," << states[k].nbact[3]
     190       << "," << states[k].nbact[4] << "," << states[k].nbact[5] << endl;       
    125191  return os;   
    126192}
  • trunk/AddOn/TAcq/racqumem.h

    r3623 r3626  
    55// ---- classes de gestion memoire pour acquisition BAORadio -----
    66// LAL -      R. Ansari - Juin/Juillet 2008
     7//       Modifs Mai 2009
     8//       - Introduction du numero d'ordre de remplissage
     9//       - Introduction de mask de recyclage et sequence de traitement procA/B/C
    710//----------------------------------------------------------------
    811
     
    2124// Structure de gestion utilisee par la classe RAcqMemMgr
    2225typedef struct {
    23   uint_4 act;
    24   uint_4 stat;
    25   uint_4 nbact[3];
    26 //  int tid;
     26  uint_8 serial;    // Numero de serie permettant d'ordonner en temps les zones memoire rempli
     27  uint_4 act;       // Indique l'action en cours sur une zone Fill,Save ...
     28  uint_4 stat;      // Champ de flag (bits) indiquant les operations effectuees sur la zone
     29  uint_4 nbact[6];  // compteurs nb de fois ou (fill,save,proc,procA/B/C) a ete effectuee sur la zone
     30//  int tid;        Pas utilise pour le moment, permet l'identification du thread operant sur la zone
    2731} St_MemZ;
    2832
    29 enum MemZStatus { MemZS_Free=0, MemZS_Filled=1, MemZS_Saved=2, MemZS_Proc=4 };
    30 enum MemZaction { MemZA_None=0, MemZA_Fill=1, MemZA_Save=2, MemZA_Proc=4};
     33// Les flags (bits) correspondant aux operations effectuees sur une zone
     34// Free->libre, Filled->rempli(par DMA), Saved(ecrit sur disque), Proc(Traitement)
     35// ProcA/B/C : Trois traitement qui doivent s'enchainer
     36enum MemZStatus { MemZS_Free=0, MemZS_Filled=1, MemZS_Saved=2, MemZS_Proc=4,
     37                  MemZS_ProcA=8, MemZS_ProcB=16, MemZS_ProcC=32 };
     38// L'action en cours sur une zone
     39enum MemZaction { MemZA_None=0, MemZA_Fill=1, MemZA_Save=2, MemZA_Proc=4,
     40                  MemZA_ProcA=8, MemZA_ProcB=16, MemZA_ProcC=32 };
    3141
    3242// -------------------------------------------------------------------
    33 // Structure de gestion de zones memoire partagee (des vecteurs) entre
     43// Classe de gestion de zones memoire partagee (des buffers) entre
    3444// threads - qui doivent operer successivement sur les vecteurs
    3545// -------------------------------------------------------------------
    3646class RAcqMemZoneMgr {
    3747public:
    38 // Constructeur, classe dma, nz=Nb de zones, np=Nb de paquets/zone , psz=taille de paquet
    39   RAcqMemZoneMgr(uint_4 nz, uint_4 np=1000, uint_4 psz=4096);
     48// Constructeur, nz=Nb de zones, np=Nb de paquets/zone , psz=taille de paquet
     49  RAcqMemZoneMgr(uint_4 nz, uint_4 np=256, uint_4 psz=4096);
    4050  ~RAcqMemZoneMgr();
    4151 
     
    4959  inline uint_4 ZoneSize() { return npaq*paqsz; }
    5060 
     61  // Definit l'etat des operations obligatoires avant qu'une zone
     62  // remplie ne puisse etre recyclee (re-remplie)
     63  inline uint_4 SetFinalizedMask(uint_4 mask=((uint_4)MemZS_Saved))
     64    { mask_finalized_ = mask; }
     65  inline uint_4 GetFinalizedMask() { return mask_finalized_; }
    5166
    5267  // Retourne un MemZone disponible pour une action specifique
     
    7186  vector< St_MemZ > states;
    7287  bool stop_;
     88  uint_4 mask_finalized_;
     89  uint_8 serial_; 
    7390};
    7491
Note: See TracChangeset for help on using the changeset viewer.