Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

przerwania a c++ (mikrokontroler)

Ostatnio zmodyfikowano 2016-06-22 20:27
Autor Wiadomość
mateczek
Temat założony przez niniejszego użytkownika
przerwania a c++ (mikrokontroler)
» 2016-06-18 08:35:30
Właściwie to szukam metody, jak w miarę czytelnie i przejrzyście korzystać z przerwań w mikrontrolerze (pętla zdarzeń lub coś). Na początek napisałem klasę przycisk. Po naciśnięciu wpisuje do zmiennej "timer" pewną wartość i wartość ta w przerwaniu ma być zmniejszana do zera. Zerowa wartość timera daje zezwolenie na kolejne wciśnięcie przycisku.
Problem w metodzie jest taki, że korzysta ze składowej statycznej. Co za tym idzie działa na wszystkie obiekty klasy przycisk, nie zaś na jeden konkretny.
C/C++
#include <iostream>
#include "windows.h"
using namespace std;

class przycisk {
public:
    static int timer;
    static void decrementTimers() {
        if( timer > 0 ) timer--; // zmniejszanie timera do zera
       
    }
    bool isPressed() {
        bool statusKlawisza =( GetKeyState( VK_UP ) & 0x8000 ); //windows pobranie stanu klawisza
        bool zbocze = statusKlawisza &&( !timer ); //true tylko wtedy gdy timer=0 i klawisz wcisnięty
        if( statusKlawisza ) timer = 1000000; //timer juz nie zero
       
        return zbocze;
       
    }
   
};

int przycisk::timer = 0;

extern "C" { //musi być extern "C" bo adres tej funkcji jest wklepany na stałe w pamięć procesora
    void timerSystick() {
        przycisk::decrementTimers(); //w przerwaniu tylko funkcja statyczna działająca na zmiennych statycznych
        // i właśnie to chciałbym obejść. Za wszelkie uwagi jak zrobić taki inteligentny callback był bym wdzięczny
       
    }
}


//program ma za zadanie eliminowaie wielokrotnych szybkich naciśnięć klawisza
int main() {
    przycisk P1;
    while( 1 )
    {
        if( P1.isPressed() ) {
            cout << "klikniento klika" << endl;
        }
        //symulacja dekrementacji normalnie ta funkcja na procku wywoła się z automatu
        timerSystick(); //funkcja wywołująca się w stałych odstępach czasu
        //koniec symulacji
    }
   
}
Program na windows PC.
Program ma zabezpieczyć przed szybkimi wciśnięciami klawisza (tutaj strzałka góra).
Chciałbym się dowiedzieć Jak z poziomu przerwania (luźna funkcja) oddziaływać na obiekty.
Ps, W mikro-kontrolerze mogę korzystać z jakieś części biblioteki standardowej c++ więc użycie jej również wchodzi w drogę
Dzięki za uwagę.
P-149229
jankowalski25
» 2016-06-19 11:17:03
Możesz trzymać w statycznej zmiennej stan wszystkich przycisków i odwoływać się przez indeks.
P-149261
mateczek
Temat założony przez niniejszego użytkownika
» 2016-06-20 00:52:24
Możesz trzymać w statycznej zmiennej stan wszystkich przycisków i odwoływać się przez indeks.
i chyba skorzystam z porady !!! Bo szukałem i nawet znalazłem coś Co chyba by mnie odpowiadało wydaje mi się fajny art!!!
https://arobenko.gitbooks.io​/bare_metal_cpp/content​/basic_concepts/event_loop.html
https://arobenko.gitbooks.io​/bare_metal_cpp/content​/peripherals/timer.html

Ale niestety nie ogarniam tematu(Jak narazie temat trochę mnie przerasta).A i z angielskim nie jest u mnie tak super. Ale pomęczę się z zagadnieniem kilka dni i zobaczę czy będą postępy !!!
P-149288
mateczek
Temat założony przez niniejszego użytkownika
» 2016-06-22 19:34:03
przyznam się szczerze że nie dokońca rozumiem temat funktorów. i jeśli ktoś mógłby luknąć i powiedzieć dlaczego takie coś się nie kompiluje

C/C++
#include <iostream>
#include<vector>
#include<functional>
using namespace std;


std::vector < std::function < void >() > timerEvents; // tablica wskaźników do funkcji będących metodami obiektu (przynajmniej taki miałem zamiar)

class przycisk {
    int timer = 0;
public:
    przycisk() {
        timerEvents.push_back( std::bind( & przycisk::timerevent, this ) ); //zarejestrować metodę w globalnym kontenerze timerEvents
    }
    void timerevent() {
        if( timer > 0 ) timer--;
       
    }
};
//koniec klasy przycisk

void timerSystick() {
    for( auto fun: timerEvents ) {
        fun(); //wywołanie wszystkich zarejestrowanych funkcji
    }
}


int main() {
    przycisk P1;
    while( 1 )
    {
       
        timerSystick(); //funkcja wywołująca się w stałych odstępach czasu tutaj symulacja
       
    }
   
}
P-149385
carlosmay
» 2016-06-22 19:53:37
std::vector < std::function < void() > >
P-149386
mateczek
Temat założony przez niniejszego użytkownika
» 2016-06-22 20:27:06
dzięki :)
P-149389
« 1 »
  Strona 1 z 1