Embedded C, zapis zmiennej do rejestru uC

0

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

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:

(uint32_t*)

Bez tego wartość nie jest zapisana do rejestru.

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.

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/

0

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

Nie lepiej tak:

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1