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



Teraz jest 25 kwi 2024, o 11:07


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
PostNapisane: 20 gru 2014, o 20:19 
Offline
Użytkownik

Dołączył(a): 30 sie 2014
Posty: 170
Pomógł: 2

Witam :)

Czy są jakieś ograniczenia co do tego gdzie można wywoływać zdefiniowany bitband?

"""Zdefiniowalem sobie bitband""" dla danego bitu. Jeśli taką #definicję wywołam w funkcji main to jest ok, na zapis potrzeba 2 instrukcji assemblera, bez optymalizacji. Natomiast jeśli wrzucę to do jakiejś funkcji, do innego pliku i będę chciał wywoływać samą funkcję to zajmuje to już 6 instrukcji assemblera (2 na wywołanie i opuszczenie funkcji 4 na ustawienie bitu).

Zdaję sobie sprawę że opis może być mało czytelny - powiedzcie co dopowiedzieć, wyjaśnić, uwiecznić na print screenie - żeby rozwiać moje wątpliwości :)

W centrum pomocy ST robią to właśnie w funkcji main :D



Ostatnio edytowano 20 gru 2014, o 20:26 przez doman, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2014, o 20:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

bowiem powinno sie wywoływać bitband w funkcji głównej main ...
ale o tym jest oczywiście w reference manual do procka .. wystarczy poczytać ...

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2014, o 20:31 
Offline
Użytkownik

Dołączył(a): 30 sie 2014
Posty: 170
Pomógł: 2

ok, dzieki :) Niestety nie ma tego w reference manualu dla M4F RM0090, zapewne jest to ujęte w którymś z "related documents" :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2014, o 20:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

poszukaj w DM00031020 jest na pewno

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2014, o 22:39 

Pomógł: 0

:shock: Się upewnię: mówicie o "bit-bandingu" (atomowym machaniu bitami)? Przecież to zwykły zapis (bądź odczyt) 0/1 do słowa w pamięci - skąd niby ograniczenie "in main use only"?
W RM0090 i RM0008 nie ma o tym ani słowa (o ograniczeniu)... W wszelkich "Cortexowych" dokumentach (Programming Manual, Cortex User Guide, Technical Ref. Manual, Definitive Guide to Cortex...) też cisza.

Z ciekawości sprawdziłem - bit-banding użyty poza "main", optymalizacja -O0 - wynik: 3 rozkazy asm (załadowanie wyliczonego adresu słowa do r3, załadowanie nowej wartości słowa (0/1) do r2 i na koniec wrzucenie r2 pod adres z r3). Czego chcieć więcej :)?



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2014, o 23:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

oczywiście że tak , ale jest kilka małych ale gdzie jednak może kaleczyć się obsługa ... chodzi o konkretny przypadek dostawcy krzemu STM

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2014, o 23:40 

Pomógł: 0

SunRiver napisał(a):
chodzi o konkretny przypadek dostawcy krzemu STM
Dlatego też "przeleciałem" Ref. Manuale i Programming Manuale do procków STM32, w tym sugerowany dokument DM00031020 (RM0090) - w rozdziale o bit-bandingu nic nie ma o ograniczeniach.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2014, o 23:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

nie pamiętam w którym dokładnie ... znajdę to wrzucę ... bo zasadniczo niema z tym kłopotu , ale ...

------------------------ [ Dodano po: 4 minutach ]

no właśnie mroczne sekrety stm32 są opisane w świetnej skądinąd książce Josepha Yiu - The Definitive Guide to Arm Cortex - M3
chodzi o to że podczas niektórych operacji - podczas wymazywania bitu , zostaje uszkodzone info z całego reestru 32 bitowego (nadpisane przypadkową wartością) problem głównie dotyczył M3 :) i w konkretnych przypadkach zalecane było uzycie w main żeby nie zostały zmiany nadpisane przez inną funkcję.

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 gru 2014, o 01:25 

Pomógł: 0

Przeszukałem książki J. Yiu (Definitive Guide to...) dla Cortex'a M3 (second edition) i dla CM3 & CM4 (third edition). Szukałem pod hasłem "band*" i "stm32" + przejrzałem dokładniej rozdziały o bit-bandingu. Z rozpędu sprawdziłem jeszcze erraty dla stm32f10x, stm32f42x oraz dokumenty "software developers errata notice" dla CM3 i CM4. Poszukiwania podsumuję jednym słowem: void :) Nie znalazłem nic o uszkodzeniu zawartości rejestru i ograniczeniu do main.

Przy okazji znalazłem kilka innych, mniej lub bardziej oczywistych, "pułapek" około bit-bandingowych. Pozwolę sobie je tu wrzucić - może komuś się przyda:
1. "If an unaligned access is carried out to bit-band alias address range, the result is unpredictable."
2. "For system-on-chip (SoC) designers designing a bit-band-capable device, the device’s memory address should be located within the bit-band memory, and the lock (HMASTLOCK) signal from the AHB interface must be checked to make sure that writable register contents will not be changed except by the bus when a locked transfer is carried out."
3."Using bit band for semaphores can work only if all the tasks in the system change only the lock bit they are assigned to using the bit-band alias. If any of the tasks change the lock variable using a normal write, the semaphore can fail because another task sets a lock bit just before the write to the lock variable, the previous lock bit set by the other task will be lost."
4. Modyfikując szeroko-pojęte-coś za pomocą bit-bandingu i "klasycznie" dobrze by było by to "coś" było volatile (kompilator nie zauważy zmian wartości wynikających z działania bit-bandingu).
5. Bit-banding może nie obejmować wszystkich układów peryferyjnych. Np. w stm32f427/429 nie łapią się: USB OTG FS, DCMI, CRYP, HASH, RNG, FSMC (rejestry konfiguracyjne)...



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 21 gru 2014, o 09:57 
Offline
Użytkownik

Dołączył(a): 30 sie 2014
Posty: 170
Pomógł: 2

Jeśli wymusze bitband w funkcji main albo w funkcji wewnątrz main np. -> while(1) - to bitband działa poprawnie - 2 instrukcje asm.

Jeśli natomiast umieszczę to w osobnych plikach bitband.c bitband.h i tam zrobię fukcję np. rcc_init . To jeśli wywołam taką funkcję w pliku głównym main.c w funkcji main albo while to - to już się "rypie" :(

Czy jesteś w stanie to sprawdzić?

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.


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


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


Pliki mocno okrojone bo trochę duże są ale powinno wystarczyć.

Obrazek __________ Obrazek
działajacy bitband _____________________________nie działający

----------- ------------ ------------ -------------

No więc tak ... Jest jeszcze kilka pułapek :P Przynajmniej STM o tym mówi na infocenter ...

jeśli wskazany bit ustawiamy w ten sposób:

zdefiniowanybit_bb = 1 // więcej instrukcji asm -> tzw. word write

ale jeśli zdefiniujemy zmienna = 1 i :

zdefiniowany bit_bb = zmienna // 2 instrukcje asm :P tzw. bit write

Podobnie jest z odczytem.

więcej info -> szukajcie w infocenter "how to use bitband in cortex M3".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 gru 2014, o 11:22 

Pomógł: 0

A propos "pułapek" - jeszcze jedna mi przyszła do głowy:
bitband nie obejmuje "peryferiów rdzenia" (NVIC, SysTick, SCB, MPU, FPU) :)

Szczerze powiedziawszy nie rozumiem, czemu za wyznacznik poprawnego działania bb uznajesz warunek 2-ch instrukcji asm. Generalnie nie ma opcji żeby wystarczyły 2 rozkazy ;) U Ciebie (na screenie pt. "działający bb") też zajmuje 3 rozkazy.
1. ldr r0, [pc, #4] - wrzucenie wyliczonego adresu (0x4247 060c) do r0
2. str r4, [r0] - zapisanie wartości z r4 pod adresem r0

trzeci rozkaz jest linijkę wyżej i nie widać go na screenie - będzie odpowiedzialny za wpisanie wartości do r4:
3. mov r4, #1 (albo coś podobnego)

Sprawdziłem myk z definiowaniem zmiennych set/reset - u mnie nie ma różnicy - cały czas 3 rozkazy :)

Co do screena "nie działa": generalnie bb działa, tylko kompilator coś się zamotał z wpisaniem nowej wartości (1/0) do r0. Próbowałeś bez tych zmiennych set/reset - dalej będą cztery rozkazy? Szkoda że na screenie nie widać co jest pod adresami "PC + #0x10" :)

Przetestować nie mogę bo nie mam definicji BB_PERI ;)

Btw: czemu w definicji BITU_BB rzutujesz na "char" a nie na "coś-32-bitowego"? Później do tego chara wpisujesz set/reset które są typu int.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 21 gru 2014, o 11:39 
Offline
Użytkownik

Dołączył(a): 30 sie 2014
Posty: 170
Pomógł: 2

Też mnie zastanawiał ten char :P STM dało solution w którym SRAM rzutuje na int a PERI na char ... nie wiem dlaczego.

W sumie to bardziej chodziło mi o to żeby z bb było mniej instrukcji niż przy tradycyjnym ustawianiu bitu.

Sprawdziłem - wpisując = 1 ; = 0 ; jest mniej instrukcji (jesli funkcja jest w innym pliku !) - MOVS; LDR; STRB; :)

Z tym PC to o to Ci chodzi?

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 gru 2014, o 13:42 

Pomógł: 0

Podrzuć jakiś link do tych materiałów od ST :) Moje poszukiwania "how to use bitband in cortex M3" cały czas kończą się na "infocenterze" ale ARM'a.

Z wykorzystaniem bb jest mniej instrukcji - w sumie 3 przy zapisie. Przy czym można się spierać czy załadowanie stałej 0/1 do rejestru wliczać jako osobną instrukcję. Kiedy bit-bandingów będzie więcej i włączy się optymalizację to pewnie stosunek ilości rozkazów asm na "operację bb" spadnie. Bez bb ustawienie bitu to min. 4 operacje (załadowanie adresu zmienianego rejestru, odczytanie jego zawartości, suma logiczna, wpisanie nowej wartości do rejestru).

Odczyt bitu z wykorzystaniem bb też wypada krócej - odpada operacja iloczynu logicznego (albo inny rozkaz w stylu UBFX).

W sumie głównym celem BB jest atomowość i najważniejsze żeby to działało ;d

Co do screena i PC: nie do końca to miałem na myśli. Już tłumaczę: na screenie z "nie-działającym bb" (4 instrukcje) jest coś takiego (mniej więcej):
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dwie ostatnie operacje wydają się być ok. Dziwne są te kombinacje z r0 - ciekaw byłem co jest wrzucane do r0 w pierwszej instrukcji (co siedzi pod adresem PC+0x10). To będzie kilka linijek niżej - w okolicach adresu 0x8000013c :) ).
Przypuszczalnie będzie tam adres zmiennej set, ale byłem ciekaw ;)



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 21 gru 2014, o 13:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

Cytuj:


---Joseph Yiu – The Definitive Guide to the Arm Cortex – M3

Wondrous though the STM32 (ARM Cortex M3) might be, it makes something of a meal of atomic access individual bits in a memory. The technique used is called bit-banding. Although it is simple enough in concept and pretty friendly to the assembly language programmer, it is easy enough to get lost in C. Or Should That Be at C?

So why would you want atomic access that individual bits? Consider a single bit used as a flag in your program. Perhaps you have a data buffer and the interrupt service routine That looks after it sets a bit in a memory location to signal That it is full. A higher level function sees the bit set and does something about it, then resets the bit. the problem of Is That this is just one in a whole bit memory word of 32 bits and, then modify it you need to read the word, change the bit and write back the word. What happens if some other changes they interrupt function of the other bits in That word after you read it but before you wrote back the modified version? When you write back your version, it will put all the bits back to how they were before you started THUS destroying a piece of information. In this particular case, it is recommended to use a bit -band call directly in the main function. This prevents damage to the variables, but it does not mean that this is happening forever. However, you can be tempted to call outside the main internal function, there may be a growth in code size and the method can work, however, will prawiodłowo less effective. This is not the fault somehow silicon, and the imperfections of GCC.

You can solve this issue; generally by using an entire variable for each dry flag. At best this will use up a whole byte for each flag and so wastes memory. That small and not be a problem for you and If that is the case then That will work out just fine. Things are not so easy if you wanted to keep All These flags neatly together in a single location as a status word That might get sent to a host or recorded in a log.

This kind of thing happens all the time in the peripheral control registers. Take the USART for example. The CTS flag goes high and an interrupt handler as part of its job, wants to reset the flag. Do not ask me why, it just does. Meantime, you just received a byte and the RXNE flag is set it Indicate That there is data waiting. But the CTS handler is in the middle of a read-modify-write cycle. It has read the status register and is in the process of clearing the CTS flag. When it writes the result back, the flag will be RXNE cleared and the arrival of the character could go un-noticed.

OK, so I just invented all that. The point is, the peripheral registers need care in a small setting and clearing bits and the safest way to do that in both cases is through bit-banding. Why? because the changes are atomic. That is, they happen is the single bits in a cycle and can not be interrupted. THUS, there will never be an occasion the where you read a bit Which can be modified by some other code before you get to write it back out.

Right, so, how is it done? 8051 programmers had a rich set of bit set / reset instruction to all that could accommodate this very neatly. then again, the 8051 had a tiny address space and a suitably simple architecture.

On the STM32, some magic is worked internally so That each bit in a pre-defined memory range can be Addressed as another location in a kind of virtual address space somewhere else. So, for example, the 32 bit value stored at address 0x20000000 Appears also as 32 sequential memory locations starting at 0x22000000. There are two regions of memory That have bit-band alias regions. First there is a 1Mbyte SRAM region from 0x20000000 - 0x20100000 is the where each bit and byte aliases to address in the range 0x22000000 - 0x23FFFFFF. Then there is the peripheral space from 0x40000000 - 0x40100000 Which is aliased in the same way to the range 0x42000000 - 0x43FFFFFF.

Using this scheme, a read or write to memory location 0x22000000 is the same as a read or write to the least bit of SRAM significant_coeff_flag location 0x20000000. I have no intention of going through the whole thing.



Niemniej nie stanowi to jakiegoś dużego problemu prawda ... ??
Ot warto wiedzieć że takie coś może mieć miejsce ...
Problemem mogą tez być biblioteki C .. które zawierają makra stanowiące translację adresów warto się przyjrzeć jak to wygląda w przestrzeni pamięci SRAM:

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


Nie są może zbyt intuicyjne w obsłudze, nawet gdy wiesz co robią. Niemniej zdaniem J.Yiu tworzą bałagan i się z tym zgadzam. Warto pójść jego tropem i zdefiniować je tak jak proponuje dodatkowo:

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


Korzystanie z tych makr jak widać jest bardzo proste:

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


Tu widać że korzystanie z makra varGetBit z Lvalue można zastosować do przypisania:

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


Oczywiście koledze doman należy się też małe wyjaśnienie, w korzystaniu z bit-bandu wcale nie chodzi o szybkość jak mu się wydaje, która jest wymierna jak sam zaobserwował zależnie od miejsca wywołania, ale o wygodę,

Kompilator nie może wiedzieć gdzie zmienne będą przechowywane podczas generowania kodu ale będzie mógł "zobaczyć" niektóre z obliczeń dokonywanych podczas wykonywania programu. Jeśli więc użyjesz metody wskaźnika jak w przykładzie wyżej, obliczenie aliasu adresu odbędzie się tylko raz, i będziesz w stanie dobrać się do zmiennych bitowych sprawnie i wygodnie prawda ??
Jeśli chcesz dostępu do bitów rejestrów peryferyjnych zrob to ta samo, pamiętając o różnych rejestrach bazowych :) Dlatego niema powodu dla którego nie można by sobie zdefiniować odpowiedniego makra które się odniesie do określonego bitu w rejestrze pod znanym adresem.
Właśnie w tym wypadku otrzymasz adresy wyliczone wstępnie przez kompilator i kod będzie najbardziej efektywny bo adresy rejestrów peryferyjnych będą znane już na poziomie kompilacji.

Tak więc kolego wwojtek, pamiętałem że coś takiego właśnie czytałem stąd taka a nie inna interpretacja
zadałeś sobie sporo trudu , ale powierzchowne przeglądanie to nie to samo co czynne czytanie wtedy można więcej wyłapać i zapamiętać. co wcale nie oznacza że nie masz racji. I nie musisz się oburzać i unosić ... ja tylko wskazałem że takie coś może mieć miejsce.

z pozdrowieniami

<Prawdziwy akt odkrycia nie polega na odnajdywaniu nowych lądów,lecz na patrzeniu na stare w nowy sposób. Marcel Proust ?? <chyba dobrze pamiętam ?>

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 gru 2014, o 17:39 

Pomógł: 0

Kolego SunRiver - szkoda, że nie podałeś skąd dokładnie pochodzi zacytowany fragment, bo nie jest to (jak można by przypuszczać z Twojego postu) fragment z książki "The Definitive Guide to ARM CM3" (second edition). Nie wiem na jakiej podstawie wyciągnąłeś wnioski na temat powierzchowności mojego czytania. Akceptują jednak Twój brak zaufania co do mojej sumienności - w ramach samo-sprawdzenia przeszukałem książkę w wersji elektronicznej (ctrl+f i wybrane fragmenty z Twojego cytatu) - tego w książce nie ma. Zauważ ponadto, że Autor tekstu w Twoim poście:
- miesza pojęciami STM32 oraz Cortex-M3 jak mu się żywnie podoba
- opisuje zupełnie chybiony przykład z USART'em (kasowanie opisanych flag wbrew temu co opisuje Autor nie wymaga operacji read-modify-write)
Być może się mylę, ale wydaje mi się, że J. Yiu by takich głupot nie napisał ;) Zacytowany przez Ciebie tekst znalazłem na blogu Micromouse Online. Jeśli wierzyć temu co tam napisano - Autorem jest Peter Harrison.

Opisany w cytowanym fragmencie "problem" owszem istnieje, jednak nie ma generalnie nic wspólnego ani z STM, ani z bit-bandingiem. Autor zwraca uwagę na to, że jeśli "coś" (rejestr, zmienna...) jest modyfikowane nie-atomowo i łańcuch read-modify-write zostanie przerwany przez inną operacją modyfikującą to samo "coś" to dane ulegną nadpisaniu - to przecież nie jest żaden "dark secret" STM'ów... Równie dobrze dotyczy to AVR'ów. Swoją drogą punkt 3 mojej listy "pułapek" (kilka postów wyżej) dotyczy tego samego mechanizmu - tylko tam był opisany w kontekście semaforów.

SunRiverze - ja się nie oburzam. Po prostu uważam, że nie masz racji twierdząc, że:
SunRiver napisał(a):
bowiem powinno sie wywoływać bitband w funkcji głównej main ...
ale o tym jest oczywiście w reference manual do procka .. wystarczy poczytać ...



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 21 gru 2014, o 17:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

nie czytałem Harissona ... niestety ...

J.Yiu mam wydanie I. bez poprawek Cortex , jak i Stelaris (z drugiej jestem zadowolony) ... i w sumie jest tam trochę zamieszania , ale errata wiele normuje w istocie .. opis jest chaotyczny nieco , ale czytając różne publikacje przywykłem do ogólnego chaosu , no może poza książkami Smitha czy Praty , tak wiec cytat przytoczony pochodzi z ebooka ... niestety nie mogę go zamieścić (z wiadomych powodów) .. :(


a tu jak napisałem , ja nie twierdze że nie masz racji , a tym kontekście wraziłem się nieprecyzyjnie ...
jak to mówią pamięć jest zawodna ... a jedynym wyznacznikiem jest jej ulotność :)

w każdym razie mniejsza o to ... wynik w każdym razie jest bardzo podobny

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



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: 16 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO