STM32 новичку в ARM что к чему
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
- Реклама
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
[uquote="VladislavS",url="/forum/viewtopic.php?p=3905235#p3905235"]...рискну предположить, что gpio_one_pin это таки функция[/uquote]
Ха, мимо!!!
Ха, мимо!!!
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
Я подскажу - в параметрах макроса структура с нулевым размером.
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Семикратная вложенность -- чет мне кажется, что многовато даже для структуры.
Вангую конкурс лучшая автоматизация периферии на Си 
Вот лучше бы профи собрались вместе и написали годную автоматизацию у каждого есть свои секреты и наработки надо обьединить их в кучу. По крайней мере это уже можно было бы выкатить за некий стандарт. А то каждый программирует по своему это бред.
Именно по этой причине я топлю за CMSIS программирование без самодеятельности и на си. Это поймут все! Легкая отладка и понимание. Достаточно базового Си и мануала.
Вот лучше бы профи собрались вместе и написали годную автоматизацию у каждого есть свои секреты и наработки надо обьединить их в кучу. По крайней мере это уже можно было бы выкатить за некий стандарт. А то каждый программирует по своему это бред.
Именно по этой причине я топлю за CMSIS программирование без самодеятельности и на си. Это поймут все! Легкая отладка и понимание. Достаточно базового Си и мануала.
Последний раз редактировалось Oxford Пн окт 12, 2020 00:02:58, всего редактировалось 1 раз.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Реклама
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
Да, вы уже близко, совсем близко.
Я лучше покажу во что превращается выполнение той портянки инициализации FMC и прочей фигни:
blx r4 - Переход на функцию, которая инициирует всего один пин, в r0 находится параметр - то, во что превращается структура с нулевым размером.
Сама функция zap_gpio_one_pin() весит 212 байт, и является частью многократно вложенного макроса.
Я лучше покажу во что превращается выполнение той портянки инициализации 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
Сама функция zap_gpio_one_pin() весит 212 байт, и является частью многократно вложенного макроса.
в рантайме генерация идет чтоли?
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="AVI-crak",url="/forum/viewtopic.php?p=3905272#p3905272"]Я лучше покажу во что превращается выполнение той портянки инициализации FMC и прочей фигни[/uquote]
Каким образом 59 вызовов gpio_one_pin() превратились в 30 blx?
Каким образом 59 вызовов gpio_one_pin() превратились в 30 blx?
Вот все ругают ардуино и хал, а ведь все равно все пытаются скатиться к ней. Абстрагироваться от железо и сделать универсально. Так чем же плох CubeMx развитие от ST? Готовый кодогенератор под разные IDE, есть визуальная конфигурация проекта, подробный мануал.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
Есно нет, там кода на 8к строк, но оно полностью оптимизируется до нуля. Остаётся вызов функции с одним параметром - для одного пина.
Макрос переводит параметр в виде структуры как текст, после анализа текста получается полностью заполненная структура на 4 байта, которая уже передаётся в реальную функцию.
Reflector - GCC очень оптимизированный язык, он постоянно что-то делает, даже когда его не просят об этом. Я просто показал момент, где он занимается только вызовом функции zap_gpio_one_pin(). Там дальше слишком много лишнего.
Макрос переводит параметр в виде структуры как текст, после анализа текста получается полностью заполненная структура на 4 байта, которая уже передаётся в реальную функцию.
Reflector - GCC очень оптимизированный язык, он постоянно что-то делает, даже когда его не просят об этом. Я просто показал момент, где он занимается только вызовом функции zap_gpio_one_pin(). Там дальше слишком много лишнего.
Gcc не язык, компилятор
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
[uquote="Oxford",url="/forum/viewtopic.php?p=3905285#p3905285"]Абстрагироваться от железо и сделать универсально.[/uquote]
У меня полностью наоборот, код установки пинов привязан к конкретному чипу в конкретном корпусе, с конкретным количеством ног. Потому как выяснилось что взаимозаменяемость у чипов ST - около_нулевая.
У меня полностью наоборот, код установки пинов привязан к конкретному чипу в конкретном корпусе, с конкретным количеством ног. Потому как выяснилось что взаимозаменяемость у чипов ST - около_нулевая.
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Даже если принять, что инициализация одного пина -- это команда загрузки параметров и команда вызова функции, то совокупно получится 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
[uquote="a5021",url="/forum/viewtopic.php?p=3905294#p3905294"]Как-бы дофига, если сравнивать с тем, что у меня[/uquote]
У него F7, считай что таким образом один AFR проинитил...
У него F7, считай что таким образом один AFR проинитил...
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
Ну на 16 отдельных линий есно больше получится. Но я точно уверен, что не допущу ошибок и смогу понять код даже через год.
Например такой:
Более того, портировать код на другой мк получится ещё быстрее, в среднем за 15 минут.
Например такой:
Код: Выделить всё
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- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[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 команд на порт. Один фиг, в разы. Плюс нет вызовов и какого-то дополнительного стороннего кода. И быстрее и компактней.
У него F7, считай что таким образом один AFR проинитил...[/uquote]
AFR -- два слова, требует четырех команд. Остальные регистры однословные и потребуется, где две, где три команды. Максимально это 15-16 команд на порт. Один фиг, в разы. Плюс нет вызовов и какого-то дополнительного стороннего кода. И быстрее и компактней.
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
[uquote="a5021",url="/forum/viewtopic.php?p=3905301#p3905301"]Максимально это 15-16 команд на порт.[/uquote]
Да причём тут весь порт? У меня функция для инициализации одного контакта - универсальная, весом 212 байт. Именно столько она занимает в прошивке.
Когда я говорю что невозможно допустить ошибку - я имею в виду именно этот факт (там просто нет других вариантов).
Да причём тут весь порт? У меня функция для инициализации одного контакта - универсальная, весом 212 байт. Именно столько она занимает в прошивке.
Когда я говорю что невозможно допустить ошибку - я имею в виду именно этот факт (там просто нет других вариантов).
- Вложения
-
- Temp33.jpg
- (107.95 КБ) 165 скачиваний
капец. это ты все ноги описал. Ремап тоже прописал?
А конфигурируешь чип в CubeMX? И потом уже смотришь ноги и программируешь?
А конфигурируешь чип в CubeMX? И потом уже смотришь ноги и программируешь?
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="AVI-crak",url="/forum/viewtopic.php?p=3905272#p3905272"][/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 это собирается?
Код: Выделить всё
20001D2C ldr r0, [pc, #524] ; (0x20001f3c <SystemInit+1480>)
20001D2E blx r4[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 это собирается?
VladislavS по факту этого ничего не нужно. Достаточно cmsis и си. но ты можешь дальше стряпать либы 
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford


