ARM GCC -- strexb i strexh -- problem (rozwiązanie)

Język C dla mikrokontrolerów ARM
ODPOWIEDZ
Awatar użytkownika
SunRiver
Użytkownik
Posty: 936
Rejestracja: 08 paź 2017, 11:27
Lokalizacja: Festung Oppeln
Kontakt:

ARM GCC -- strexb i strexh -- problem (rozwiązanie)

Post autor: SunRiver »

Po jakimś tam długim czasie wróciłem do starego softu dokładnie do projektu Computerka Controlera dla LRF ,
Nic specjalnego jak pamiętacie , a pisany był w Atollic TrueStudio chciałem wprowadzić kilka zmian pod
jednego zainteresowanego w tym dodanie przycisków dotykowych na AT42QT i zmiana LCD monochromatycznego
KS108 128x64 na 2,4" 320x240 na sterowniku ILI ...

Wszystko poszło jak z płatka ale ... pojawiły się 2 błędy ....

Obrazek

---> register may not be same – ‘strexb r3,r2,[r3]
---> register may not be same – ‘strexh r3,r2,[r3]

Błąd występuje gdy strexb i strexh są niezdefiniowane, a ponieważ oba rejestry są takie same dostajemy błędy jak wyżej
w liniach 736 i 753 pliku core_cm3.c.

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


Rozwiązać możemy go bardzo prosto w naszym projekcie.
Otwieramy plik : firmware/CMSIS/CM3/ CoreSupport/core_cm3.c

W nim znajdujemy funkcję :
  1.  
  2. uint32_t __STREXB ( wartość uint8_t , uint8_t * addr)
  3. { wynik
  4.    uint32_t = 0;
  5.    __ASM volatile ( " strexb % 0,% 2, [% 1]" : "=r " (wynik): "r" (addr), "r" (wartość));
  6.    return (wynik);
  7. }
  8.  
  9.  

i zmieniamy linię : __ASM volatile ( " strexb % 0,% 2, [% 1]" : "=r " (wynik): "r" (addr), "r" (wartość));
dodając znak "&" tak by wyglądała nastepująco:
  1.  
  2. __ASM volatile ( " strexb % 0,% 2, [% 1]" : "=& r " (wynik): "r" (addr), "r" (wartość));
  3.  
teraz w funkcji :
  1.  
  2. uint32_t __STREXH(uint16_t value, uint16_t *addr)
  3. {
  4.    uint32_t result=0;
  5.  
  6.    __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
  7.    return(result);
  8. }
  9.  
postępujemy tak samo zmieniając linię : __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
na
  1.  
  2. __ASM volatile ("strexh %0, %2, [%1]" : "=& r" (result) : "r" (addr), "r" (value) );
  3.  

Obrazek


i gotowe ... mam nadzieję że kiedyś się komuś przyda :)
..:: KONTO PRZYGOTOWANE DO USUNIĘCIA ::..
💫Lothar TeaM
💦GitHUB
💦Google Drive
💦Sotton

ODPOWIEDZ

Wróć do „C dla ARM”