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

[Atmega168/328][C] Wykorzystanie pamięci Flash.

Linoge 21 Sty 2012 00:24 1332 4
  • #1 10426302
    Linoge
    Poziom 27  
    Witam,

    Chciałem wykorzystać pamięć Flash jako tymczasowy bufor dla danych np 8kB.

    Dane będą odbierane z Uarta,i2c lub SPI. Program do obsługi danych będzie zajmował przykładowo 6kB pamięci, więc nie ma szans by w pełni zmieścił się w sekcji bootloadera w całości. Rozumie iż funkcja zapisująca dane w pamięci aplikacji musi znajdować się w sekcji bootloadera w jaki sposób zmusić kompilator by ją tam umieścił ? W związku z tym również pozostałą część aplikacji chciałbym umieścić w znanym mi przedziale pamięci flash powiedzmy od 8k w góre jak czegoś takiego dokonać ?

    Z góry wielkie dzięki za pomoc :).
    D.
    ps. Dla dociekliwych dane nie będą za często nadpisywane i muszą mieć krótki czas odczytu.
  • #3 10426374
    Linoge
    Poziom 27  
    Chyba jest już późno bo nie widzę w podanym linku możliwość lokowania pod określonymi adresami danych, a jedynie możliwość odczytywania danych z pamięci Flash.
  • #4 10426853
    tmf
    VIP Zasłużony dla elektroda
    Po pierwsze twój pomysł jest raczej nietrafiony. FLASH zapisuje się stronami, co jest niewygodne do przechowywania danych przychodzących w pakietach innych niż wielokrotność strony. Ale co gorsze, ilość zapisów do FLASH jest ograniczona do około 10tys. Więc zupełnie nie nadaje się do przechowywania szybko zmieniających się danych. Już lepiej zastosuj jakiś zewnętrzny FRAM na I2C.
    Ale jeśli jednak chcesz to zrobić we FLASH to program umieścisz pod zadanym adresem przy pomocy sekcji, najlepiej fragment zapisujący do FLASH umieścić w osobnym programie (jako funkcję) i przesunąć sekcję .text tak aby była w obszarze bootloadera. Z programu głównego taką funkcję wywołasz poprzez wskaźnik (jej adres jest znany, bo sam go ustawiasz). Po kompilacji tej funkcji i programu głównego oba wynikowe hexy najłatwiej jest po prostu razem połączyć (ręcznie, lub korzystając z programu srecord) i takim wynikowym hexem zaprogramować procesor.
  • #5 10457977
    Linoge
    Poziom 27  
    Widzę ze kolega wyżej czytał dokładnie 1 pierwszy post :).

    Może się komuś przyda na przyszłość sekcję zapisująca dane przenosimy do zakresu pamięci przeznaczonego dla bootloadera
    void boot_program_page (uint32_t page, uint8_t *buf) __attribute__ ((section (".bootloader")));

    Oczywiście wcześniej trzeba zadeklarować odpowiednie obszary pamięci we właściwościach projektu.

    Jeśli chodzi o zdobycie adresu, pod którym można zapisywać dane poszedłem na łatwiznę deklarując w pamięci flash
    uint8_t flash_bufor[10000] PROGMEM;

    Odwołując się do jej adresu wyłuskałem następną przez nią zajętą stronę pamięci flash by przypadkiem nie nadpisać czegoś w programie. Numery już zajętych stron przechowuję w pamięci eeprom. Oczywiście należy pamiętać iż ostatniej strony pamięci również nie należy zapisywać danymi aby nie nadpisać programu.

    Zalety rozwiązania :
    - prostota układu 1 scalak !
    - prędkość działania :)
    Wady:
    - skomplikowany program :) ale czy to na pewno jest wada ? Raczej wyzwanie :)

    Może ktoś ma inny pomysł ?
REKLAMA