logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Dlaczego wartości zmiennych same ulegają zmianie? Mikrokontroler: EFM8BB10F8G.

krzysssztof 18 Lis 2017 11:26 1308 11
  • #1 16831512
    krzysssztof
    Poziom 21  
    Hej,

    Mikrokontroler: EFM8BB10F8G, czyli taki 8051 "na sterydach"
    Język programowania: C
    Kompilator: Keil 8051 v9.53

    Taki problem: Tworzę zmienne, przypisuję im jakieś wartości. Po pewnym czasie wartości zmiennych ulegają zmianie pomimo tego, że nie wykonuję na nich operacji.

    Przypuszczenia:
    Mapa pamięci RAM mikrokontrolera wygląda następująco:
    Dlaczego wartości zmiennych same ulegają zmianie? Mikrokontroler: EFM8BB10F8G.
    W trakcie debugowania zaobserwowałem, że zmienne są alokowane w pamięci od adresu 0x00, czyli niby w porządku. Tyle tylko, że pierwsze 32 bajty RAMu są używane jako rejestry ogólnego przeznaczenia (4 banki rejestrów R0-R7)
    Podczas wykonywania innych fragmentów kodu kompilator bez zahamowań korzysta właśnie z tych rejestrów i nadpisuje zmienne...


    Jak sobie z tym poradzić?
  • #3 16832106
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #4 16832150
    tronics
    Poziom 38  
    @R-MIK, krzysssztof - zarówno Keil jak i SDCC dla C51 mają określone standardy umiejscowienia określonych danych w określonych rodzajach pamięci. Model pamięci SMALL oznacza, że dane, stos itp. będą trzymane w pierwszych 128B pamięci, czyli także tam gdzie 4 zestawy rejestrów oraz SFR. I trzeba się z tym liczyć nawet jeśli pamięć "zewnętrzna" jest dostępna. Jeśli chcemy by zmienna przy stosowaniu tego modelu trafiła do tej większej (ale z reguły wolniejszej) pamięci to musimy ją odpowiednio zadeklarować, jeśli chcemy globalnie działać w wolniejszym trybie z większą pamięcią to należy wybrać globalnie model pamięci LARGE, a jeśli chcemy tylko by określone funkcje pamięciożerne korzystały z rozszerzonej pamięci to też w tym manualu jest wszystko wyjaśnione... należy go po prostu spokojnie ze zrozumieniem przeczytać.
  • #5 16832158
    JacekCz
    Poziom 42  
    R-MIK napisał:
    ...Jak zadeklarowałeś te zmienne, które sa nadpisywane?


    keil, czy nie keil, bez kodu to wszyscy tu możemy szklane kule pocierać. Wróżka ma nieczynne, a '51 z punktu widzenia C intuicyjne nie jest.
  • #6 16832690
    tronics
    Poziom 38  
    Cytat:
    Tak samo jak AVR czy PIC i inne, które maja architekturę hardwardzką, a nie von Neumanna

    Yhm... no zaraz, momencik... w C51 pierwsze 128B jest adresowalne bezpośrednio (czyli każda komórka jest niczym rejestr), kolejne 128B w przypadku 8052, 8053 i podobnych jest adresowalne pośrednio (indirect). Reszta ewentualnego SRAM jest traktowana jako pamięć zewnętrzna (spuścizna oryginalnego rdzenia) i operacje na niej wymagają MOVX. Czy z poziomu kompilatora AVR również ma takie niespodzianki w RAM? Albo PIC? 8051 jest dość specyficzna, pisanie w C też jest specyficzne. Z tego co po wpisaniu frazy EFM8BB10F8G wyczytałem najsłabszy model ma pamięć jak 8052 (czyli 128B direct, 128B indirect), a najmocniejszy oprócz tego 256B XRAM. W tym konkretnym przypadku podejrzewam przepełnienie stosu, co w sumie nawet z kodem jest tylko "zgadywaniem", a bez kodu już zupełnym wróżeniem z fusów.
  • #7 16837307
    krzysssztof
    Poziom 21  
    Z podanego w 2 poście linku poczytałem o adresowaniu i dostępie do pamięci, problem rozwiązałem.
    Dzięki.
  • #8 16838721
    JacekCz
    Poziom 42  
    krzysssztof napisał:
    Z podanego w 2 poście linku poczytałem o adresowaniu i dostępie do pamięci, problem rozwiązałem.
    Dzięki.


    Jest dobrym zwyczajem forów pomocowych, podać choćby zarys rozwiązania. To forma wdzięczności dla tych, co sie wystrzeliwali z amunicji.
  • #9 16838846
    Konto nie istnieje
    Konto nie istnieje  
  • #10 16838900
    Konto nie istnieje
    Poziom 1  
  • #11 16838934
    Konto nie istnieje
    Konto nie istnieje  
  • #12 16839059
    tronics
    Poziom 38  
    Rzecz w tym, że podziękował zaznaczając również, że problem rozwiązał studiując uważnie dokumentację kompilatora, do którego link podałem. Szczerze? Mnie wystarczy zwykłe dziękuję, żadne "pomógł" i plusiki. Te są takie... bez emocji. Zimne, sztuczne. "Dziękuję" od autora jest bezpośrednim okazaniem wdzięczności za pomoc.
REKLAMA