STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Слабое подобие куба, штоле?
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17

Сообщение AVI-crak »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3905235#p3905235"]...рискну предположить, что gpio_one_pin это таки функция[/uquote]
Ха, мимо!!!
Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17

Сообщение AVI-crak »

Я подскажу - в параметрах макроса структура с нулевым размером.
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Семикратная вложенность -- чет мне кажется, что многовато даже для структуры.
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Вангую конкурс лучшая автоматизация периферии на Си :tea:
Вот лучше бы профи собрались вместе и написали годную автоматизацию у каждого есть свои секреты и наработки надо обьединить их в кучу. По крайней мере это уже можно было бы выкатить за некий стандарт. А то каждый программирует по своему это бред.

Именно по этой причине я топлю за CMSIS программирование без самодеятельности и на си. Это поймут все! Легкая отладка и понимание. Достаточно базового Си и мануала.
Последний раз редактировалось Oxford Пн окт 12, 2020 00:02:58, всего редактировалось 1 раз.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17

Сообщение AVI-crak »

Да, вы уже близко, совсем близко.
Я лучше покажу во что превращается выполнение той портянки инициализации FMC и прочей фигни:
Спойлер

Код: Выделить всё

20001D2C	ldr	r0, [pc, #524]	; (0x20001f3c <SystemInit+1480>)
20001D2E	blx	r4
20001D30	ldr	r0, [pc, #524]	; (0x20001f40 <SystemInit+1484>)
20001D32	blx	r4
20001D34	ldr	r0, [pc, #524]	; (0x20001f44 <SystemInit+1488>)
20001D36	blx	r4
20001D38	ldr	r0, [pc, #524]	; (0x20001f48 <SystemInit+1492>)
20001D3A	blx	r4
20001D3C	ldr	r0, [pc, #524]	; (0x20001f4c <SystemInit+1496>)
20001D3E	blx	r4
20001D40	ldr	r0, [pc, #524]	; (0x20001f50 <SystemInit+1500>)
20001D42	blx	r4
20001D44	ldr	r0, [pc, #524]	; (0x20001f54 <SystemInit+1504>)
20001D46	blx	r4
20001D48	ldr	r0, [pc, #524]	; (0x20001f58 <SystemInit+1508>)
20001D4A	blx	r4
20001D4C	ldr	r0, [pc, #524]	; (0x20001f5c <SystemInit+1512>)
20001D4E	blx	r4
20001D50	ldr	r0, [pc, #524]	; (0x20001f60 <SystemInit+1516>)
20001D52	blx	r4
20001D54	ldr	r0, [pc, #524]	; (0x20001f64 <SystemInit+1520>)
20001D56	blx	r4
20001D58	ldr	r0, [pc, #524]	; (0x20001f68 <SystemInit+1524>)
20001D5A	blx	r4
20001D5C	ldr	r0, [pc, #524]	; (0x20001f6c <SystemInit+1528>)
20001D5E	blx	r4
20001D60	ldr	r0, [pc, #524]	; (0x20001f70 <SystemInit+1532>)
20001D62	blx	r4
20001D64	ldr	r0, [pc, #524]	; (0x20001f74 <SystemInit+1536>)
20001D66	blx	r4
20001D68	ldr	r0, [pc, #524]	; (0x20001f78 <SystemInit+1540>)
20001D6A	blx	r4
20001D6C	ldr	r0, [pc, #524]	; (0x20001f7c <SystemInit+1544>)
20001D6E	blx	r4
20001D70	ldr	r0, [pc, #524]	; (0x20001f80 <SystemInit+1548>)
20001D72	blx	r4
20001D74	ldr	r0, [pc, #524]	; (0x20001f84 <SystemInit+1552>)
20001D76	blx	r4
20001D78	ldr	r0, [pc, #524]	; (0x20001f88 <SystemInit+1556>)
20001D7A	blx	r4
20001D7C	mov.w	r0, #33536	; 0x8300
20001D80	blx	r4
20001D82	movw	r0, #33539	; 0x8303
20001D86	blx	r4
20001D88	ldr	r0, [pc, #512]	; (0x20001f8c <SystemInit+1560>)
20001D8A	blx	r4
20001D8C	ldr	r0, [pc, #512]	; (0x20001f90 <SystemInit+1564>)
20001D8E	blx	r4
20001D90	movw	r0, #36360	; 0x8e08
20001D94	blx	r4
20001D96	ldr	r0, [pc, #508]	; (0x20001f94 <SystemInit+1568>)
20001D98	blx	r4
20001D9A	ldr	r0, [pc, #508]	; (0x20001f98 <SystemInit+1572>)
20001D9C	blx	r4
20001D9E	ldr	r0, [pc, #508]	; (0x20001f9c <SystemInit+1576>)
20001DA0	blx	r4
20001DA2	ldr	r0, [pc, #508]	; (0x20001fa0 <SystemInit+1580>)
20001DA4	blx	r4
20001DA6	movw	r0, #36376	; 0x8e18
20001DAA	blx	r4
blx r4 - Переход на функцию, которая инициирует всего один пин, в r0 находится параметр - то, во что превращается структура с нулевым размером.
Сама функция zap_gpio_one_pin() весит 212 байт, и является частью многократно вложенного макроса.
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

в рантайме генерация идет чтоли?
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="AVI-crak",url="/forum/viewtopic.php?p=3905272#p3905272"]Я лучше покажу во что превращается выполнение той портянки инициализации FMC и прочей фигни[/uquote]
Каким образом 59 вызовов gpio_one_pin() превратились в 30 blx?
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Вот все ругают ардуино и хал, а ведь все равно все пытаются скатиться к ней. Абстрагироваться от железо и сделать универсально. Так чем же плох CubeMx развитие от ST? Готовый кодогенератор под разные IDE, есть визуальная конфигурация проекта, подробный мануал.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17

Сообщение AVI-crak »

Есно нет, там кода на 8к строк, но оно полностью оптимизируется до нуля. Остаётся вызов функции с одним параметром - для одного пина.
Макрос переводит параметр в виде структуры как текст, после анализа текста получается полностью заполненная структура на 4 байта, которая уже передаётся в реальную функцию.

Reflector - GCC очень оптимизированный язык, он постоянно что-то делает, даже когда его не просят об этом. Я просто показал момент, где он занимается только вызовом функции zap_gpio_one_pin(). Там дальше слишком много лишнего.
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Gcc не язык, компилятор
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17

Сообщение AVI-crak »

[uquote="Oxford",url="/forum/viewtopic.php?p=3905285#p3905285"]Абстрагироваться от железо и сделать универсально.[/uquote]
У меня полностью наоборот, код установки пинов привязан к конкретному чипу в конкретном корпусе, с конкретным количеством ног. Потому как выяснилось что взаимозаменяемость у чипов ST - около_нулевая.
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

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

Код: Выделить всё

0x08000350 4BCD      LDR      r3,[pc,#820]  ; @0x08000688
0x08000362 49CD      LDR      r1,[pc,#820]  ; @0x08000698
0x08000366 4ACD      LDR      r2,[pc,#820]  ; @0x0800069C
   538:   *(volatile uint64_t *) GPIOA = ( 
0x08000368 E9C13200  STRD     r3,r2,[r1,#0]
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3905294#p3905294"]Как-бы дофига, если сравнивать с тем, что у меня[/uquote]
У него F7, считай что таким образом один AFR проинитил...
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17

Сообщение AVI-crak »

Ну на 16 отдельных линий есно больше получится. Но я точно уверен, что не допущу ошибок и смогу понять код даже через год.
Например такой:

Код: Выделить всё

        gpio_one_pin(zap_gpio.C.pin04.out.speed3.lock_on);                         /// st7735_com
    gpio_one_pin(zap_gpio.C.pin05.out.speed3.lock_on);                         /// st7735_reset
    gpio_one_pin(zap_gpio.A.pin04.v_af05_i2s1_ws_spi1_nss.speed3.lock_on);     /// spi1_NSS
    gpio_one_pin(zap_gpio.A.pin05.v_af05_i2s1_ck_spi1_sck.speed3.lock_on);     /// spi1_scl
    gpio_one_pin(zap_gpio.A.pin07.v_af05_i2s1_sd_spi1_mosi.speed3.lock_on);    /// spi1_mi
Более того, портировать код на другой мк получится ещё быстрее, в среднем за 15 минут.
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3905297#p3905297"][uquote="a5021",url="/forum/viewtopic.php?p=3905294#p3905294"]Как-бы дофига, если сравнивать с тем, что у меня[/uquote]
У него F7, считай что таким образом один AFR проинитил...[/uquote]
AFR -- два слова, требует четырех команд. Остальные регистры однословные и потребуется, где две, где три команды. Максимально это 15-16 команд на порт. Один фиг, в разы. Плюс нет вызовов и какого-то дополнительного стороннего кода. И быстрее и компактней.
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17

Сообщение AVI-crak »

[uquote="a5021",url="/forum/viewtopic.php?p=3905301#p3905301"]Максимально это 15-16 команд на порт.[/uquote]
Да причём тут весь порт? У меня функция для инициализации одного контакта - универсальная, весом 212 байт. Именно столько она занимает в прошивке.
Когда я говорю что невозможно допустить ошибку - я имею в виду именно этот факт (там просто нет других вариантов).
Вложения
Temp33.jpg
(107.95 КБ) 165 скачиваний
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

капец. это ты все ноги описал. Ремап тоже прописал?
А конфигурируешь чип в CubeMX? И потом уже смотришь ноги и программируешь?
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="AVI-crak",url="/forum/viewtopic.php?p=3905272#p3905272"]

Код: Выделить всё

20001D2C	ldr	r0, [pc, #524]	; (0x20001f3c <SystemInit+1480>)
20001D2E	blx	r4
[/uquote]Таки я оказался прав. Загрузка константы и вызов функции.

[uquote="AVI-crak",url="/forum/viewtopic.php?p=3905272#p3905272"]Сама функция zap_gpio_one_pin() весит 212 байт, и является частью многократно вложенного макроса.[/uquote]Вы сделали достаточно сложную работу по расчёту константы на этапе компиляции. Осталось функцию, объединяющую всё это по портам, туда же увести и будет зачётно.

ЗЫ: Кстати, куб ведь по каждому чипу подобную базу имеет. Он в графическом интерфейсе по каждому пину все допустимые варианты показывает. Наверняка оттуда дёрнуть можно.

Добавлено after 33 minutes 50 seconds:
[uquote="AVI-crak",url="/forum/viewtopic.php?p=3905299#p3905299"]Но я точно уверен, что не допущу ошибок[/uquote]Да, такой ценой, но цель достигнута. Хейтеров не слушайте, они в паре битов ошибаются.

Добавлено after 57 minutes 45 seconds:
[uquote="AVI-crak",url="/forum/viewtopic.php?p=3905286#p3905286"]GCC очень оптимизированный язык.[/uquote]Боюсь спросить, а на чём-то кроме GCC это собирается?
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

VladislavS по факту этого ничего не нужно. Достаточно cmsis и си. но ты можешь дальше стряпать либы :tea:
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Ответить

Вернуться в «ARM»