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

Deklaracja adresów SFR we Flashu i podawanie ich funkcji czytającej z Flasha

robiw 22 Wrz 2021 22:11 615 10
  • #1 19622044
    robiw
    Poziom 26  
    Hejka,
    Piszę zupełnie z głowy, bo nie mam przed sobą kompilatora. Dajmy na to, mamy funkcję:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A teraz, gdyby to samo zakodować we Flashu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Mogłem coś pominąć, bo piszę bez sprawdzania w kompilatorze... ale da się tak? Tzn. wiem, że musi się dać tylko pytanie o sposób zapisu? Chodzi o to by deklaracje adresów SFR trzymać we Flashu i podawać je funkcji, która czyta z Flasha. Prośba o ewentualne poprawienie. Z góry dzięki... R
  • #2 19622180
    excray
    Poziom 41  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 19622226
    robiw
    Poziom 26  
    Hej,
    Nie no chyba nie wyraziłem się jasno. To co podałeś to oczywiście banał i nie trzeba by korzystać nawet z makra. Funkcje podałem, jako przykładowe...chodzi mi o funkcję, która operuje na rejestrze procesora, ale adres tego rejestru podany jest jako parametr funkcji z pamięci Flash... R
  • #4 19622280
    excray
    Poziom 41  
    robiw napisał:
    chodzi mi o funkcję, która operuje na rejestrze procesora, ale adres tego rejestru podany jest jako parametr funkcji z pamięci Flash..

    Dokładnie tak jest tutaj:
    Deklaracja adresów SFR we Flashu i podawanie ich funkcji czytającej z Flasha
    Adres jak widać zostaje wczytany z flash. Co prawda odczyt danych z flash jest połączony z komendą IN, co powoduje, że staje się on 2-bajtowy, ale za to jak szybko. Rekord świata w szybkości pobrania z flash. A tak serio to zastanawiam się po co utrudniasz sobie życie i jaki widzisz sens swojego przedsięwzięcia. Dołóż sobie do tej funkcji tablicę z adresami we flash:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    i masz wszystko we flash. A to, że adres zostanie przekazany jako bezpośrednia wartość, a nie wskaźnik - jaki to ma sens? Poza tym, że ten drugi sposób będzie wielokrotnie wolniejszy i bardziej pamięciożerny? Czasami jednak warto spojrzeć w assembler.
  • #5 19622694
    robiw
    Poziom 26  
    Hej,
    Ale makro _SFR_IO8 operuje na wskaźniku do pamięci a Ty mu podajesz stałą z pamięci Flash, w takim razie jak to działa? Hmm, chociaż z drugiej strony ta stała to pozycja w pamięci, więc makro zmienia wartość spod tej pozycji pamięci, tak?

    Ale czy można to zrobić bez tego makra w taki sposób, w jaki opisałem w funkcji FooFlash? Dodatkowo do definicji tablicy używasz named spaces, nie chcę tego robić...mam silne przyzwyczajenie do pgm_read_byte itd ;-).

    Przy definicji adresów używasz ponadto zapisu (uint8_t *) (&PORTB). Czy nie wystarczy samo &PORTB pobierające adres lub nawet samo PORTB, skoro jego definicja to PORTB _SFR_IO8 (0x05).

    A po co sobie utrudniam. Mam kilka switchy podłączonych do różnych portów, a więc mają różne PORTx, PINx itp. Chiciałbym by funkcja operowała na tablicy tych adresów zapisanej we Flashu i wtedy łądnie w pętli "przelatuję" sobie po poszczególnych portach korzystając z tej tablicy zamiast na piechotę odczytywać każdy osobną linią. To uprości program. Ta funkcja zapisuje i odczytuje z portów PORTx, PINx (tylko odczyt oczywiście)...R

    Dodano po 7 [godziny] 49 [minuty]:

    excray napisał:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Sprawdziłem w symulatorze to, co zaproponowałeś powyżej. Nie działa:

    Deklaracja adresów SFR we Flashu i podawanie ich funkcji czytającej z Flasha
  • #6 19623802
    excray
    Poziom 41  
    Działa, tylko musisz podać właściwy adres. Jako parametr funkcji podaj adres w pamięci rejestru, zamiast jego nazwy, tak jak masz tutaj:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Może trochę niefortunnie podsunąłem Ci przykład z nazwami, ale to... eeee... sprawdzałem Twoją czujność.
  • #8 19624322
    robiw
    Poziom 26  
    excray napisał:
    Działa, tylko musisz podać właściwy adres. Jako parametr funkcji podaj adres w pamięci rejestru, zamiast jego nazwy


    To niezbyt wygodne i raczej dyskwalifikuje to rozwiązanie. Musze podawać adres w postaci liczby skoro pod symbolami rejestrów znajdują się ich adresy w IO?

    ex-or napisał:
    volatile uint8_t * __flash const


    Żeby używać named spaces i __flash trzeba dodać jakiś plik nagłówkowy? Pytam, bo u mnie nie widzi tego makro. Microchip Studio. Wolałbym użycie z PROGMEM... Pozdrowienia... R
  • #9 19624645
    ex-or
    Poziom 28  
    W XC8 niby działa zarówno __flash, __mmx oraz atrybut programem jak i same const: https://microchipdeveloper.com/xc8:xc8-avr-read-only-objects. Jeśli chodzi o GCC to potrzebna jest stosunkowo nowsza wersja, 4.9 czy tam 4.7 w górę. Co tam trzeba włączyć w Microchip Studio nie wiem, nie używam.
    Wracając do kodu -funkcja bez _SFR_IO bo jest już w nazwach rejestrów
    ex-or napisał:
    void SFR(volatile uint8_t *sfx)
    {
    *sfx = 0x55;
    }
  • #10 19624711
    robiw
    Poziom 26  
    ex-or napisał:
    W XC8 niby działa zarówno __flash, __mmx oraz atrybut programem jak i same const:


    Tak, czytałem o tym. Niestety w moim Microchip Studio czy Eclipse to nie działa. Tymczasem sprawdziłem działającą wersję z tablicami w RAM, jak niżej:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jak to skutecznie przenieść w świat PROGMEM już się pogubiłem...R
  • #11 19624866
    ex-or
    Poziom 28  
    Pisane z głowy czyli z niczego czyli pewnie źle:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA