logo elektroda
logo elektroda
X
logo elektroda
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 2560 18
  • #1 8059790
    bolek
    Poziom 35  
    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
  • #3 8059859
    _Robak_
    Poziom 33  
    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  
    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  
    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  
    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;)
  • #7 8060370
    tadzik85
    Poziom 38  
    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.
  • #8 8060529
    bolek
    Poziom 35  
    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  
    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

  • #10 8060583
    _Robak_
    Poziom 33  
    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  
    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  
    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
    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  
    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  
    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  
    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  
    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  
    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  
    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.
REKLAMA