Embedded C, zapis zmiennej do rejestru uC

Embedded C, zapis zmiennej do rejestru uC
  • Rejestracja: dni
  • Ostatnio: dni
0

Tak wygląda zapis zmiennej do rejestru CCR1 timera TIM2 w uC stm32.

Kopiuj
float u = function();
*(uint32_t*)(0x40000000U + 0x34) = (uint32_t)(u);

Pytanie dlaczego zapis wygląda tak a nie inaczej. Pierwsza gwiazdka jest dla mnie oczywista, ponieważ wskazujemy miejsce w pamięci gdzie ma być zapisana zmienna. Nie wiem natomiast co oznacza to wyrażenie:

Kopiuj
(uint32_t*)

Bez tego wartość nie jest zapisana do rejestru.

Bartosz36
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 348
0

Krótko mówiąc rzutujesz wartość 0x40000000U + OFFSET na wskaźnik na 32-bitową liczbę unsigned int.
Dajesz kompilatorowi do zrozumienia, że odnosisz się do wskaźnika o podanym adresie równym 0x40000000U + OFFSET a następnie (podając gwiazdkę przed całym wyrażeniem) wyłuskujesz wartość tam leżącą, czyli modyfikujesz zawartość adresu.

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
0

(uint32_t)(0x40000000U + 0x34)

0x40000000U + 0x34: to jest wartość typu nieznakowany integer, http://en.cppreference.com/w/cpp/language/integer_literal
w zasadzie można to zapisać jako:
0x40000034U

(uint32_t*) to konwersja na wskaźnik na wartości typu nieznakowany 32-bitowy integer: https://www.tutorialspoint.com/cprogramming/c_type_casting.htm

'*' przed tym wszystkim wykonuje dereferencję: http://www.c4learn.com/c-programming/c-dereferencing-pointer/

Sparrow-hawk
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Katowice
  • Postów: 189
0

A tak w ogóle, to gdzie spotkałeś się z taki zapisem?

Nie lepiej tak:

Kopiuj
TIM2->CCR1 = (uint32_t)function();

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.