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

[STM32][C++] - Brak pomiaru ADC przy zdefiniowaniu zmiennej w klasie

KryQ 15 Sie 2016 12:25 1026 9
  • #1 15 Sie 2016 12:25
    KryQ
    Poziom 8  

    Witam od dłuższego czasu piszę sobie spokojnie projekcik na STM32f429.
    Z racji że projekt dość szybko rośnie w i C zaczął zajmować pół mega postanowiłem skurczyć go przy użyciu C++.

    Konwersja poszła gładko jednak ADC przestał mierzyć...

    Siedzę nad tym już 3 dzien i doszedłem że w momencie gdy mamy coś takiego:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    ADC nie ma zamiaru działać poprawnie.

    Jednak gdy wyrzuce adcHandle poza klase i w pliku przerwań zdeklaruje zmienną jako extern wszystko działa.

    Jest w stanie jakaś mądra głowa powiedzieć mi o co chodzi?

    Z góry dziękuje za odpowiedz.

    0 9
  • #2 15 Sie 2016 12:33
    grko
    Poziom 33  

    Cytat:

    ADC nie ma zamiaru działać poprawnie.


    To nie jest wystarczający opis problemu. Pokaż więcej kodu i opisz co dokładnie się dzieje.

    0
  • #3 15 Sie 2016 12:39
    KryQ
    Poziom 8  

    Wygląda po prostu jakby ADC nie było w ogóle zainicjowane. Polling zacina kompletnie procek, It i DMA nie są wyzwalane.



    TempSensor.cpp

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I wycinek stm32f4xx_it.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    I wersja działająca

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Mam nadzieje że to jakoś rozjaśnia sytuacje

    0
  • #4 15 Sie 2016 12:48
    grko
    Poziom 33  

    @KryQ A jesteś w stanie zobaczyć jak wyglądają struktury pod debugerem w wersji działającej i niedziałającej?
    Nie wrzuciłeś kodu gdzie inicjalizowany jest wskaźnik base.

    0
  • #5 15 Sie 2016 13:04
    KryQ
    Poziom 8  

    Sprawna wersja:
    [STM32][C++] - Brak pomiaru ADC przy zdefiniowaniu zmiennej w klasie

    Niesprawna:
    [STM32][C++] - Brak pomiaru ADC przy zdefiniowaniu zmiennej w klasie

    Wygląda na to ze bit ovr jest ustawiony tylko dlaczego. Nie zmieniam nic poza deklaracją zmiennej

    0
  • #6 15 Sie 2016 17:32
    JacekCz
    Poziom 36  

    KryQ napisał:
    Witam od dłuższego czasu piszę sobie spokojnie projekcik na STM32f429.
    Z racji że projekt dość szybko rośnie w i C zaczął zajmować pół mega postanowiłem skurczyć go przy użyciu C++.

    Konwersja poszła gładko ...

    Jednak gdy wyrzuce adcHandle poza klase i w pliku przerwań zdeklaruje zmienną jako extern wszystko działa.

    Jest w stanie jakaś mądra głowa powiedzieć mi o co chodzi?



    Jak pisze kol Grzegorz nie podałeś nadal kodu jak tworzysz instancję tej klasy.
    Ramowa odpowiedź (jeśli zmienna działa OK, nie działa alokowana albo na stosie czyli "auto") na 99% jest taka : nie jest w pełni zainicjowana.
    Umieszczenie jej w obszarze statycznym zeruje ją w sposób standardowy, poza nim nie ma tej gwarancji.

    Któreś istotne pole ma wartość przypadkową.
    Zamieściłeś zrzut rejestrów a miał być tej klasy

    Opieram się na Twoim zapewnieniu że to jedyna zmiana.

    0
  • #7 16 Sie 2016 12:00
    el2010tmp
    Poziom 25  

    W c++ przed funkcjami obsługi przerwań dodaj extern "C" np.:
    extern "C" void DMA2_Stream0_IRQHandler(void)
    {
    ...
    }
    Inaczej nie będą wywoływane.

    0
  • #8 16 Sie 2016 12:27
    JacekCz
    Poziom 36  

    el2010tmp napisał:
    W c++ przed funkcjami obsługi przerwań dodaj extern "C" np.:
    extern "C" void DMA2_Stream0_IRQHandler(void)
    {
    ...
    }
    Inaczej nie będą wywoływane.


    Nie mam przekonania. W ARM, i to widać w tym kodzie wektory przerwań są wprowadzane po identyfikatorze C/C++ (czyli po kompilacji po adresie) i myślę że nie zachodzi co piszesz.

    Masz rację na AVR, tam funkcja MUSI mieć dokładną nazwę i manglowana C++ nie zostanie odnaleziona.

    0
  • #9 16 Sie 2016 12:30
    grko
    Poziom 33  

    Cytat:
    Nie mam przekonania. W ARM, i to widać w tym kodzie wektory przerwań są wprowadzane po identyfikatorze C/C++ (czyli po kompilacji po adresie) i myślę że nie zachodzi co piszesz.


    Oczywiście, że zachodzi. Na ARM również trzeba dawać extern "C".

    0
  • #10 16 Sie 2016 12:32
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Debugger pozwoliłby dojść do tego problemu w 5 sekund - od razu by było widać, że w wersji działającej do przerwania wchodzi, a w niedziałającej - wisi w Default Handler.

    0
  Szukaj w 5mln produktów