Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 7 sty 2025, o 19:24


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 29 sie 2016, o 13:33 
Offline
Nowy

Dołączył(a): 08 wrz 2014
Posty: 13
Pomógł: 0

Witam. Ostatnio zacząłem pisanie programu do komunikacji po spi. Na i w ramach nauki asm użyłem kilku wstawek, no i wszystko fajnie tylko pojawił się taki problem: z poziomu asm chciałbym uzyskać dostęp do zmiennej (chociaż do adresu) zadeklarowanej w c. Asm niby posiada .byte ale dostęp do zmiennej jest dwustronny, a tak w ogóle chciałbym żeby zmienna ta była deklarowana z poziomu c. Z tego powodu chce prosić o pomoc.
Próbowałem tak:
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

no ale oczywiście dostawałem error. Nie widzi mi się kompilować szukać jaki adres ma ta zmienna a następnie "na żywca" przepisywać tą wartość do asm co dało by nie czytelny, zmasakrzony kod.
Reszta wygląda tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


No i mam jeszcze jedno pytanie czy taka zmienna powinna byś volatile?

Edit. Zapomniałem dodać asm pisze w osobnym pliku .s.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2016, o 19:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 wrz 2014
Posty: 1530
Lokalizacja: Warszawa
Pomógł: 55

Po mojemu to w pliku .s
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Pamiętaj o zasadach używania rejestrów - musza się zgadzać z asemblerem.
Dużo i mądrze jest tu:
http://www.atmel.com/images/doc42055.pdf

_________________
--... ...-- - --- -- . -.-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 sie 2016, o 19:31 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

wojakin napisał(a):
Edit. Zapomniałem dodać asm pisze w osobnym pliku .s.

Jeśli chcesz miksować kod C oraz ASM, to powinieneś raczej użyć pliku z rozszerzeniem *.S (duże S).
Taki plik nazywa się "Preprocessing Assembler File (.S)" i to nie to samo, co "Assembler File (.s)".

wojakin napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Nie widzi mi się kompilować szukać jaki adres ma ta zmienna a następnie "na żywca" przepisywać tą wartość do asm co dało by nie czytelny, zmasakrzony kod.

W tym przypadku 'numByte' to nie zmienna tylko parametr funkcji.

Wywołanie funkcji w C wygląda tak:
  1. do odpowiednich rejestrów zostają skopiowane dane, które mają być przekazane do funkcji jako argumenty
  2. wywołana zostaje instrukcja asm CALL
  3. funkcja korzysta z przekazanych argumentów, odczytując je z odpowiednich rejestrów
Aby napisać w ASM funkcję, która jest wywoływana w C i przyjmuje jakieś argumenty, musisz znać numery rejestrów w których kompilator C umieszcza te dane.
Jest to opisane np. tutaj.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 wrz 2016, o 19:11 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Wątek w sumie można już chyba uznać za archiwalny. Autor najpierw zapytał, a później zignorował odpowiedzi i przestał się interesować wątkiem. Nie wiadomo nawet, czy rozwiązał swój problem, czy po prostu stracił zapał.

Stosowanie wstawek asemblerowych tak na prawdę rzadko jest zasadne. Kompilator w zdecydowanej większości przypadków zoptymalizuje kod równie dobrze, lub nawet lepiej niż programista, szczególnie w bardziej rozbudowanych funkcjach. Niemniej (moim zdaniem) są pewne sytuacje, kiedy warto takie wstawki zrobić. Myślę, że przykładem może być sytuacja, kiedy zależy nam na dużej wydajności kodu, a optymalnym typem danych będzie np. liczba całkowita (lub fixed-point) o niestandardowym rozmiarze (np. 24- lub 40-bitowa). C bezpośrednio nie wspiera arytmetyki takich liczb, trzeba stosować typy nadmiarowe lub różne inne sztuczki. Dlatego (przynajmniej dla mnie) prostsze jest napisanie funkcji w asemblerze, oczywiście przy założeniu, że funkcja jest stosunkowo prosta i nie trzeba wykonywać jakichś zaawansowanych obliczeń matematycznych (np. logarytmów lub funkcji trygonometrycznych).

Nie wnikając więc w zasadność stosowania wstawek i korzystając z chwili wolnego czasu, postanowiłem przedstawić na forum przykład kodu, który pokazuje, w jaki sposób miksować kod asm oraz c z wykorzystaniem kompilatora avr-gcc. Jeśli nie autor wątku, to może ktoś inny będzie chciał skorzystać.

Kod został napisany dla mikrokontrolera ATmega644P, skompilowany przy użyciu toolchain'a Atmela w wersji 3.5.3.1700. Poprawność sprawdzona zarówno przy pomocy symulatora Atmel Studio jak i debuggera sprzętowego. Zaznaczam, że nie było moim zamiarem udowodnienie zasadności stosowania wstawek asm, ani tego, że kod napisany w asm jest wydajniejszy od wygenerowanego przez kompilator C. Kod nawiązuje do problemu zgłoszonego przez autora wątku, jest stosunkowo prosty i ma być tylko przykładem jak:
  • wykorzystać w asm argumenty przekazane do funkcji wywołanej z pliku *.c
  • zwrócić wartość funkcji napisanej w asm, by była prawidłowo wykorzystana przez kod wygenerowany przez kompilator C
  • współdzielić zmienne między kodem asm i C
  • napisać procedurę obsługi przerwania w asm
  • i może jeszcze coś, co w tej chwili nie przychodzi mi do głowy :)

plik "main.c":
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


plik "spi.S" (Preprocessing Assembler File):
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 wrz 2016, o 19:26 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27339
Lokalizacja: Szczecin
Pomógł: 1041

andrews napisał(a):
i może jeszcze coś, co w tej chwili nie przychodzi mi do głowy

Przede wszystkim myślę, że to świetny przykład dla każdego kto zaczyna cokolwiek próbować robić w tym zakresie! ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 wrz 2016, o 19:53 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Dziękuję za miłe słowo, i to od samego Szefa Szefów.
Trochę się obawiałem, że tylko zaśmiecę forum, a i tak nikt tego nie przeczyta ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 wrz 2016, o 20:01 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27339
Lokalizacja: Szczecin
Pomógł: 1041

andrews napisał(a):
Trochę się obawiałem, że tylko zaśmiecę forum, a i tak nikt tego nie przeczyta

No wiesz ? zaśmiecisz ? .... ja tylko troszkę się obawiam o umiejscowienie tego w tym wątku bo może to być ciężko znaleźć zainteresowanym. To raczej mogłeś umieścić w dziale PORADNIKI, albo nawet w DIY Software. Ja mam wprawdzie na liście poradników również i te tematy ale to jeszcze potrwa sporo czasu zanim się za nie zabiorę ... Więc tym bardziej miło, gdy ktoś mnie uprzedza i taki fajny przykład zamieszcza na forum, dla tych którzy tego poszukują i mnie też często pytają na PW ... kiedy o tym będzie - a tu proszę !

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 wrz 2016, o 20:22 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Jako że przykładowy kod nawiązuje do pytania autora wątku, uznałem to raczej za odpowiedź. Jeśli uważasz, że np. dział PORADNIKI byłby dla tego postu odpowiedni, to nie widzę przeszkód, żeby go tam przenieść. Nie wiem tylko, czy wtedy nie trzeba by było go uzupełnić np. o wywoływanie funkcji napisanej w C (szczególnie takiej z parametrami) poprzez kod asm, bo tego tam nie ma.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 wrz 2016, o 20:41 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27339
Lokalizacja: Szczecin
Pomógł: 1041

Dla mnie byłoby prościej gdybyś mógł po prostu sam założyć tam taki wątek i skopiować z tego te informacje ew coś uzupełnić jak piszesz. Oczywiście jeśli masz czas i ochotę bo jak mówię - taki art może być bardzo przydatny

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2016, o 06:16 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Czas jest zwykle największym problemem, a żeby post (artykuł) mógł nosić miano poradnika, trzeba by temat nieco rozwinąć. W związku z tym nie mogę w obecnej chwili nic konkretnego obiecać, ale skoro twierdzisz, że wśród użytkowników forum jest zainteresowanie tematem, to postaram się znaleźć chwilę, żeby go dokładniej opisać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2016, o 09:33 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27339
Lokalizacja: Szczecin
Pomógł: 1041

Na spokojnie - jak coś to i ten post może sobie znajdą zainteresowani ;) .... a sam wiem jak to jest z tym czasem ... oj wiem

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 wrz 2016, o 11:59 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam,

Kolego andrews dzięki za super przykład, ale gdybyś faktycznie mógł rozwinąć temat, ot choćby o wspomniane przez Ciebie, wywoływanie funkcji C przez kod .asm byłbym Ci bardzo wdzięczny.

Pozdrawiam, QuadMan.

P.S. Mirku, a może na razie choć przykleić ten topic na górze ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 wrz 2016, o 20:03 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Myślę, że napiszę coś dokładniej, bo zmotywowała mnie ciekawość, jakie będzie faktyczne zainteresowanie tematem. Na razie jednak kiepsko z czasem, więc nie potrafię podać konkretnego terminu.

Pozdrawiam,
andrews



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 9 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO