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

[ATmega 8A][C] Skorzystanie z pamięci NRWW jaki pamięci programu

Myrek1 09 Lip 2012 12:15 2204 26
  • #1 11086518
    Myrek1
    Poziom 23  
    Witam,
    Jak można skorzystać z dodatkowej pamięci bootloadera NRWW w Atmedze (oczywiście po jej uwolnieniu przez zmniejszenie przestrzeni bootloadera przez bezpieczniki), żeby móc z niej skorzystać jako pamięci programu? Chodzi o to, żeby AVRStudio 4 widział tą pamięć i dobrze liczył zajętość programu. Próbowałem z ustawieniem przestrzeni bootloadera w ustawieniach projektu, ale nic się nie zmieniało.
    Po prostu nie korzystam z bootloadera, a dodatkowe miejsce zawsze by się przydało. Na forum nic o tym nie ma.
    Dzięki.
  • #2 11086657
    Krauser
    Poziom 26  
    Jak nie korzystasz z bootloadera to całe 8kB masz na aplikację. Jak używasz bootloader to przestrzeń ta się zmniejsza. Jednym zdaniem nic nie rób, bo nie musisz.
  • #3 11087337
    Myrek1
    Poziom 23  
    No ale jak w tej chwili w kompilatorze (AVR Studio 4 + gcc) mam zajętość proca 99,9% i wg Ciebie to już z dostępną pamięcią NRWW, to skąd on wie, że ten obszar jest pusty (nie ma tam "bota")? Dodatkowo mam ustawione bity bootloadera standardowo, czyli 0,0 (1024 words), więc wychodzi na to że program mimo prawie całej zajętości pamięci programu zostawia jeszcze miejsce na bootloadera o długości 1024.
    Jeśli nie to wyszło by na to, że mając w tej chwili bootloadera, który zajmuje całą pamięć NRWW, to mój program o zajętości 99,9% by się nie zmieścił?
    Dziwne to trochę ;-)

    Dzięki
  • #4 11087392
    Konto nie istnieje
    Poziom 1  
  • #5 11087399
    Myrek1
    Poziom 23  
    Proszę:

    Cytat:
    Program: 8182 bytes (99.9% Full)
    (.text + .data + .bootloader)

    Data: 715 bytes (69.8% Full)
    (.data + .bss + .noinit)


    Niedaleko do 8192b (Atmega 8A)
  • #6 11087443
    Konto nie istnieje
    Poziom 1  
  • #7 11087465
    tmf
    VIP Zasłużony dla elektroda
    Nic nie musi zmieniać. Do wyświetlania zajętości pamięci AS4 wykorzystuje program avr-size, on nie uwzględnia wielkości bootloadera, bo nic o niej nie wie. Dla tego programu M8 ma po prostu 8192 bajty pamięci i tyle. Twój program ma 8182, a więc zajęte jest tak jak podaje 99,9%. Zostało ci 10 wolnych bajtów.
    Bootloader to nie żadna dodatkowa pamięć, te bity o których piszesz wskazują na początek bootloadera i nic ponad to.
  • #8 11087490
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #9 11087657
    tmf
    VIP Zasłużony dla elektroda
    Ale ona nie ma żadnego zastosowania dla w/w przypadku, gdyż kolega nie korzysta z bootloadera. Aplikacja może wejść w obszar zarezerwowany na bootloader bez konsekwencji. Jak pisałem, avr-size nie ma informacji o wybranym ustawieniu fusebitów i zawsze liczy zajętość programu przyjmując maksymalną ilość pamięci FLASH dla danego MCU.
  • #10 11087733
    Konto nie istnieje
    Poziom 1  
  • #11 11087749
    Konto nie istnieje
    Poziom 1  
  • #12 11087773
    Konto nie istnieje
    Poziom 1  
  • #13 11087860
    Konto nie istnieje
    Poziom 1  
  • #14 11087878
    Konto nie istnieje
    Poziom 1  
  • #15 11088082
    tmf
    VIP Zasłużony dla elektroda
    Kolego, ale my tu nie gdybamy, tylko ci piszemy jak jest, bo to wiemy. Jeśli nam nie ufasz to sobie zrób testy i nam powiedz jak ci wyszło.
    Fusebity określają początek bootloadera, a dokładniej adres wektora reset i potencjalnie IVT. I to tyle. Żadnej magii w tym nie ma. M8 ma jedną pamięć o pojemności 8 kB i to programista jeśli wykorzystuje bootloader musi się martwić aby go nie nadpisać. AVR Studio nie ma nic do tego, bo niby skąd ma wiedzieć, że ty w ogóle bootloader wykorzystujesz? Po fusebitach? Przecież często są one określane zupełnie niezależnie od aplikacji, ba, w przypadku korzystania z bootloadera aplikacja w ogóle nie ustawia fusebitów, bo to się robi jednorazowo przy wgrywaniu bootloadera.
    Poza tym przy 8 kB kodu binarnego, z pewnością coś da się zoptymalizować, tak, żeby te 10-20% pamięci wygospodarować, więc przesiadka nie jest przesądzona.
  • #16 11088140
    Myrek1
    Poziom 23  
    To w takim razie wszystko jasne. Wniknąłem bardziej w organizacje pamięci i faktycznie cały flash, łącznie z NRWW to te 8kB. Czyli to co wypisuje avr-size ma zastosowanie tylko w przypadku braku bootloadera, a "fusy" jego dotyczące nie mają nic do pamięci, określają tylko gdzie zaczyna się ewentualny bootloader dla RESETu w przypadku jego wywołania.
    To takie podsumowanie.

    Ok, a czy można zmusić avr-size do odliczenia wartości jaką zajmuje ewentualny bootloader od kodu użytkownika, czy trzeba samemu obliczyć, że np 75% zajętości to max, bo ewentualny bootloader zajmuje 2kB (pozostałe 25%)? To takie "kosmetyczne" pytanie.

    Dzięki.
  • #17 11088172
    Konto nie istnieje
    Poziom 1  
  • #18 11088201
    Myrek1
    Poziom 23  
    No tak, ale zapomniałeś o takim bezpieczniku jak "Boot reset vector enabled" Po jego aktywacji, po resecie proc leci pod adres wskazany przez bezpieczniki bootloadera.
    A aplikacja faktycznie nie zna ustawień bezpieczników, bo robi się to przy okazji programowania flasha (osobno).
  • #19 11088216
    Konto nie istnieje
    Poziom 1  
  • #20 11088435
    tmf
    VIP Zasłużony dla elektroda
    Fusebit BOOTRST określa czy procesor ma startować z aplikacji czy z kodu bootloadera. Dla aplikacji wektor RESET zawsze ma adres 0 i nie ma problemu. Natomiast dla bootloadera położenie wektora RESET określają fusebity BOOTSZ, ot cała filozofia - de facto fusebit BOOTRST możesz traktować jako dodatkowy fusebit BOOTSZ, w efekcie wszystkie 3 określają miejsce startu MCU - 0x0, 0xc00, 0xe00, 0xf00, 0xf80 i zapomnieć o czymś takim jak bootloader. To czy dalej będzie kod aplikacji czy bootloadera to tylko kosmetyka. Nic nie stoi na przeszkodzie, żeby np. wektor RESET ustawić na 0xC00, po czym umieścić część aplikacji, a kod bootloadera wsadzić od 0xF00. Będzie to dziwaczne rozwiązanie ale możliwe.

    Myrek1 - niestety avr-size ma na stałe wszyte wielkości dostępnej pamięci, ale masz podaną zajętość, operację wyliczenia wolnego obszaru możesz przeprowadzić myślowo :) Poza tym skoro ktoś wykorzystuje bootloader to:
    1. Wczytuje aplikację przy pomocy bootloadera, który powinien sprawdzać co wczytuje i odmówić zniszczenia bootloadera (przed tym zresztą można się sprzętowo zabezpieczyć),
    2. Wczytujesz na raz i aplikację i bootloader - ale jeśli app najdzie na BL to linker zacznie malkontencić, bo mu segmenty będą na siebie nachodzić i ci takiej aplikacji nie skompiluje.
  • #21 11088489
    Konto nie istnieje
    Poziom 1  
  • #22 11088547
    excray
    Poziom 41  
    Wtedy trafi na kod maszynowy 0xFFFF który stanowi dla niego jakiś rozkaz niejawny i procesor będzie wykonywać ten kod aż przeładuje sobie PC i tafi pod adres 0x0000 gdzie znajdzie skok do programu.
  • #23 11088596
    Konto nie istnieje
    Poziom 1  
  • #24 11088636
    tymon_x
    Poziom 30  
    MArSTER_1 napisał:
    "Wtedy trafi na kod maszynowy 0xFFFF który stanowi dla niego jakiś rozkaz niejawny.."

    Myślisz, że twórcy rozkazów do ATmegi nie przewidzieli takiego przypadku?

    Studenci ? Nie.

    Niektórzy twórcy wolą omijać, część zgłasza wyjątek. Nie ma specjalnego przypadku, każda wartość inna niż zdefiniowany opcode ląduje w others czy default, jeszcze nie spotkałem się z przypadkiem żeby robić wyjątek dla 0xFFFF, bo po co ?
  • #25 11088863
    tmf
    VIP Zasłużony dla elektroda
    MArSTER_1 napisał:
    "Fusebit BOOTRST określa czy procesor ma startować z aplikacji czy z kodu bootloadera."

    Gdybyż to była prawda...
    A co stanie się jesli ustawimy ten Fusebit a nie będzie BootLoadera?


    Zaczynasz trolować. Zrozum, że dla procesora jest bez znaczenia co mu do pamięci załadujesz, czy tam będzie bootloader, czy nie. To zmartwienie programisty, aby pod wskazanym adresem był właściwy kod, a nie śmieci.
  • #26 11089828
    Konto nie istnieje
    Poziom 1  
  • #27 11089850
    Myrek1
    Poziom 23  
    Dobra, wszystko zostało wyjaśnione, a od pewnego czasu wszyscy powtarzamy to samo, tylko w innej formie.
    Dziękuję za konstruktywną dyskusję i temat zamykam.
REKLAMA