Революция по имени Arduino

8-битные микроконтроллеры AVR (AT90, ATtiny, ATmega) от Atmel (в настоящий момент принадлежит Microchip)

Moderator: Shaos

Post Reply
User avatar
Lavr
Supreme God
Posts: 16639
Joined: 21 Oct 2009 15:08
Location: Россия

Re: Революция по имени Arduino

Post by Lavr »

Mildi wrote: 04 Jan 2025 16:41...пишешь на чистом С/С++ в Ардуино ИДЕ и получаешь код почти без лишнего мусора по быстродействию на уровне других компиляторов С/С++.
Вот что "код почти без лишнего мусора" я бы, пожалуй, не согласился... :-?
Довелось мне в этот раз посмотреть, какой код делает С/С++, как говорится, не было счастья, да несчастье помогло! :wink:

Никак у меня таймер не работал, как в даташите написано, и полез я в Интернет, посмотреть как люди делают...
А люди все модные! На С/С++ пишут, ну мануал по-русски как я понимают! Т.е. по идее делают то же самое...
И выяснилась неожиданная вещь: в Proteus 7.7 в модели ATMega встроен дизассемблер для отладки!
То есть, он код С/С++ позволяет дебужить без исходника...
Ну я и увидел, как С/С++ организует прерывание таймера:

Code: Select all

;-----(TIMER1 COMPA)Timer/Counter1 Compare Match A --- ***
M00C4:
       PUSH   R1      ;
       PUSH   R0      ;
       IN     R0,$3F  ; SREG - Status Register, флаги
       PUSH   R0      ; сохранить
       CLR    R1
       PUSH   R18
       PUSH   R19
       PUSH   R20
       PUSH   R21
       PUSH   R22
       PUSH   R23
       PUSH   R24
       PUSH   R25
       PUSH   R26
       PUSH   R27
       PUSH   R30
       PUSH   R31
       LDS    R24,$0060
       CPI    R24,$0A
       BRCS   M00F2

       STS    $0060, R1
M00F2:
       LDS    R24,$0060
       RCALL  M005C ; $-009A
       LDS    R24,$0060
       SUBI   R24,$FF
       STS    $0060,R24
       POP    R31
       POP    R30
       POP    R27
       POP    R26
       POP    R25
       POP    R24
       POP    R23
       POP    R22
       POP    R21
       POP    R20
       POP    R19
       POP    R18
       POP    R0
       OUT    $3F,R0
       POP    R0
       POP    R1
       RETI
Я думаю, что руками на ассемблере никто такого бы не написал... :wink:
iLavr
Электромонтёр
Fanat
Posts: 97
Joined: 24 Feb 2018 05:20
Contact:

Re: Революция по имени Arduino

Post by Электромонтёр »

Mondx wrote: 03 Jan 2025 09:19
Электромонтёр wrote: 03 Jan 2025 08:38 Я ардуину использовал оочень недолго, а потом продал знакомому. Там был какой-то глюк компилятора, и если менять местами две строчки с независимыми операциями типа а+б и в+г то поведение мк менялось.
Ну да, конечно! Там ТАКОЙ глючный компилятор, глюк на глюке, прям, ужос. Особенно поначалу. А пример не дашь? Что б самому не наступить. Заодно и проверим.
Пример не сохранился. Там действительно были две логически независимые операции, шли последовательно. Если их менять местами, то поведение микроконтроллера менялось. Я не пользовался опросом пинов и читал и писал прямо в порт. Пример был написан в 2016 и не сохранился. Ни до, ни после такого не было. До ардуины иногда программировал пики на астме, с си столкнулся только на мультиклете. Мультиклетовский сишный компилятор, сырой самопал команды Бориса Зырянова тоже фокусов не выкидывал, а вот ошибки в кристалле у Мультиклета были. Так что мне есть с чем сравнить.

Бывало, когда компилятор GCC выкидывал переменную при оптимизации, тогда надо было прописывать volatile. Но ардуиновский компилятор он же для чайников и должон такие моменты автоматом отрабатывать, не?
Lavr wrote: 04 Jan 2025 00:36
Mondx wrote: 31 Dec 2024 09:46А тогда, при переносе на другой МК, правится только ввод вывод в хедере. Всё это в одном месте.
Вот это и называется:"Благими намерениями выстлана дорога в Адъ!" :mrgreen:
Нифига код так просто не переносится даже между близкими МК.

Вот живой пример: после НГ решил я перенести вот этот довольно простой проект:
viewtopic.php?t=9459&start=30
на простую ATMega8 в DIP корпусе, благо их есть у меня...

Сутки вчера башку ломал, переписывая работу ТС2 в режиме СТС. :roll:

А по началу тоже думал, вон автор проекта поменял хедеры, и - ура! :lol:

Code: Select all

;.include "m328pdef.inc"
.include "m168def.inc"
Но, как оказалось, ТС2 в режиме СТС и по родному мануалу ATMega8 не совсем
точно работает, если вникать в детали. :-?
Не совсем. Если писать библиотеку с минимальной привязкой к железу, то не сильно сложный код вполне портабелен. Я так написал библиотеку логических функций с STM32 на STM8. Практически были заменены только драйвера работы с портами и АЦП. Сама библиотека была подвергнута минимальным изменениям. Но если привязка именно к конкретной периферии, то будут сложности. Именно для упрощения для STM32 вместо SPL стали продвигать HAL. Как бы этот HAL не ругали за жор программной памяти, у нас третье десятилетие двадцать первого века на дворе, килобайты уже никто не экономит.
Mondx
Doomed
Posts: 464
Joined: 10 Aug 2022 14:27

Re: Революция по имени Arduino

Post by Mondx »

Lavr wrote: 11 Jan 2025 23:43 Ну я и увидел, как С/С++ организует прерывание таймера:

Code: Select all

;-----(TIMER1 COMPA)Timer/Counter1 Compare Match A --- ***
M00C4:
       PUSH   R1      ;
       PUSH   R0      ;
       IN     R0,$3F  ; SREG - Status Register, флаги
       PUSH   R0      ; сохранить
       CLR    R1
       PUSH   R18
       PUSH   R19
       PUSH   R20
       PUSH   R21
       PUSH   R22
       PUSH   R23
       PUSH   R24
       PUSH   R25
       PUSH   R26
       PUSH   R27
       PUSH   R30
       PUSH   R31
       LDS    R24,$0060
       CPI    R24,$0A
       BRCS   M00F2

       STS    $0060, R1
M00F2:
       LDS    R24,$0060
       RCALL  M005C ; $-009A
       LDS    R24,$0060
       SUBI   R24,$FF
       STS    $0060,R24
       POP    R31
       POP    R30
       POP    R27
       POP    R26
       POP    R25
       POP    R24
       POP    R23
       POP    R22
       POP    R21
       POP    R20
       POP    R19
       POP    R18
       POP    R0
       OUT    $3F,R0
       POP    R0
       POP    R1
       RETI
Я думаю, что руками на ассемблере никто такого бы не написал... :wink:
Потому что

Code: Select all

       RCALL  M005C ; $-009A
в обработчике. Компилятор не может знать какие регистры там используются.
User avatar
Lavr
Supreme God
Posts: 16639
Joined: 21 Oct 2009 15:08
Location: Россия

Re: Революция по имени Arduino

Post by Lavr »

Mondx wrote: 22 Jan 2025 04:38Компилятор не может знать какие регистры там используются.
А почему бы нет? Вполне может, если это хороший компилятор! :wink:
И нет смысла его оправдывать, если код хуже, чем руками на ассемблере.
iLavr
User avatar
Lavr
Supreme God
Posts: 16639
Joined: 21 Oct 2009 15:08
Location: Россия

Re: Революция по имени Arduino

Post by Lavr »

Электромонтёр wrote: 21 Jan 2025 16:38Если писать библиотеку с минимальной привязкой к железу, то не сильно сложный код вполне портабелен.
Вот я тоже всегда говорю, что наиболее портабелен код на Basic, а не на С. (жизненный опыт) :wink:
Видимо, Уильям Генри Гейц III постарался, он же с гордостью носил титул Basic programmer. :lol:
iLavr
User avatar
Shaos
Admin
Posts: 23733
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: Революция по имени Arduino

Post by Shaos »

А ну ка покажи ка нам как будет выглядеть обработчик прерывания на Бейсике :lol:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16639
Joined: 21 Oct 2009 15:08
Location: Россия

Re: Революция по имени Arduino

Post by Lavr »

Shaos wrote: 22 Jan 2025 21:10 А ну ка покажи ка нам как будет выглядеть обработчик прерывания на Бейсике :lol:
А что хорошего мне за это будет? :wink: Ты не лови старого мальчика на слабО! :ebiggrin:
iLavr
User avatar
Shaos
Admin
Posts: 23733
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: Революция по имени Arduino

Post by Shaos »

Это была шутка юмора - лопата :mrgreen:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16639
Joined: 21 Oct 2009 15:08
Location: Россия

Re: Революция по имени Arduino

Post by Lavr »

Shaos wrote: 22 Jan 2025 22:12 Это была шутка юмора - лопата :mrgreen:
Ну тогда это - бояяян... :[|||]: :ebiggrin:
iLavr
Mondx
Doomed
Posts: 464
Joined: 10 Aug 2022 14:27

Re: Революция по имени Arduino

Post by Mondx »

Приобщаемся. Блинк.
Класичный:

Code: Select all

#define LED               LED_BUILTIN
#define LED_PERIOD        1000

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED, HIGH);
  delay(LED_PERIOD / 2);
  digitalWrite(LED, LOW);
  delay(LED_PERIOD / 2);
}
Скетч использует 924 байт (3%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти

Сокращённый:

Code: Select all

#define LED               LED_BUILTIN
#define LED_PERIOD        1000

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED, !digitalRead(LED));
  delay(LED_PERIOD / 2);
}
Скетч использует 960 байт (3%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти

Без фреймворка:

Code: Select all

#define LED               5
#define LED_DDR           DDRB
#define LED_PIN           PINB
#define LED_PERIOD        1000

int main() {
  while (LED_DDR |= 1<<LED) {
    _delay_ms(LED_PERIOD / 2);
    LED_PIN = 1<<LED;
  }
}
Скетч использует 158 байт (0%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 0 байт (0%) динамической памяти

Без фреймворка и библиотек:

Code: Select all

#define LED               5
#define LED_DDR           DDRB
#define LED_PIN           PINB
#define LED_PERIOD        600000

int main() {
  while (LED_DDR |= 1<<LED)
    for (static uint32_t i; ++i >= LED_PERIOD / 2; i = 0)
      LED_PIN = 1<<LED;
}
Скетч использует 220 байт (0%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 4 байт (0%) динамической памяти
Last edited by Mondx on 23 Jan 2025 07:16, edited 1 time in total.
User avatar
FizikS
Maniac
Posts: 251
Joined: 11 Oct 2018 07:52
Location: г. Клинцы, Брянская обл.

Re: Революция по имени Arduino

Post by FizikS »

Mondx wrote: 23 Jan 2025 05:52 Приобщаемся. Блинк.
....
Нужно было добавить в конце каждого примера отчет по компиляции (сколько байт займет прошивка).
Будет сразу понятно, что классический блинк можно сильно поужать, используя работу с портами и чистый Цэ, а не то, что рекомендуют "свидетели Ардуино"
Mondx
Doomed
Posts: 464
Joined: 10 Aug 2022 14:27

Re: Революция по имени Arduino

Post by Mondx »

FizikS wrote: 23 Jan 2025 06:52 Нужно было добавить в конце каждого примера отчет по компиляции (сколько байт займет прошивка).
Добавил. Хотя, думал что это каждый в состоянии сделать.
И тут идея не в объёме кода, а в разных вариантах реализации.
Минимальный блинк тоже можно рассмотреть.)
Mondx
Doomed
Posts: 464
Joined: 10 Aug 2022 14:27

Re: Революция по имени Arduino

Post by Mondx »

Lavr wrote: 22 Jan 2025 20:19
Mondx wrote: 22 Jan 2025 04:38Компилятор не может знать какие регистры там используются.
А почему бы нет? Вполне может, если это хороший компилятор! :wink:
Какой это хороший?
User avatar
Lavr
Supreme God
Posts: 16639
Joined: 21 Oct 2009 15:08
Location: Россия

Re: Революция по имени Arduino

Post by Lavr »

Mondx wrote: 23 Jan 2025 14:54
Lavr wrote: 22 Jan 2025 20:19
Mondx wrote: 22 Jan 2025 04:38Компилятор не может знать какие регистры там используются.
А почему бы нет? Вполне может, если это хороший компилятор! :wink:
Какой это хороший?
Такой, который вполне может.
iLavr
Mondx
Doomed
Posts: 464
Joined: 10 Aug 2022 14:27

Re: Революция по имени Arduino

Post by Mondx »

Lavr wrote: 24 Jan 2025 19:16Такой, который вполне может.
Ардуино использует GCC. Лучше только IAR, но стоит больших денег. Других нет.
И никто не может.
Post Reply