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

[STM32] [ Keil ] Pytania o symulator.

06 Sie 2011 15:03 2356 10
  • Poziom 17  
    Witam.
    Jestem początkujący w świecie st32 i na początek stworzyłem sobie projekt w którym mam tylko pliki : main.c , startup - który dołączył keil (usunięte 3 linie odpowiedzialne za automatyczne uruchomienie funkcji SystemInit), Oraz 3 pliki z CMSIS:
    stm32f10x_it.c , stm32f10x_it.h , system_stm32f10x.c .

    Program wygląda następująco:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    Mam nastepujące pytania .

    Czy rejestry są prawidłowo ustawione na zegar 72Mhz.
    Dlaczego gdy uruchamiam ten program w symulatorze to niezależnie jaką wartość bym wpisał do delay_ms(....); symulator pokazuje ze ta funkcja wykonuje sie w czasie 0.056.
    Chyba , że źle sprawdzam ten czas opcja? ( debuger->execution profiling->show time)?
    A może coś z ustawieniami kompilatora lub debugera?
    Pozdrawiam.
  • Pomocny post
    Poziom 38  
    Słyszałeś kiedyś o formatowaniu kodu ?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Wydaje się być ok dla zewnętrznego kwarcu 8Mhz, dla czegokolwiek innego nie. Delaya nie wiem skąd wyczarowałeś.
  • Poziom 17  
    RCC_CFGR_PPRE2_DIV1

    Chyba kolega coś pomylił:
    Ustawiam RCC_CFGR_PPRE1_DIV2 , a nie drugi raz rejetr PPRE2_DIV1

    Code:
    RCC_CFGR_PPRE1_DIV2; // PPRE2_DIV1 niepotrzebne bo nic nie robi w tym przypadku



    Funkcja delay ma posłużyć tylko do posprawdzania i zapoznania sie z środowiskiem wiec jest jaka jest (prymitywna).

    Nadal pozostaje pytanie czego symulator nie może prawidłowo jej wykonać.
    Niezależnie od wpisanej do niej wartości , czas jej wykonania zajmuje 0.056us z ustawionym RCC a 0.5us na standardowych zegarach.
    Pozdrawiam.
  • Poziom 35  
    Bardzo dobrze działa

    Kod: C
    Zaloguj się, aby zobaczyć kod


    Akurat robi z zewn kwarca 8MHz te 72MHz dla AHB...
  • Pomocny post
    Poziom 38  
    nasiono napisał:
    RCC_CFGR_PPRE2_DIV1

    Chyba kolega coś pomylił:
    Ustawiam RCC_CFGR_PPRE1_DIV2 , a nie drugi raz rejetr PPRE2_DIV1


    Właśnie się odnosiłem do tego, żeby w ogóle nie "ustawiać" RCC_CFGR_PPRE2_DIV1 więc się nie pomyliłem.

    Jak zmienna i będzie volatile to też tyle samo trwa ? Masz tam wpisane wartości opóźnień na sztywno i optymalizator mógł stwierdzić, że ta funkcja tylko zajmuje czas i nic nie robi więc ją wyrzucił. Bez optymalizacji też tyle trwa ?

    PS. nsvinc jesteś hardcorem :P
  • Poziom 17  
    nsvinc nie za bardzo zrozumiałem o co chodzi.
    gaskoin dodałem do zmiennej i volatile w optymalizacji na level 0.
    Dalej to samo nie wiem co o tym myśleć aha jeszcze pytanie w opcji debugera gdy staram się testować to na prawdziwym procesorze program przestał pokazywać czas po prawej stronie koło numeru linii z kąd mam teraz wiedzieć w jakim czasie wykonuje się program?
  • Poziom 38  
    Nie wiem, nie używam Keila, ani żadnych symulatorów :P
  • Poziom 35  
    Po co ci ten czas znać? Na prawdziwym procku program ma działać, a nie wyświetlać ci czasy w debuggerze. Piszę kody na uC już pewien czas i jeszcze symulatora nie użyłem nigdy - nie było takiej potrzeby. Podstawowym wymogiem jest tak czy siak, że musisz wiedzieć co piszesz, a nie kodzić iteracyjnie i sprawdzać po 500 razy czy działa.

    Ta funkcja którą zamieściłem wyżej to prosta łatwa i przyjemna inicjalizacja oscylatorów i PLLa, dzięki której uzyskasz przy HSE 8MHz, 72MHz zegar rdzenia/AHB/APB2 i 36MHz APB1.

    Poza tym, kto robi delay-a FORem, i to jeszcze z dodatkową zmienną? Działać powinno, ale i tak razi w oczy... I nie wiem skąd wziąłeś założenie że twój delay będzie akurat w jednostkach milisekund odczekiwał... Na moje oko, będzie odczekiwał czas w bliżej nieokreślonych jednostkach, obojętnie co byś nie zrobił. Ten procesor ma potok...

    Kod: C
    Zaloguj się, aby zobaczyć kod

    Powyższy delay odczekuje "ileś" czasu - przekazywaną do funkcji wartość musisz dobrać eksperymentalnie do momentu kiedy opóźnienie będzie spełniać twoje oczekiwania.
    Na dobry początek przy 72MHz można zacząć od 0x4FFFFFF...
  • Poziom 17  
    Cytat:
    Funkcja delay ma posłużyć tylko do posprawdzania i zapoznania sie z środowiskiem wiec jest jaka jest (prymitywna).

    Nie jestem aż tak biegły w programowaniu wiec symulator pod avr przydawał mi się bardzo często.
    Tutaj mam debuger i chciałbym go używać ale bez jakiegoś licznika jego użyteczność dla mnie spada.
    Dziwi mnie tez ze ta funkcja tak prosta i prymitywna że jej działanie powinno byc pewne tutaj nie działa.

    Sprawdziłem w debugerze jak wyglądają rejestry po samej konfiguracji RCC sprawdziłem swój i nsvinc. Wszystko wygląda na skonfigurowane na zewnętrzny kwarc z PLL dziwi mnie jednak że HSION nadal jest zaznaczone czy to normalne.
  • Poziom 35  
    Widzisz gdzieś w kodzie wyłączanie HSION? Bo ja nie...

    A boli cię że HSION jest włączony? Jeśli tak, to go wyłącz ;]

    Czymże jest "jakiś licznik"? Co ty z nim masz zmiar robić i do czego go używać? Od pomiaru czasów wykonywania kodu jest timer w procesorze. Poza tym, co ci po liczniku, skoro pierwsze lepsze przerwanie rozwala ci cały pomiar... W lewym dolnym rogu okna Keila (przy debugu) idzie sobie do przodu licznik czasu pracy rdzenia. Aczkolwiek mi się jeszcze do niczego nie przydał.
    Przykro mi, ARM to nie AVR, i nie ma zmiłuj - debugger służy do wszystkiego innego, niż pędzienia jakichś durnych liczników. W szczególności, że ARM jest kilkanaście razy wydajniejszy...
  • Poziom 17  
    Temat zamykam za odpowiedzi dziękuje i pozdrawiam.