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

[ASM]AVRStudio i duże projekty

genetix 10 Gru 2008 09:56 2375 8
  • #1 5840789
    genetix
    Poziom 24  
    Problem jest następujący:

    Tworzę kilka projektów, które zawierają (oprócz specyficznych funkcji) blok kilku funkcji identycznych dla każdego z projektów. W skład tego bloku wchodzą funkcje, obsługa przerwań, wektory przerwań i definicje rejestrów, pól w DSEG, EESEG itp. W przypadku konieczności wprowadzenia poprawek w funkcjach wspólnego bloku zmuszony jestem modyfikować każdy projekt ręcznie - co niesie za sobą stratę czasu i możliwość przedostania się nowych, niekoniecznie pożądanych funkcjonalności (tzw. błędów:) )

    Istnieje co prawda możliwość wrzucenia części wspólnej kodu do pliku ASM i zrobienia .include, jednak to wyjście jest kulawe, gdyż:

    - w bloku funkcji muszę mieć zdefiniowane wektory przerwań używanych przez te funkcje. Uniemożliwia mi to definiowanie wektorów przerwań w głównym programie, gdyż wektory przerwań będą w pliku włączanym - którego nie chcę modyfikować dla każdego projektu inaczej.
    - blok funkcji używa konkretnych nazw rejestrów, konkretnych komórek RAM, co powinno być zdefiniowane w oddzielnym pliku. Pojawia się problem, gdy w głównym programie chcę dodefiniować jakiś obszar.
    - symulacja takiego kodu jest uciążliwa - AVR Studio nie przełącza widoku na okno w którym obecnie znajduje się wykonywany kod. Przez to, jak wywołuję funkcję, która jest w innym pliku muszę sam odnaleźć okno, w którym ona się znajduje - inaczej nie widać co się dzieje w procku.

    Czy ktoś stanął przed takim problemem? Jest jakieś wyjście?

    Na pierwszy rzut oka, fajne byłoby zbudować bibliotekę wkompilowywaną w cały projekt. Czy spotkał się ktoś z dodatkowymi narzędziami, współpracującymi z avrasm/avrasm2, które pozwalają na tworzenie bibliotek?

    (Jakby ktoś pytał: nie, nie da się tego napisać w C)

    Poprawiłem tytuł - regulamin p.11
    [zumek]
  • #2 5840840
    Dr.Vee
    VIP Zasłużony dla elektroda
    Spróbuj zapoznać się z asemblerem avr-as z pakietu avr-gcc (winavr?). Korzystając dodatkowo z linkera avr-ld oraz plików nagłówkowych możesz osiągnąć wszystko, o czym piszesz (nie wiem jak z symulowaniem - sądzę, że po konwersji do coff avrstudio powinien to łyknąć).

    Zapewne będziesz musiał pokombinować z kodem startup, jak coś to źródła są dostępne w paczce źródłowej avr-libc.

    Poczytaj tutaj: http://www.nongnu.org/avr-libc/user-manual/assembler.html
    http://www.nongnu.org/avr-libc/user-manual/using_tools.html

    Pozdrawiam,
    Dr.Vee
  • #3 5841437
    Dr_DEAD
    Poziom 28  
    Eeee no chyba AVR studio dostarcza odpowiednie dyrektywy (EXTERN, PUBLIC, DEFINE ......). Taka funkcjonalność jak dzielenie projektu na pliki a do nich pliki nagłówkowe z definicjami rejestrów wektorów przerwań i tym podobnych na pewno istniej. Sam pisze spore projekty w ASM (po kilkanaście, kilkadziesiąt kB) i dziele je na kilkanaście, kilkaset plików. Przy czym funkcje nie działające na hadrware przenoszę pomiędzy projektami bez żadnych zmian a w pozostałych najczęściej trzeba zmienić tylko plik nagłówkowy.
  • #4 5844067
    Konto nie istnieje
    Konto nie istnieje  
  • #5 5861448
    genetix
    Poziom 24  
    Dr_DEAD napisał:
    Eeee no chyba AVR studio dostarcza odpowiednie dyrektywy (EXTERN, PUBLIC, DEFINE ......). Taka funkcjonalność jak dzielenie projektu na pliki a do nich pliki nagłówkowe z definicjami rejestrów wektorów przerwań i tym podobnych na pewno istniej. Sam pisze spore projekty w ASM (po kilkanaście, kilkadziesiąt kB) i dziele je na kilkanaście, kilkaset plików. Przy czym funkcje nie działające na hadrware przenoszę pomiędzy projektami bez żadnych zmian a w pozostałych najczęściej trzeba zmienić tylko plik nagłówkowy.


    OK, kwestia rozdziału soft- od hardware jest jasna i wiadomo, że się da.

    Problem polega na tym, że w dwóch plikach muszę mieć dostęp do tych samych zasobów:

    1. wektory przerwań
    2. obszar RAM
    3. Stałe we FLASH-u
    4. definicje nazw rejestrów
    5. stałe .equ

    w efekcie każdy z plików musi zawierać kilkanaście dyrektyw .org, które w dodatku nie mogą na siebie zachodzić. Gdy projekt się rozrośnie jeszcze bardziej, na bank się w tym pogubię. a jak wiadomo błędy organizacyjne popełnione na początku projektu z czasem stają się niemożliwe do wyeliminowania bez przepisania całego kodu na nowo.
  • #6 5861590
    Dr_DEAD
    Poziom 28  
    genetix napisał:

    Problem polega na tym, że w dwóch plikach muszę mieć dostęp do tych samych zasobów:

    1. wektory przerwań
    2. obszar RAM
    3. Stałe we FLASH-u
    4. definicje nazw rejestrów
    5. stałe .equ

    w efekcie każdy z plików musi zawierać kilkanaście dyrektyw .org, które w dodatku nie mogą na siebie zachodzić. Gdy projekt się rozrośnie jeszcze bardziej, na bank się w tym pogubię. a jak wiadomo błędy organizacyjne popełnione na początku projektu z czasem stają się niemożliwe do wyeliminowania bez przepisania całego kodu na nowo.

    Chyba już wiem na czym polega Twój problem. Powinieneś zacząć pisać kod w pełni relokowalny i korzystać z segmentów. Dyrektywy .org używaj tylko w przypadku wektora przerwań, a zmienne w Ramie i stałe we Fleshu pozwól układać kompilatorowi tam gdzie mu się podoba (to znaczy tam gdzie ma miejsce).
    A zamiast defniować nazwy rejestrów zacznij pisać funkcję tak aby pozostawiały wszystkie wartości rejestrów CPU z takimi wartościami z akimi je zastała. Wtedy możesz jedne funkcje wywoływać z innych funkcji w różnych miejscach kodu i się kompletnie nie przejmować tym która jakie rejestry wykorzystuje.
  • #7 5861871
    genetix
    Poziom 24  
    Dr_DEAD napisał:
    Powinieneś zacząć pisać kod w pełni relokowalny i korzystać z segmentów.


    Możesz mi przybliżyć kwestię segmentów? Nie spotkałem się z tym w assemblerze...
  • #8 5861952
    Dr_DEAD
    Poziom 28  
    genetix napisał:

    Możesz mi przybliżyć kwestię segmentów? Nie spotkałem się z tym w assemblerze...

    Na pewno słyszałeś o takich segmentach jak DATA, CODE, CONSTANT... Segmenty możesz też sobie sam podefniować tak jak Ci się podoba i ile ich potrzebujesz. I teraz na przykład zmienne umieszczasz w segmencie DATA za pomocą etykiety i rezerwacji miejsca:
    
    Dana1    DS8    0x12
    Dana2    DS8    0x0A
    

    w AVR Studio to chyba wygląda tak:
    
    Dana1     .db    0x12
    Dana2     .db    0x0A
    

    Może nie potrzebnie to tłumacze bo to zdaje się u Cebie nazwa się Sekcją i pewnie wiesz o co chodzi.....
    W każdym razie tak samo postępujesz ze stałymi. I jak widzisz nie ma tu żadnych adresów i nic na siebie nie nachodzi. Linker układa takie zmienne jedna za drugą a odwołujesz się do nich za pomocą etykiet.
  • #9 5862156
    genetix
    Poziom 24  
    A, jasne, zgadza się :-)
REKLAMA