Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C++ co najlepsze do operacji na bitach?

Bruum 01 Paź 2011 15:09 1843 10
  • #1 01 Paź 2011 15:09
    Bruum
    Poziom 23  

    Witam! Mam jako dane wejściowe 45 bajtów z których interesuje mnie po 6 bitów czyli 270 bitów. Z ich stanów, stanów bitów sterujących z programu mam wypracować 144 bity i wpakować je po 6 sztuk plus 2pomocnicze w kolejne bajty do wysłania na zewnątrz. I tak co 15 do 20 milisekund. Chodziło to będzie w konsoli windowsa. Co jest lepsze do operowania poszczególnymi bitami w C++ w winie? Co byście Koledzy polecali, co jest szybsze, wydajniejsze etc. Czy Przekształcenie tablic bajtów wejściowych w pola bitowe i operowanie na nich, czy przekształcenie w zmienne bool-owskie i operowanie algebraiczne na nich, czy przy każdym odwołaniu do bitu brać bajt i maskę ew. przesunięcia bitowe, a potem if-y jako sprawdzenie warunku i dalej ustawianie potrzebnych bitów w bajtach "wyjściowych".

    0 10
  • Arrow Multisolution Day
  • #2 01 Paź 2011 16:39
    Dżyszla
    Poziom 42  

    Podaj konkretny przykład zastosowania - co masz na wejściu i co potrzebujesz mieć i w jakim celu. Bez tego trudno jest jednoznacznie określić rozwiązanie.

    Na pewno jednak odpada operowaniem przez jakiekolwiek typy/obiekty wirtualizujące dostęp do poszczególnych bitów. Dostęp musi być realizowany na niskim poziomie, czyli wprost ciąg bajtów w tablicy.

    0
  • #3 01 Paź 2011 17:36
    MirekCz
    Poziom 35  

    Podaj dokładne operacje do wykonania, ale generalnie używaj or/nor/and i przesunięcia. Zapomnij o typie bool i innych kombinacjach typowo językowych.

    Tylko jak to ma być windows nie RTOS to słabo widzę te 15-20msec...

    0
  • #4 01 Paź 2011 18:17
    Bruum
    Poziom 23  

    Witam!
    Po prostu soft plc. Z peryferiów przychodzą bajty których 6 młodszych bitów jest dla nas znaczących. Skoro mówicie, że boole i inne są nie za bardzo to sobie wezmę w definach np coś takiego:

    Code:
    [syntax=cpp][/syntax]
    
    #define I2.3 tab[1]&0x4

    A potem coś podobnie jak w uroszczonym IL wypracowywanie stanów wyjść.
    Na koniec cyklu upakowywanie "stanów wyjść" w bajty do wysłania.

    Też się milisekund deko obawiam, te 20ms to i tak podwójny margines bezpieczeństwa.

    0
  • Arrow Multisolution Day
  • #5 01 Paź 2011 21:21
    despotka
    Poziom 8  

    Proponuje napisać to w asemblerze, do takich zadań najlepiej się sprawdza, a kombinowanie z funkcjami C++ mija sie trochę z celem.

    0
  • #6 01 Paź 2011 21:48
    Bruum
    Poziom 23  

    despotka napisał:
    Proponuje napisać to w asemblerze, do takich zadań najlepiej się sprawdza, a kombinowanie z funkcjami C++ mija sie trochę z celem.

    Myślę, że niestety masz rację, najlepszy by był. Ale obawiam się, że zanim ja "naumiem się" asemblera i to na kompa a nie mikrokontroler, to maszyna do której to ma być całkiem zardzewieje. Tak więc te rzeczy myślę załatwić za pomocą C. Na uC się sprawdzało.

    0
  • #7 01 Paź 2011 22:14
    Xitami
    Poziom 29  

    Nie wiem co będziesz robił, więc nie potrafię powiedzieć jak to zrobić lepiej.
    A co do szybkości, to pewnie w basicu też da radę.

    0
  • #8 01 Paź 2011 23:07
    Zadusiciel
    Poziom 13  

    Z tego co tu napisałeś (przynajmniej ja tak czuję) nie wiele można się dowiedzieć o problemie, co chcesz zrobić? chcesz używać bitów? i co?

    Cytat:
    Mam jako dane wejściowe 45 bajtów


    Cytat:
    Z ich stanów, stanów bitów sterujących z programu mam wypracować 144 bity
    wypracować? czyli co ?

    Code:
    byte in_bytes[45];
    
    byte out_bytes[45];

    // MASZ ROZWIĄZANIE :D

    void translate()
    {
         memcpy(out_bytes, in_bytes, 144 / 8);
    }

    0
  • Pomocny post
    #9 01 Paź 2011 23:08
    Elektronik9
    Poziom 30  

    Przesunięcia bitowe będą najszybsze.

    0
  • #10 01 Paź 2011 23:43
    Bruum
    Poziom 23  

    Elektronik9 napisał:
    Przesunięcia bitowe będą najszybsze.

    I to jest konkretna odpowiedź! Dzięki!
    Co do basica-próby z .NET skutkowały nieregularnym występowaniem nadmiernych opóźnień komunikacji z peryferiami.
    "Wypracować 144 bity" znaczy np.
    a> zrobić odpowiednie przesunięcie i wyłuskać bit bezpośrednio w danym działaniu
    b> wyłuskać bit i zapisać go do zmiennej bool w działaniach używając tej zmiennej
    c> wyłuskać bit i zapisać go do pola bitowego w działaniach używając pola
    d> inny myk, który może ktoś podpowie.
    Za pośrednią formą przemawia chyba to, że do bitów może być konieczne kulkukrotne odwołanie w cyklu, więc i kilkukrotna operacja przesunięcia, ale, więcej w cyklu będzie sytuacji z niewykorzystanymi bitami, więc wyłuskiwanie wszystkich będzie niepotrzebne. W literaturze o polach bitowych stoi np., że nie jest określony rozkład bitów w danej jednostce pamięci, mogą być różnice między kompilatorami i systemami, co nie pozwala na coś takiego, że mamy np. tablicę BYTE'ów i traktujemy poszczególne bajty jako pola bitowe i operujemy na bitach. Więc chyba pola bitowe odrzucimy.
    W uC można było sobie podejżeć co kompilator zrobił z naszego kodu i wybrać najoptymalniejszy wariant. Czy pisząc na win jest taka możliwość?

    0
  • #11 02 Paź 2011 14:12
    MirekCz
    Poziom 35  

    Na windowsa możesz zrobić dokładnie to samo - podejrzeć kod assemblera. Dodatkowo masz pełen debugger i masę innych ułatwień.

    Tylko to co Ty chcesz zrobić w 20ms obecne procesory zrobią w 0,2ms z łatwością i to nawet jakbyś wybrał "najbardziej nieoptymalną formę" i skompilował ją najgorszym kompilatorem.
    Problem natomiast jest inny - standardowy windows to nie system RTOS i tam nie masz powiedziane, że Sleep(1); odczeka 1ms. W zależności od tego co jeszcze windows robi (a może sobie np. wymyślić zapisanie czegoś na dysk) może to trwać od 0ms do >1000ms.

    Rozwiązania masz dwa:
    1.Użyć prostego mikrokontrolera z 2 portami usart i pamięcią >=512 bajtów
    2.Zmienić system operacyjny na PC.

    Sam kod możesz napisać w C pod windowsa, żeby sprawdzić poprawne działanie, a potem tylko przenieść na mikrokontroler i masz pewność, że w tym kodzie błędów nie będzie. Reszta kodu to też nie będzie bóg wie jak trudna do napisania, więc może rozejrzyj się za jakimś kitem z mikrokontrolerem i dwoma portami usart...

    0