dspic33ep64mc504 i "atomowe"operacje na portach pytanie

May 02, 2016 2 Replies

Witam. Kompilator to XC wersja w trybie darmowym, optymalizacja 1. Wbrew temu co sugeruje help,



"LATGbits.LATG5 = 1; /* No problem likely, this is an assignment of a single bit and will use a single instruction bit set operation */"



przypisanie takie nie jest tlumaczone na pojedyncza instrukcji ustawiania bitu tylko realizaowane jako odczyt - modyfikacja- zapis portu. Gdy mamy to robione w main a w przerwaniu rowniez sa zapisy do tego portu powoduje to problem ktory ujawnia sie po losowym czasie.



Pytanie czy istniej mozliwo¶æ ustawienia pinu portu w "atomowej" operacji za pomoca jakiejs wstawki asemblera ? Czy problem sie bierze z tytulu ze kompilator to wersja darmowa a w wersji pelnej bedzie dobrze. Rozwiazanie sugerowane przez help tj wylaczenie przerwan na czas modyfikacji portu w petli glownej (makro INTERRUPT_PROTECT )dziala ale nie jest dobre, po pierwsze blokuje przerwania, po drugie dodaje narzut. pozdrawiam. Michal


W dniu 2016-05-02 o 10:35, michal pisze:

jeśli chcesz assembler, to zrób makro definiujące atomowy (jedną instrukcją) zapis do portu.

a.

Na pewno ta operacja r-m-w nie jest realizowana pojedynczą instrukcją w dspic33? Uważaj na XC w wersji darmowej, w tej wersji XC generuje dużo "dummy instructions" aby rozepchnąć i spowolnić kod. Być może analizując wygenerowany assembler dla LATGbits.LATG5 = 1; dałeś się wprowadzić w pole przez ekstra zbędne instrukcje.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required