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

[C] adresowanie pośrednie, konkretna lokalizacja zmiennej

bolek 10 Maj 2010 19:44 2764 18
REKLAMA
  • #1 8059790
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    Witam
    Zaczynam dopiero zabawe z C i AVR i męcza mnie dwie sprawy których nie mogę sie doczytać.

    1. Jak zorganizować bufor?
    Czyli np odbieram coś z UARTA i chce to umieścić w konkretnym miejscu w ramie
    W 51 i ASM wyglądało by to mniej więcej tak

    
    MOV R0, ADRES
    MOV @R0, SBUF
    INC R0
    MOV ADRES, R0
    


    2. Jak wpłynąc na to aby kompilator umieszczał zmienne w wymaganych przezemnie adresach, lub luźno zdeklarowanych nie umiescił mi np w buforze.

    3. Jak zmusić AVR studio aby podczas symulacji pokazywał zawartość RAMu/zmiennych
  • REKLAMA
  • #3 8059859
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    Generalnie kompilator dba o to aby adresy się nie nie nakładały, i o ile nie masz ku temu powodu, to adresy pozostaw kompilatorowi:)
    Wartość zmiennych natomiast możesz podejrzeć w okienku watch, ramu chyba się właśnie nie da:(Edit: tadzik85, a jednak się da, człowiek uczy się całe życie;]
  • #4 8059862
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    1. Zainteresuj się tablicami i wskaźnikami.
    2. jw
    3. Sekcja data (memory window) poza tym i tak będziesz podglądać konkretne zmienne wiec watch window.
  • #5 8060347
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    ok, w takim razie jak "zabrać" kompilatorowi kawałek ramu po to aby mi tam nie wjechał i jak wpiswać do niego wartości względem zmiennego adresu
  • #6 8060369
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    Może powiedz co chcesz osiągnąć? Albo może nie osiągnąć bo to wiemy, tylko co chcesz zrobić?:) Na pewno da się to uzyskać bez takich kombinacji;)
  • REKLAMA
  • #7 8060370
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Ale po co ci zmienny adres w C? Ram przydzielany jest zadeklarowanym zmiennym, które mogą mieć rożny zasięg i sposób deklaracji. Istnieje coś takiego jak tablica. Struktura. Można też tworzyć własne typy. A to wszystko wystarczy ci aż nadto.
  • REKLAMA
  • #8 8060529
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    Wybaczcie, może źle opisuje sprawe ze względu na nabyte zboczenia.

    Musze odebrać kilkadziesiąt bajtów z UARTa, sprawdzić czy dotarły w całości i przepisać je w inne miejsce do dalszej obróbki.
    Potem np te dane (kolejno) przesyłam do perferii
  • #9 8060564
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    tablica o rozmiarze n i masz twój upragniony bufor; nie jest ci do tego potrzebny bufor kołowy.

    char tablica[rozmiar];


    do elementów konkretnych odnosisz sie poprzez

    , gdzie index jest zmienną

    lub przez wskaźnik

  • REKLAMA
  • #10 8060583
    _Robak_
    Poziom 33  
    Posty: 2209
    Pomógł: 231
    Ocena: 29
    Jeśli nie będziesz używać DMA, a zapewne nie będziesz;), to miejsce w pamięci powinno Cię guzik obchodzić.
    Potrzebujesz bufora cyklicznego, możesz wzorować się na moim rozwiązaniu
    https://www.elektroda.pl/rtvforum/topic1327746.html
    Potem dane z bufora możesz przerzucić do innej tablicy i z niej pobierać dane do peryferii, bądź bezpośrednio z bufora.
  • #11 8060642
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Bufor kołowy przydaje się gdy jednocześnie wykorzystujesz dane odbierane i odbierasz, dzięki czemu obsługa odebranej danej może trwać dłużej niż czas do odebrania kolejnej. Ty o ile dobrze rozumiem chcesz odebrać całą paczkę danych i wówczas poddać je odróbce wobec czego wystarczy ci klasyczny bufor.
  • #12 8178326
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    Ok, nieco się dokształciłem, jednak tablice nie dają mi żyć. Nie ma sensu wklejać moich wypociń, więc wolał bym się zdać na jakieś proste przykłady z waszej strony

    założenie jest takie:

    Tablica (będzie ich więcej, ale w celach dydaktycznych wystarczy jedna), która zwiera tekst dla LCD. Znacznikiem końca niech będzie wartość 128. Tekst może być rozdzielony jakaś wartością "nie ASCI", np po to aby z CG RAMu wywołać polski znak.


    Drugi typ tablicy to bufor dla wyświetlacza. Chodzi o to aby program wpisywał mi do tego buforu różne rzeczy, a procedura wyświetlacza co jakiś czas będzie pobierała z niego obraz do wyświetlenia. Docelowo potrzebuje długość 33 bajtów. Wpisy musze robić tak aby mieć możliwość wyboru miejsca początkowego.
  • #13 8178501
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Myślę, że czas kupić jakąkolwiek książkę o c i już w początkowych rozdziałach znajdziesz odpowiedzi na swoje pytania. Przykro mi, ale problem, który opisujesz wymaga pewnej podstawowej wiedzy i nie ma sensu pisać o tym na forum. Tym bardziej, że oprócz bufora na znaki, co jest bardzo proste, potrzebujesz wykorzystać kilka innych mechanizmów sygnalizujących np. gotowość danych itd. Także bez podstaw c i tak tego nie ruszysz.
  • #14 8179016
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    Bez przesady, nie ma co robić ze mnie muła. Gdybym nic nie czytał to bym nawet nie pytał. Przykłady pobierania danej z tablicy i wysyłania ich printem jakoś nie są pomocne. Próby ożenienia tablic z innymi rozkazami jakoś sie nie powiodły.

    Ewentualnie sam zaproponuj lekturę gdzie wszystko jest ładnie opisane żeby tutaj w ogóle o nic nie pytać, może nawet z uwzględnieniem AVRór lub podobnych.
  • #15 8179116
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    bolek napisał:
    Tablica (będzie ich więcej, ale w celach dydaktycznych wystarczy jedna), która zwiera tekst dla LCD. Znacznikiem końca niech będzie wartość 128. Tekst może być rozdzielony jakaś wartością "nie ASCI", np po to aby z CG RAMu wywołać polski znak.
    Tu kombinujesz dobrze jednak w C każdy string (tablica zawierająca tekst zawsze zakończona jest wartością '0'. Zwykle nie podaję się rozmiaru takiej tablicy. Kompilator sam dobierze odpowiedni.

    bolek napisał:
    Drugi typ tablicy to bufor dla wyświetlacza. Chodzi o to aby program wpisywał mi do tego buforu różne rzeczy, a procedura wyświetlacza co jakiś czas będzie pobierała z niego obraz do wyświetlenia. Docelowo potrzebuje długość 33 bajtów. Wpisy musze robić tak aby mieć możliwość wyboru miejsca początkowego.
    Jeśli mowisz o wyświetlaczu LCD zwykle się tego nie robi. A jeśli mowa o innym zastosowaniu wystarczy tablica o długości 33. Resztę załatwisz odpowiednim indeksowaniem.

    I to odniosę się do tematu. Index tablicy to inaczej właśnie adresowanie pośrednie, W C wygodne jest to ze kompilator sam o wszystko dba. nie ważne jakiego typu zmienna to będzie 8 czy 16-bitowa. ciebie to nie interesuje lecz kompilator zrobi tak by bylo dobrze ;). Tzn sam odpowiednio zwiększa lub zmniejsza adres pośredni[/code]
  • #16 8180509
    bolek
    Poziom 35  
    Posty: 4099
    Pomógł: 86
    Ocena: 299
    33 bajty dlatego że jeden bajt to wskaźnik pozycji dla migającego kursora (wskazanie edytowanego parametru)

    Jeśli tablica będzie kończyć się zerem to odpada mi jeden cenny znak z CGRAMu. Jeśli mam znak końca tablicy to jej długość mnie nie interesuje i nie ma sensu jej wskazywania(co jest z resztą oczywiste i C robi to automatycznie).
    Wiem że lepiej od razu wpisać dane do LCD, ale w pewnym przypadku musze tak umieć zrobić. Tak że ponawiam prośbę o jakieś pzykładowe kody w tym stylu.
  • Pomocny post
    #17 8180543
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Wcale ci nie odpada. Bo jak mówiłem każdy string i tak kończy się zerem.

    A widzę za za dużo zaczynam teoretyzować i kombinować. Weź jakiś kurs przykłady i je realizuj bo inaczej do niczego nie dojdziesz.
  • #18 8180625
    utak3r
    Poziom 25  
    Posty: 741
    Pomógł: 60
    Ocena: 5
    Poczytaj o:
    memset, strncpy, o wskaźnikach...
    I jednak ja również odsyłam jednak do książek, bo po przeczytaniu tego, co chcesz, nadal nie widzę, z czym możesz mieć ewentualny problem. Naprawdę tego nie unikniesz. Ewentualnie skonkretyzuj pytanie, zawęź je do jakiegoś fragmentu kodu, z którym masz problem, bo na tak postawione pytanie, można odpowiedzieć tylko gotowcem....
  • #19 8181391
    PO.
    Poziom 20  
    Posty: 527
    Pomógł: 11
    Ocena: 15
    String nie musi kończyć się zerem jeśli mamy stringi o jednej stałej długości, którą znamy i obrabiamy je wtedy w całości zawsze.
    Wskaźnik do kursora możesz sobie zawsze zrobić osobno.

Podsumowanie tematu

✨ W dyskusji poruszono kwestie związane z programowaniem w języku C na platformie AVR, szczególnie w kontekście zarządzania pamięcią RAM oraz buforami. Użytkownik pyta o organizację bufora do odbioru danych z UARTa, umieszczanie zmiennych w określonych adresach pamięci oraz monitorowanie zawartości RAMu w AVR Studio. Odpowiedzi sugerują wykorzystanie tablic i wskaźników do zarządzania danymi, a także wskazują na możliwość podglądu zmiennych w oknie watch. Użytkownicy podkreślają, że kompilator automatycznie zarządza adresami pamięci, a dla bardziej zaawansowanych zastosowań zalecają naukę podstaw programowania w C oraz korzystanie z książek i kursów.
REKLAMA