ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
1037739 Топик полностью
йцyкeн (18.09.2020 22:41, просмотров: 384) ответил teap0t на Спасибо. А амперсанд зачем? Адрес же! Туплю.
Попробую объяснить подробнее. Приведение типов применяется к значениям, а не к переменным. Возможно, вы хотели бы написать float x; (int)x = 666; но в Си это недопустимо. Допустимо int ix = (int)x; значение x читается как float, потом преобразуется в int. Чтобы обратиться к переменной как к другому типу, нужно применить приведение типа не к самой переменной, а к указателю на неё (это грязный хак). Указатель концептуально состоит из двух частей: адрес некоторой переменной и её 

тип. При исполнении программы указатель содержит только адрес, но тип тоже вполне материален: компилятор хранит его наряду с другими типами в своих таблицах. Итак, мы берём &SPIx_DR, это указатель типа volatile uint16_t *. Далее, мы меняем его тип на volatile uint8_t *. Приведение происходит во время компиляции, никакой код не генерируется. Наконец, мы обращаемся по этому указателю, и компилятор генерирует инструкцию LDRB вместо LDRH. Да, это тот редкий случай, когда на ассемблере было бы проще.