Например TDA7294

Форум РадиоКот • Просмотр темы - stm32 и работа со стуктурами и указателями
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Вт июн 25, 2019 14:36:30

Часовой пояс: UTC + 3 часа [ Летнее время ]


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 54 ]  1, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Сб окт 14, 2017 20:47:34 
Первый раз сказал Мяу!

Зарегистрирован: Вс янв 15, 2017 19:02:24
Сообщений: 21
Рейтинг сообщения: 0
Пытаюсь разобраться как работают структуры, и наткнулся на один непонятный момент. Возьмем к примеру, вендор производителя (stm32f4xx.h), в нем есть, кусок кода, содержащий набор регистров для работы с портами ввода-вывода.

Здесь создается структура и она же объявляется как новый тип
Код:
typedef struct
{
  __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
  __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */
  __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */
  __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
  __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */
  __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */
  __IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */
  __IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */
  __IO uint32_t BSRR;
  __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */
  __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */
} GPIO_TypeDef;


Далее следует код:

Код:
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)


Этой строчкой мы создаем указатель GPIOA на структуру типа GPIO_TypeDef.

И дальше, я не могу разобраться.

Указатель тоже своего рода переменная и должен занимать место в памяти и где-то находится, но я так и не смог найти его место положение. Вопрос, так где же он лежит ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Сб окт 14, 2017 21:17:53 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 312
Зарегистрирован: Вт ноя 27, 2007 12:32:06
Сообщений: 2176
Откуда: Tashkent
Рейтинг сообщения: 0
Вовсе не так.
Процесс компиляции Си-кода проходит 2 этапа:
1. препроцессор
2. компиляция

В данном случае имеет место только первый вариант.
Препроцессор сразу подставляет вместо GPIOA указанную строку, он не создаёт указателей или каких-либо иных объектов.


Вернуться наверх
 
JLCPCB, всего $2 за 10 ПП любого цвета!

Более 600 000 заказчиков по всему миру! Более 10 000 заказов в день!

Скидка до $20 на доставку для первого заказа:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Сб окт 14, 2017 22:00:54 
Поставщик валерьянки для Кота

Карма: 45
Рейтинг сообщений: 557
Зарегистрирован: Пн апр 06, 2015 12:01:53
Сообщений: 2322
Откуда: москва, уфа
Рейтинг сообщения: 0
Здесь создается структура и она же объявляется как новый тип

только объявляется как тип. Переменная не создается.
Этой строчкой мы создаем указатель GPIOA на структуру типа GPIO_TypeDef.

не создаем. После такого объявления директивы препроцессор заменит в остальной программе "GPIOA" на "((GPIO_TypeDef *) 0x094566)" - цифирь от балды, это GPIOA_BASE - что, в свою очередь, означает "обратиться к области памяти по адресу 0x94566 как к содержащей переменную типа GPIO_TypeDef"


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $88 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Вс окт 15, 2017 12:19:19 
Друг Кота
Аватар пользователя

Карма: 28
Рейтинг сообщений: 143
Зарегистрирован: Пн июл 28, 2008 23:12:01
Сообщений: 3465
Рейтинг сообщения: 0
вендор производителя


Вы когда решаете применить незнакомое вам слово, хоть погуглите что оно означает...


Вернуться наверх
 
Литиевые батарейки Fanso для промышленного применения: устойчивость к высоким температурам

Надежные литиевые ХИТ производства Fanso для широкого круга применений, в том числе в промышленности, способны работать в самых жестких условиях. Основные требования, предъявляемые к автономным источникам питания – это длительность хранения и работы, высокая удельная емкость, а также защита от воздействия таких внешних факторов как, температура и влажность.
Подробнее>>
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Вс окт 15, 2017 17:25:50 
Первый раз сказал Мяу!

Зарегистрирован: Вс янв 15, 2017 19:02:24
Сообщений: 21
Рейтинг сообщения: 0
вендор производителя


Вы когда решаете применить незнакомое вам слово, хоть погуглите что оно означает...


Верное замечание, вендор и есть производитель. Писал, когда время уже было позднее, поэтому может быть и ошибся. И признаюсь честно, узнал это слово из ваших топиков, где вы кому то объясняли структуру проекта или что-то схожее с этим, но найти это сообщение снова не смог. А вообще нужно было написать "заголовочный файл вендора", поправте меня, если я снова ошибаюсь.

Добавлено after 15 minutes 6 seconds:
Вовсе не так.
Процесс компиляции Си-кода проходит 2 этапа:
1. препроцессор
2. компиляция

В данном случае имеет место только первый вариант.
Препроцессор сразу подставляет вместо GPIOA указанную строку, он не создаёт указателей или каких-либо иных объектов.


Что-то, я не до конца понимаю, а что происходит дальше, после того, как он подставил.

Добавлено after 6 minutes 30 seconds:
arkhnchul писал(а):
" - цифирь от балды, это GPIOA_BASE - что, в свою очередь, означает "обратиться к области памяти по адресу 0x94566 как к содержащей переменную типа GPIO_TypeDef"

Это я уже выучил на изусть, но как происходит это обращение, я что-то до конца не понимаю.


Вернуться наверх
 
Приглашаем на вебинар «Создание беспроводных устройств на системах-на-кристалле семейства SimpleLink компании TI»

Компания Компэл, совместно с Texas Instruments приглашают 26 июня принять участие в вебинаре, где инженер по применению беспроводных технологий компании TI расскажет, как на новых беспроводных системах можно реализовать несколько полезнейших в повседневной жизни функций для ваших устройств.
С развитием элементной базы TI становится возможной реализация более удобных, функциональных и безопасных систем, недоступных ранее.
Вебинар проводит инженер по применению беспроводных технологий в TI Мари Хернес(будет дублированный перевод).
Подробнее>>
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Вс окт 15, 2017 17:38:38 
Электрический кот
Аватар пользователя

Карма: 19
Рейтинг сообщений: 116
Зарегистрирован: Ср янв 29, 2014 09:41:31
Сообщений: 1028
Откуда: Баку
Рейтинг сообщения: 0
В данном случае stm32f4xx.h - заголовочный файл целой серии МК, и он может быть написан также создателем компилятора, поэтому связывать его с производителем не нужно.

_________________
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Вс окт 15, 2017 17:46:23 
Мучитель микросхем
Аватар пользователя

Карма: 6
Рейтинг сообщений: 83
Зарегистрирован: Пн янв 10, 2011 00:05:37
Сообщений: 423
Откуда: СССР
Рейтинг сообщения: 3
Препроцессор заменит GPIOA на ((GPIO_TypeDef *)0x40020000)

когда вы напишете конструкцию

Код:
uint32_t idr = GPIOA->IDR;


препроцессор заменит её на

Код:
uint32_t idr = ((GPIO_TypeDef *)0x40020000)->IDR;


Далее компилятор возьмет смещение поля IDR в структуре (0x10) и прибавит его к адресу структуры и соорудит что-то типа

Код:
uint32_t idr = *((__IO uint32_t*)0x40020010);

_________________
Иван Сусанин - первый полупроводник :solder:


Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Вс окт 15, 2017 18:26:07 
Первый раз сказал Мяу!

Зарегистрирован: Вс янв 15, 2017 19:02:24
Сообщений: 21
Рейтинг сообщения: 0
Препроцессор заменит GPIOA на ((GPIO_TypeDef *)0x40020000)

когда вы напишете конструкцию

Код:
uint32_t idr = GPIOA->IDR;


препроцессор заменит её на

Код:
uint32_t idr = ((GPIO_TypeDef *)0x40020000)->IDR;


Далее компилятор возьмет смещение поля IDR в структуре (0x10) и прибавит его к адресу структуры и соорудит что-то типа

Код:
uint32_t idr = *((__IO uint32_t*)0x40020010);


Спасибо, теперь картина, вроде бы проясняется.


Вернуться наверх
 
Prist.ru предлагает скидку всем частным лицам при покупке приборов АКИП, GW Instek, APPA (кроме осциллографов АКИП-4115/1А, GDS-71102)!

Интересные новинки уже на складе:

Осциллограф АКИП-4126Е

Многоканальные источники питания серии GPP

Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Вс окт 15, 2017 19:45:03 
Друг Кота
Аватар пользователя

Карма: 69
Рейтинг сообщений: 1176
Зарегистрирован: Вс мар 29, 2009 23:09:05
Сообщений: 7415
Рейтинг сообщения: 0
Цитата:
Этой строчкой мы создаем указатель GPIOA на структуру типа GPIO_TypeDef.


Нет. Этой строчкой мы приводим GPIOA_BASE (константа-дефайн, определенная где-то выше) к типу "указатель на GPIO_TypeDef".

Проще говоря, это один из способов наложить структуру GPIO_TypeDef на область памяти, начиная с ячейки номер GPIOA_BASE.

Таким образом, компилятор будет знать, что GPIOA - синоним указателя на структуру типа GPIO_TypeDef, расположенную в памяти начиная с GPIOA_BASE.

Кстати, если что, обращение

GPIOA->ODR

эквивалентно

(*GPIOA).ODR.

Так что можно было бы написать

#define GPIOA (*((GPIO_TypeDef *)GPIOA_BASE))

и дальше писать

GPIOA.ODR.

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Купить электронные компоненты в LCSC

Отправка со склада через 4 часа после заказа!
900 000 пользователей, 3000+ заказов в день!
Зарегистрируйтесь сегодня и получите скидку 8 долларов на первый заказ!
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Вс окт 15, 2017 20:00:47 
Друг Кота
Аватар пользователя

Карма: 28
Рейтинг сообщений: 143
Зарегистрирован: Пн июл 28, 2008 23:12:01
Сообщений: 3465
Рейтинг сообщения: 0
В данном случае stm32f4xx.h - заголовочный файл целой серии МК, и он может быть написан также создателем компилятора, поэтому связывать его с производителем не нужно.

Неа, хэдеры периферии пишет вендор.
Это требование CMSIS, читаем спецификацию на CMSIS...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Вс окт 15, 2017 20:05:27 
Первый раз сказал Мяу!

Зарегистрирован: Вс янв 15, 2017 19:02:24
Сообщений: 21
Рейтинг сообщения: 0
Цитата:
Этой строчкой мы создаем указатель GPIOA на структуру типа GPIO_TypeDef.


Нет. Этой строчкой мы приводим GPIOA_BASE (константа-дефайн, определенная где-то выше) к типу "указатель на GPIO_TypeDef".

Проще говоря, это один из способов наложить структуру GPIO_TypeDef на область памяти, начиная с ячейки номер GPIOA_BASE.


Я до сих пор, до конца не могу понять, как именно происходит приведение константы к типу. Как, с вашей точки зрения, происходит это на белее низком уровне.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Вс окт 15, 2017 20:35:16 
Мучитель микросхем
Аватар пользователя

Карма: 6
Рейтинг сообщений: 83
Зарегистрирован: Пн янв 10, 2011 00:05:37
Сообщений: 423
Откуда: СССР
Рейтинг сообщения: 0
Это скорее арифметика указателей, а не приведение константы к типу. На основе констант рассчитываются указатели. У нас есть адрес
в памяти и структура описывающая смещения относительно этого адреса.

Если посмотреть на комментарий структуры

Код:
__IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */


Address offset это и есть смещение каждого поля относительно адреса в памяти. Собственно чтоб предоставить удобную форму отображения смещения эта структура и нужна, чтобы вместо

Код:
uint32_t idr = *((__IO uint32_t*)(0x40020000+ 0x00000010));


использовать

Код:
uint32_t idr = GPIOA->IDR;

_________________
Иван Сусанин - первый полупроводник :solder:


Последний раз редактировалось Myp3ik Вс окт 15, 2017 20:44:06, всего редактировалось 2 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Вс окт 15, 2017 20:40:44 
Друг Кота
Аватар пользователя

Карма: 69
Рейтинг сообщений: 1176
Зарегистрирован: Вс мар 29, 2009 23:09:05
Сообщений: 7415
Рейтинг сообщения: 8
Цитата:
Я до сих пор, до конца не могу понять, как именно происходит приведение константы к типу.


Для начала требуется осознать, что на уровне железа типов нет. Есть только огромный линейный массив байт, каждый из которых пронумерован. Интерпретировать их можно как угодно.

Для компилятора тип - это правило, по которому он будет интерпретировать один или несколько байт, расположенных начиная с заданного адреса.

"Приведение к типу" - переопределение правила, по которому компилятор будет обращаться к байтам по указанному адресу.

int32_t x; - "компилятор, выбери какой хочешь адрес в оперативной памяти, и начиная с него зарезервируй четыре байта, которые интерпретируй в дальнейшем как целое число со знаком; а называться эти четыре байта будут x".

Компилятор понимает это, и в дальнейшем будет обращаться с этими четырьмя байтами как с целым тридцатидвухибитным числом (big endian или little endian - зависит от соглашения), причем при вычислениях будет использовать дополнительный код, чтобы учитывать знак.

Начнем с простого.

temp1 = &x; - "компилятор, запиши в temp1 стартовый адрес той области, которая x". При этом компилятор знает, что к этой области надо обращаться по правилам, адекватным для целого числа со знаком. Теперь если мы напишем

(*temp) = 500;

компилятор запишет в x (потому что в temp лежит адрес x) число 500 (0x000001F4) с учетом установленных правил. То есть, в случае little endian, запишет 0xF4 в байт с самым младшим адресом, 0x01 в следующий и обнулит остальные два.

Теперь будем приводить типы.

y = *((uint8_t *)(&x)); - "компилятор, мы договаривались, что по адресу, содержимое которого мы называли x, лежит целое тридцатидвухбитное. Теперь сделай вид, что там целое беззнаковое восьмибитное, и прочти его по этому правилу."

Компилятор прочтет один байт с адреса, по которому лежит x. А там, с учетом присвоения выше, лежит 0xF4 (244 в десятичной системе счисления). Вот это число и будет записано в y.

z = ((uint8_t *)(&x))[1]; - "компилятор, интерпретируй стартовый адрес x как указатель на массив беззнаковых целых, и излеки из него первое значение."

В z окажется 1. Понимаете, почему? :)

В случае константного адреса все происходит так же, только мы не даем компилятору произвольно выбрать адрес, а жестко диктуем его значение.

((uint8_t *)0x100) - "компилятор, понимай 0x100 как номер ячейки, начиная с которой лежит беззнаковое целое восьмибитное число."

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Чт окт 19, 2017 23:14:18 
Прорезались зубы
Аватар пользователя

Карма: 2
Рейтинг сообщений: 11
Зарегистрирован: Сб янв 14, 2012 23:53:50
Сообщений: 225
Рейтинг сообщения: 0
YS Браво, просто винрарнейший ликбез по работе с памятью. :beer: Схоронил для потомков.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Пт окт 20, 2017 10:05:01 
Друг Кота
Аватар пользователя

Карма: 69
Рейтинг сообщений: 1176
Зарегистрирован: Вс мар 29, 2009 23:09:05
Сообщений: 7415
Рейтинг сообщения: 0
Я рад, что вам понравилось. :)

Ну вот, мои труды уже входят в наследие для потомков. :)))

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Сб окт 21, 2017 21:09:24 
Первый раз сказал Мяу!

Зарегистрирован: Вс янв 15, 2017 19:02:24
Сообщений: 21
Рейтинг сообщения: 0
Я тоже написал, что мне это помогло, но почему то это не отобразилось, только сейчас заметил. Хорошая работа.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Сб окт 21, 2017 21:29:32 
Друг Кота
Аватар пользователя

Карма: 69
Рейтинг сообщений: 1176
Зарегистрирован: Вс мар 29, 2009 23:09:05
Сообщений: 7415
Рейтинг сообщения: 0
А я-то думал, зачем вы цитируете мое сообщение целиком... :) Кстати странно, что модераторы еще не задались этим же вопросом. :wink:

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Пн апр 01, 2019 15:48:35 
Родился

Зарегистрирован: Вт май 04, 2010 23:04:50
Сообщений: 8
Рейтинг сообщения: 0
Я рад, что вам понравилось. :)

Ну вот, мои труды уже входят в наследие для потомков. :)))



Мне тоже понравилось!)
Скину в txt и распечатаю.
До прочтения вашего поста у меня было мнение, что "ну не умеют программисты объяснять/преподавать, не умеют, сколько раз проверяли!!!!!"
Но нет, бывают исключения :)

PS: последнее, где массив [1]- непонятно(((


Последний раз редактировалось Sanchosd Вт апр 02, 2019 08:07:50, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Пн апр 01, 2019 23:08:47 
Друг Кота
Аватар пользователя

Карма: 69
Рейтинг сообщений: 1176
Зарегистрирован: Вс мар 29, 2009 23:09:05
Сообщений: 7415
Рейтинг сообщения: 3
Воу, два года прошло, а это еще кто-то читает. :)

Кстати там опечатка, только заметил... Присваиваю я там в "temp1", а потом рассуждаю про "temp". Но, видимо, все эти два года и так было понятно... Даже не знаю, править теперь, или нет.

Цитата:
последнее, где массив [1]- непонятно(((


Скобочки - синтаксический сахар (красивая запись) для инкремента указателя с его последующим разыменованием.

То есть, записи

a[x] = N;

и

*(a+x) = N;

эквивалентны.

То есть,

z = ((uint8_t *)(&x))[1]

есть то же самое, что

z = *(((uint8_t *)(&x)) + 1);

а это извлечение второго байта начиная с адреса &x.

Цитата:
До прочтения вашего поста у меня было мнение, что "ну не умеют программисты объяснять/преподавать, не умеют, сколько раз проверяли!!!!!"


Это, наверное, оттого, что я не программист, а электронщик. :)

Всяко, я рад, что мой пост имеет такой успех. :)

_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32 и работа со стуктурами и указателями
СообщениеДобавлено: Пн апр 01, 2019 23:23:22 
Модератор
Аватар пользователя

Карма: 77
Рейтинг сообщений: 781
Зарегистрирован: Пт мар 19, 2010 00:09:57
Сообщений: 4030
Откуда: Планета Земля
Рейтинг сообщения: 3
Медали: 1
Получил миской по аватаре (1)
PS: последнее, где массив [1]- непонятно(((

Всё очень просто. Имя любого массива - указатель (константа). По этому любой указатель можно интерпретировать как имя массива.
Например :
Код:
int *p = bla-bla-bla...
Тогда
Код:
p[1]
будет уазывать на адрес 2-ого элемента по указателю. Т.е. со смещением на sizeof(int).

_________________
Я мненью вашему вращенье придавал, а осью был - мой детородный орган.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 54 ]  1, ,  

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y