Упрощение кода

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мужики, а правда, давайте замутим какой-нибудь конкурс для новичков?

Я лично готов поучаствовать в подборе задач(и), в судействе и в формировании призового фонда. В последний готов пожертвовать оригинальную, новенькую, в заводской упаковке плату. По-моему, вполне достойный приз. Наверняка, у любого из старожилов в СВХ тоже найдётся что-то не очень нужное себе, но вполне достойное для приза.

Если у кого-то из ветеранов есть желание, давайте откроем специальную тему и замутим конкурс с подведением итогов к следующему дню Святого Нуба.

Вы как?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kakmyc пишет:

Вариант с назначением порта 142байта

int main() { 
    DDRB|=1<<PB5;
    for(uint16_t a=0;a<63535;a++){};  
    PINB|=1<<PB5;
}

Вы запускали? Ну, давайте же запускать!

Он у Вас просто горит и всё. Вернее, мигает с мегагерцной частотой! У нас же глаза, а не осциллограф, правда?

Kakmyc
Offline
Зарегистрирован: 15.01.2018
int main() { 
    DDRB|=1<<PB5;
    for(uint32_t a=0;a<2000000;a++){};  
    PINB|=1<<PB5;
}

ЕвгенийП пишет:

Kakmyc пишет:

Вариант с назначением порта 142байта

int main() { 
    DDRB|=1<<PB5;
    for(uint16_t a=0;a<63535;a++){};  
    PINB|=1<<PB5;
}

Вы запускали? Ну, давайте же запускать!

Он у Вас просто горит и всё. Вернее, мигает с мегагерцной частотой! У нас же глаза, а не осциллограф, правда?

Через пару недель. Как из больницы выпишут, обязательно запущу. И не с мегагерцной ни разу, а с частотой МК/65535 , это 244Гц. Это поправимо, заменой типа переменной на uint32_t, но тогда размер становится 142байта

sadman41
Offline
Зарегистрирован: 19.10.2016

Пора переходить к ассемблерным вставкам.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kakmyc пишет:
И не с мегагерцной ни разу, а с частотой МК/65535 , это 244Гц

Вы со мною спорите, когда у меня осциллограф на столе? :-)

С чего это он будет у Вас делить частоту, если Вы инвертируете его в КАЖДОМ из этих 65535 прохождений цикла - сами-то посмотрите!

Ой. Это я про более старую версию. Сорри. Сейчас новую гляну. Тоже не работает. Причём, совсем :-( 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

sadman41 пишет:

Пора переходить к ассемблерным вставкам.

Я уже пробовал. Причём биты взводил sbi (а не out), чтобы в регистр константу не грузить. Короче, чем у петровича не получилось пока :-(

-----------

Я за конкурс. Насчёт приза - пошукаю чё-нить. Какой-нибудь шилд точно найду.

Кто ещё за?

Green
Offline
Зарегистрирован: 01.10.2015

Петрович, у Вас короче.) Только светодиод встроенный должен мигать.)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ворота пишет:

Кто ещё за?

Присоединяюсь, могу предложить что-нибудь из комплектухи (платы, модули, пр.).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Надо бы ребят привлечь, Графа, там, Андриано. В общем, я наверное, замучу отдельную тему.

sadman41
Offline
Зарегистрирован: 19.10.2016

DIYMan пишет:

Ворота пишет:

Кто ещё за?

Присоединяюсь, могу предложить что-нибудь из комплектухи (платы, модули, пр.).

В нынешних реалиях больше подойдёт награда тушёнкой и гречей ;)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

светодиод встроенный должен мигать.)

Не было такого условия.

Green
Offline
Зарегистрирован: 01.10.2015

Ну, тогда и блинк может быть незаметным.)))

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

sadman41 пишет:

В нынешних реалиях больше подойдёт награда тушёнкой и гречей ;)

И это решаемо :)

Green
Offline
Зарегистрирован: 01.10.2015

Эдакое поле чудес по пятницам.)

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

А вот действительно, реально мигает на 11-ом пине и тоже короче, чем действующий чемпион.

int main (void) {
   while((WDTCSR = PINB = DDRB = 8));
}

Ваш ход. Сокращайте!

Более чем вдвое короче, чем у Евгения :)))

int main (void) {
   while((WDTCR = PINB = DDRB = 8));
}

58 байт

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Green пишет:

Петрович, у Вас короче.) Только светодиод встроенный должен мигать.)

А какие проблемы, замени там 8 на 40 - будут мигать оба сразу и на 13-ом и на 11-ом :-)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

int main (void) {
   while((WDTCR = PINB = DDRB = 8));
}

58 байт

На тиньке?

bwn
Offline
Зарегистрирован: 25.08.2014

sadman41 пишет:

В нынешних реалиях больше подойдёт награда тушёнкой и гречей ;)

И ты, Брут?(((

sadman41
Offline
Зарегистрирован: 19.10.2016

А это... Фокус с PINx на тиньке тоже работает(как и 328)? Я-то ими не увлекаюсь, поэтому не в курсе. Сейчас по даташиту для ATTINY13 поискал toggle и ничего нужного не заметил.

UPD: даташит для 85-й говорит, что есть такая фича...

Green
Offline
Зарегистрирован: 01.10.2015

Фишка доступна на чипах: 

// AVR new chip used PORT TOGGLE BY PIN WRITE

//13.2.2 Toggling the Pin
//Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn.
//Note that the SBI instruction can be used to toggle one single bit in a port.

//The ATmega48/88/168 contains three General Purpose I/O Registers. These registers can be
//used for storing any information, and they are particularly useful for storing global
//variables and Status Flags. General Purpose I/O Registers within the address range
//0x00 - 0x1F are directly bit-accessible using the SBI, CBI, SBIS, and SBIC instructions.

#if defined(__AVR_AT90PWM1__) \
 || defined(__AVR_AT90PWM2__) \
 || defined(__AVR_AT90PWM2B__) \
 || defined(__AVR_AT90PWM3__) \
 || defined(__AVR_AT90PWM3B__) \
 || defined(__AVR_AT90PWM216__) \
 || defined(__AVR_AT90PWM316__) \
 || defined(__AVR_AT90PWM81__) \
 || defined(__AVR_AT90USB82__) \
 || defined(__AVR_AT90USB162__) \
 || defined(__AVR_ATmega8U2__) \
 || defined(__AVR_ATmega16U2__) \
 || defined(__AVR_ATmega32U2__) \
 || defined(__AVR_ATmega16U4__) \
 || defined(__AVR_ATmega32U4__) \
 || defined(__AVR_ATmega32U6__) \
 || defined(__AVR_AT90USB646__) \
 || defined(__AVR_AT90USB647__) \
 || defined(__AVR_AT90USB1286__) \
 || defined(__AVR_AT90USB1287__) \
 || defined(__AVR_AT90CAN32__) \
 || defined(__AVR_AT90CAN64__) \
 || defined(__AVR_AT90CAN128__) \
 || defined(__AVR_ATmega16M1__) \
 || defined(__AVR_ATmega32M1__) \
 || defined(__AVR_ATmega64M1__) \
 || defined(__AVR_ATmega32C1__) \
 || defined(__AVR_ATmega64C1__) \
 || defined(__AVR_ATmega48__) || defined(__AVR_ATmega48A__) \
 || defined(__AVR_ATmega88__) || defined(__AVR_ATmega88A__) \
 || defined(__AVR_ATmega168__) || defined(__AVR_ATmega168A__) \
 || defined(__AVR_ATmega48P__) || defined(__AVR_ATmega48PA__) \
 || defined(__AVR_ATmega88P__) || defined(__AVR_ATmega88PA__) \
 || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega168PA__) \
 || defined(__AVR_ATmega328__) \
 || defined(__AVR_ATmega328P__) \
 || defined(__AVR_ATmega640__) \
 || defined(__AVR_ATmega1280__) \
 || defined(__AVR_ATmega1281__) \
 || defined(__AVR_ATmega2560__) \
 || defined(__AVR_ATmega2561__) \
 || defined(__AVR_ATmega164A__) \
 || defined(__AVR_ATmega164P__) || defined(__AVR_ATmega164PA__) \
 || defined(__AVR_ATmega324A__) \
 || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324PA__) \
 || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) \
 || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) \
 || defined(__AVR_ATmega1284P__) \
 || defined(__AVR_ATmega165__) || defined(__AVR_ATmega165A__) \
 || defined(__AVR_ATmega165P__) || defined(__AVR_ATmega165PA__) \
 || defined(__AVR_ATmega325__) || defined(__AVR_ATmega325A__) \
 || defined(__AVR_ATmega325P__) \
 || defined(__AVR_ATmega3250__) \
 || defined(__AVR_ATmega3250P__) \
 || defined(__AVR_ATmega645__) || defined(__AVR_ATmega645A__) \
 || defined(__AVR_ATmega645P__) \
 || defined(__AVR_ATmega6450__) || defined(__AVR_ATmega6450A__) \
 || defined(__AVR_ATmega6450P__) \
 || defined(__AVR_ATmega169__) || defined(__AVR_ATmega169A__) \
 || defined(__AVR_ATmega169P__) || defined(__AVR_ATmega169PA__) \
 || defined(__AVR_ATmega329__) || defined(__AVR_ATmega329A__) \
 || defined(__AVR_ATmega329P__) || defined(__AVR_ATmega329PA__) \
 || defined(__AVR_ATmega3290__) \
 || defined(__AVR_ATmega3290P__) \
 || defined(__AVR_ATmega649__) || defined(__AVR_ATmega649A__) \
 || defined(__AVR_ATmega6490__) || defined(__AVR_ATmega6490A__) \
 || defined(__AVR_ATmega6490P__) \
 || defined(__AVR_ATmega649P__) \
 || defined(__AVR_ATmega406__) \
 || defined(__AVR_ATmega8HVA__) \
 || defined(__AVR_ATmega16HVA__) \
 || defined(__AVR_ATmega16HVA2__) \
 || defined(__AVR_ATmega16HVB__) \
 || defined(__AVR_ATmega32HVB__) \
 || defined(__AVR_ATmega64HVE__) \
 || defined(__AVR_ATtiny261__) || defined(__AVR_ATtiny261A__) \
 || defined(__AVR_ATtiny461__) || defined(__AVR_ATtiny461A__) \
 || defined(__AVR_ATtiny861__) || defined(__AVR_ATtiny861A__) \
 || defined(__AVR_ATtiny2313__) || defined(__AVR_ATtiny2313A__) \
 || defined(__AVR_ATtiny4313__) \
 || defined(__AVR_ATtiny13__) || defined(__AVR_ATtiny13A__) \
 || defined(__AVR_ATtiny25__) \
 || defined(__AVR_ATtiny45__) \
 || defined(__AVR_ATtiny85__) \
 || defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny24A__) \
 || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny44A__) \
 || defined(__AVR_ATtiny84__) \
 || defined(__AVR_ATtiny43U__) \
 || defined(__AVR_ATtiny48__) || defined(__AVR_ATtiny88__) \
 || defined(__AVR_ATtiny87__) || defined(__AVR_ATtiny167__)\
 \
 || defined _CHIP_AT90PWM1_ \
 || defined _CHIP_AT90PWM2_ \
 || defined _CHIP_AT90PWM2B_ \
 || defined _CHIP_AT90PWM3_ \
 || defined _CHIP_AT90PWM3B_ \
 || defined _CHIP_AT90PWM216_ \
 || defined _CHIP_AT90PWM316_ \
 || defined _CHIP_AT90PWM81_ \
 || defined _CHIP_AT90USB82_ \
 || defined _CHIP_AT90USB162_ \
 || defined _CHIP_ATMEGA8U2_ \
 || defined _CHIP_ATMEGA16U2_ \
 || defined _CHIP_ATMEGA32U2_ \
 || defined _CHIP_ATMEGA16U4_ \
 || defined _CHIP_ATMEGA32U4_ \
 || defined _CHIP_ATMEGA32U6_ \
 || defined _CHIP_AT90USB646_ \
 || defined _CHIP_AT90USB647_ \
 || defined _CHIP_AT90USB1286_ \
 || defined _CHIP_AT90USB1287_ \
 || defined _CHIP_AT90CAN32_ \
 || defined _CHIP_AT90CAN64_ \
 || defined _CHIP_AT90CAN128_ \
 || defined _CHIP_ATMEGA16M1_ \
 || defined _CHIP_ATMEGA32M1_ \
 || defined _CHIP_ATMEGA64M1_ \
 || defined _CHIP_ATMEGA32C1_ \
 || defined _CHIP_ATMEGA64C1_ \
 || defined _CHIP_ATMEGA48_ || defined _CHIP_ATMEGA48A_ \
 || defined _CHIP_ATMEGA88_ || defined _CHIP_ATMEGA88A_ \
 || defined _CHIP_ATMEGA168_ || defined _CHIP_ATMEGA168A_ \
 || defined _CHIP_ATMEGA48P_ || defined _CHIP_ATMEGA48PA_ \
 || defined _CHIP_ATMEGA88P_ || defined _CHIP_ATMEGA88PA_ \
 || defined _CHIP_ATMEGA168P_ || defined _CHIP_ATMEGA168PA_ \
 || defined _CHIP_ATMEGA328_ \
 || defined _CHIP_ATMEGA328P_ \
 || defined _CHIP_ATMEGA640_ \
 || defined _CHIP_ATMEGA1280_ \
 || defined _CHIP_ATMEGA1281_ \
 || defined _CHIP_ATMEGA2560_ \
 || defined _CHIP_ATMEGA2561_ \
 || defined _CHIP_ATMEGA164A_ \
 || defined _CHIP_ATMEGA164P_ || defined _CHIP_ATMEGA164PA_ \
 || defined _CHIP_ATMEGA324A_ \
 || defined _CHIP_ATMEGA324P_ || defined _CHIP_ATMEGA324PA_ \
 || defined _CHIP_ATMEGA644_ || defined _CHIP_ATMEGA644A_ \
 || defined _CHIP_ATMEGA644P_ || defined _CHIP_ATMEGA644PA_ \
 || defined _CHIP_ATMEGA1284P_ \
 || defined _CHIP_ATMEGA165_ || defined _CHIP_ATMEGA165A_ \
 || defined _CHIP_ATMEGA165P_ || defined _CHIP_ATMEGA165PA_ \
 || defined _CHIP_ATMEGA325_ || defined _CHIP_ATMEGA325A_ \
 || defined _CHIP_ATMEGA325P_ \
 || defined _CHIP_ATMEGA3250_ \
 || defined _CHIP_ATMEGA3250P_ \
 || defined _CHIP_ATMEGA645_ || defined _CHIP_ATMEGA645A_ \
 || defined _CHIP_ATMEGA645P_ \
 || defined _CHIP_ATMEGA6450_ || defined _CHIP_ATMEGA6450A_ \
 || defined _CHIP_ATMEGA6450P_ \
 || defined _CHIP_ATMEGA169_ || defined _CHIP_ATMEGA169A_ \
 || defined _CHIP_ATMEGA169P_ || defined _CHIP_ATMEGA169PA_ \
 || defined _CHIP_ATMEGA329_ || defined _CHIP_ATMEGA329A_ \
 || defined _CHIP_ATMEGA329P_ || defined _CHIP_ATMEGA329PA_ \
 || defined _CHIP_ATMEGA3290_ \
 || defined _CHIP_ATMEGA3290P_ \
 || defined _CHIP_ATMEGA649_ || defined _CHIP_ATMEGA649A_ \
 || defined _CHIP_ATMEGA6490_ || defined _CHIP_ATMEGA6490A_ \
 || defined _CHIP_ATMEGA6490P_ \
 || defined _CHIP_ATMEGA649P_ \
 || defined _CHIP_ATMEGA406_ \
 || defined _CHIP_ATMEGA8HVA_ \
 || defined _CHIP_ATMEGA16HVA_ \
 || defined _CHIP_ATMEGA16HVA2_ \
 || defined _CHIP_ATMEGA16HVB_ \
 || defined _CHIP_ATMEGA32HVB_ \
 || defined _CHIP_ATMEGA64HVE_ \
 || defined _CHIP_ATTINY261_ || defined _CHIP_ATTINY261A_ \
 || defined _CHIP_ATTINY461_ || defined _CHIP_ATTINY461A_ \
 || defined _CHIP_ATTINY861_ || defined _CHIP_ATTINY861A_ \
 || defined _CHIP_ATTINY2313_ || defined _CHIP_ATTINY2313A_ \
 || defined _CHIP_ATTINY4313_ \
 || defined _CHIP_ATTINY13_ || defined _CHIP_ATTINY13A_ \
 || defined _CHIP_ATTINY25_ \
 || defined _CHIP_ATTINY45_ \
 || defined _CHIP_ATTINY85_ \
 || defined _CHIP_ATTINY24_ || defined _CHIP_ATTINY24A_ \
 || defined _CHIP_ATTINY44_ || defined _CHIP_ATTINY44A_ \
 || defined _CHIP_ATTINY84_ \
 || defined _CHIP_ATTINY43U_ \
 || defined _CHIP_ATTINY48_ || defined _CHIP_ATTINY88_ \
 || defined _CHIP_ATTINY87_ || defined _CHIP_ATTINY167_
 #define PORT_TOGGLE_BY_PIN_WRITE 1
#else
 #define PORT_TOGGLE_BY_PIN_WRITE 0
#endif

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Интересное дело. А чего это я с первого раза не нашел в даташите... Проклятый короновирус.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

b707 пишет:

ЕвгенийП пишет:

А вот действительно, реально мигает на 11-ом пине и тоже короче, чем действующий чемпион.

int main (void) {
   while((WDTCSR = PINB = DDRB = 8));
}

Ваш ход. Сокращайте!

Более чем вдвое короче, чем у Евгения :)))

int main (void) {
   while((WDTCR = PINB = DDRB = 8));
}

58 байт

 

Не компилируется

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kakmyc пишет:
Не компилируется
Так это для тиньки. Поставьте тини85 - скомпилируется. Надо в задаче чётко формулировать и целевой МК и версию IDE - ничего этого сделано не было.

Green
Offline
Зарегистрирован: 01.10.2015

Ну, если хочется совсем по минимуму размера, тогда с Makefile, по аналогии с загрузчиком. Без таблицы векторов и можно даже без стартап-а.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

Ну, если хочется совсем по минимуму размера, тогда с Makefile, по аналогии с загрузчиком. Без таблицы векторов и можно даже без стартап-а.

Так нельзя. Задача-то

Kakmyc пишет:
А какой самый компактный блинк можно написать в среде Arduino IDE ?

Green
Offline
Зарегистрирован: 01.10.2015

Тогда от МК будет зависеть. У кого меньше таблица векторов, если скрипты линкера не править.)

int main() {
  while (WDTCR = PINB = DDRB = 8);
}
Скетч использует 48 байт (4%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 0 байт (0%) динамической памяти, оставляя 64 байт для локальных переменных. Максимум: 64 байт.

 

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Надо в задаче чётко формулировать и целевой МК и версию IDE - ничего этого сделано не было.

ТС спрашивал код именно для тиньки, так что я посчитал более логичным скомпилировать ваш примерчик под это семейство :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

ТС спрашивал код именно для тиньки, так что я посчитал более логичным скомпилировать ваш примерчик под это семейство :)

Ну, это то я понял. Я уже рассуждаю о конкурсе. Надо чётко формулировать задачу. Хотя, конкурс может быть и не на задачи, я сейчас продумываю затравочный пост. Надеюсь, Вы поучаствуете в формулировании условий и потом в судействе.

MaksVV
Offline
Зарегистрирован: 06.08.2015

только выиграют конкурс "новички",  которые совсем не новички. Как отделять будете?   

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

MaksVV пишет:

Как отделять будете?   

да, никак, джентльмены верят друг другу на слово (помните анекдот?). Я достаточно уважаю людей вокруг, чтобы предположить, что кто-то будет перерегистрироваться под новичка и всех обманывать ради какого-то сраного шилда - несерьёзно это.

На самом деле, я сейчас продумываю пост для затравки, а там сообщество подправит. Ведь конкурс не обязательно на решение суперзадачи.  Например, это может быть постоянно действующий конкурс "новорег месяца", типа человек вошёл с внятным изложением проблемы, правильно вставил код и схему, не учил никого как ему правильно помогать и т.п. Почему нет? Здесь старожилы не катят по определению :-)

Azathtot
Offline
Зарегистрирован: 17.03.2020

ЕвгенийП пишет:

типа человек вошёл с внятным изложением проблемы, правильно вставил код и схему, не учил никого как ему правильно помогать и т.п. Почему нет? Здесь старожилы не катят по определению :-)

А вдруг у этого "новорега" (честно, совершенно случайно форум нашел пару дней назад) опыт проектирования и программирования железок xx+ лет? :)

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Тогда ему самому старые железки девать некуда должно быть.

abramonromka
Offline
Зарегистрирован: 17.03.2020

Я рад, что мой пост мотивировал Вас на создание чего-то нового, да ещё и развлекательного) Никогда не знаешь к чему тебя приведёт то или иное действие. Идея крутая, главное не отступать от неё!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Azathtot пишет:

А вдруг у этого "новорега" (честно, совершенно случайно форум нашел пару дней назад) опыт проектирования и программирования железок xx+ лет? :)

ЕвгенийП пишет:
джентльмены верят друг другу на слово

Azathtot
Offline
Зарегистрирован: 17.03.2020

sadman41 пишет:
Тогда ему самому старые железки девать некуда должно быть.

Есть такое. Вот и возникает задачка как к любовно сделанномо в свое время устройству прикрутить что-нить еще, ибо вроде и ног "лишних" хаватет, а разводить новую плату как-то лениво.