Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[stm32] Niespodziewana zawartość tablicy z danymi

golas17 11 Sep 2011 17:28 1398 9
Computer Controls
  • #1
    golas17
    Level 16  
    Witam,

    Mam problem z tablicą z danymi. Do tablicy zapisuję dane odczytane po SPI z przetwornika ADC. Dane powinny mieścić się w zakresie od 0 do 0x007fffff (23bity). Przed zapisem do tablicy odczytanej wartości mam warunek sprawdzający, czy odczytana wartość mieści się w tym zakresie. Pomimo tego w tablicy i tak często znajdują się inne wartości, większe np. 0xfffffff9, 0x80039876 itp.
    Co ciekawe mam kilka takich tablic i kilka przetworników w systemie. Część działa poprawnie, część niestety nie.
    Kod obsługujący odczyt z przetwornika i zapis do tablicy:
    Code: c
    Log in, to see the code


    Definicja tablicy i zmiennej licznikowej:
    Code: c
    Log in, to see the code


    Problemy pojawiają się w zasadzie w momencie kiedy często wysyłam dane. Przed ich przetworzeniem następuje uśrednienie wartości zapisanych w tablicy. Wcześniej zauważyłem podobne problemy w momencie kiedy w kodzie istniały funkcje delay.
    Macie może jakieś pomysły skąd takie dziwne wartości w tablicy?

    Pozdrawiam
  • Computer Controls
  • #2
    User removed account
    User removed account  
  • Computer Controls
  • #3
    nsvinc
    Level 35  
    Lekko dziwnie wygląda to:
    Code: C
    Log in, to see the code


    Czemu nie
    Code: C
    Log in, to see the code

    ?

    Jak wygląda proces uśredniania wartości z tablicy? Czy pierwszy kod który zamieściłeś jest w przerwaniu?
  • #4
    User removed account
    User removed account  
  • Helpful post
    #5
    nsvinc
    Level 35  
    a, no zapomniałem dodać, że patent działa tylko wtedy, jeśli wielkość przez którą jest modulowane musi być potęgą dwójki ;] Na tym procek też zyskuje...

    No a zysk jest w ilości instrukcji które musi wykonać procesor, bo % potęga_dwójki zamienia się w jedną instrukcję ubfx...(a przynajmniej powinna)
  • Helpful post
    #6
    User removed account
    User removed account  
  • #7
    golas17
    Level 16  
    Wygląda na to, że problem leżał w zbyt małym stosie. Kiedy zmieniłem wielkość stosu (main stack size) ze 128 na 256 bajtów wszystko pięknie działa.
    Korzystam ze środowiska crossworks i niestety nie znalazłem informacji o tym, gdzie umieszczony jest stos. Czy moglibyście mi podpowiedzieć gdzie można tego szukać? Co prawda nie jest to mi w tej chwili potrzebne, ale chciałbym wiedzieć takie rzeczy.
    Po drugie proszę o wyjaśnienie lub namiary na dokumenty wyjaśniające o co chodzi z main stack-iem i process stack-iem?

    Udało mi się znaleźć informacje, że jakieś informacje o stosie umieszczone są w pliku crt0.s. Zamieszczam fragment:

    Code:
      .section .init, "ax"
    
      .code 16
      .align 2
      .thumb_func

    _start:
      ldr r1, =__stack_end__
      mov sp, r1
    #ifdef INITIALIZE_STACK
      mov r2, #0xCC
      ldr r0, =__stack_start__
      bl memory_set
    #endif

    #ifdef USE_PROCESS_STACK
      /* Set up process stack if size > 0 */
      ldr r1, =__stack_process_end__
      ldr r0, =__stack_process_start__
      sub r2, r1, r0
      beq 1f
      msr psp, r1
      mov r2, #2
      msr control, r2
    #ifdef INITIALIZE_STACK
      mov r2, #0xCC
      bl memory_set
    #endif


    Czy gdzieś tutaj jest informacja o lokalizacji stosu? Gdzie mogę znaleźć dokumenty wyjaśniające budowę takich plików?

    Dziękuję za pomoc i pozdrawiam serdecznie
  • #8
    nsvinc
    Level 35  
    To jest zwykły asembler Thumb2. Jako że to jest rozbiegówka, to kod musi zapisać odpowiednie liczby w odpowiednie miejsca, i to jeszcze w odpowiedniej kolejności. Cały proces rozbiegania rdzenia CortexM3 jest dostępny w dokumentacji do CortexM3, którą można pobrać ze strony ARM. Ja tej procedury nie pamietam, bo nie jest mi to na codzień potrzebne ;]
  • #9
    golas17
    Level 16  
    Ok, dziękuję za odpowiedź.
    A gdzie znajdują się informacje na temat stosu? Jego lokalizacji. I co oznacza main stack i process stack? U mnie ten drugi jest ustawiony na 0. Chciałbym wiedzieć co to oznacza.