Ардуино, оптимизация условия if()

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

добрый день.

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

#define BTN_A 1
#define BTN_B 2
#define BTN_C 3
#define BTN_D 4

if(BTN_PRESS == BTN_A) 

-->

#define BTN_A 1
#define BTN_B 2
#define BTN_C 4
#define BTN_D 8

if(BTN_PRESS & BTN_A) 

...

все бы хорошо пока "идентификаторов нажатий" было мало, вмещалось в байт.

дело дошло до:

#define BTN_A 1
#define BTN_B 2
#define BTN_C 4
#define BTN_D 8
#define ...
#define BTN_D 256
#define BTN_D 512
#define BTN_D 1024
#define ...

то есть дело дошло до 2х байт, а так как Atmega328P 8-битный, то возможны "осложнения-утяжеления" перехода на подобное "битное условие"

такое сокращение "процессорных команд и ускорение кода" в моем случае очень не помешает, практически необходимо

ВОПРОСЫ:
1. правильно ли я думаю, что проверка 2х байтного условия действительно утяжеляет код или на это можно забить?
2. на сколько утяжеляет?
3. какие подводные камни?
4. и вообще, правильно ли я мыслю, в том ли направлении?
5. ну... какие вообще мысли по этому поводу

п.с. я не монстр в программировании, поэтому с ассемблером не дружу, и на сколько "это" изменит код пока не знаю :о)

спасибо заранее. 

- проект собирается под Ардуино-IDE
- контроллер Atmega328P
- Linux, ну и все вытекающие моменты (NO WINDOWS)

 

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

простите, немного некорректно написал в месте

#define BTN_D 256
#define BTN_D 512
#define BTN_D 1024

надеюсь, понятно, что имелось в виду (т.е. другие идентификаторы, не повторение конечно же)

#define BTN_XXX 256
#define BTN_XXX 512
#define BTN_XXX 1024
 

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

... в коде инициализация (BTN_PRESS - это не макрос, а переменная, для дотошных пусть будет беззнаковая целая)

BTN_PRESS = BTN_A
BTN_PRESS = BTN_В
BTN_PRESS = BTN_С
etc...
 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

если у вас МК не нагружен какими-то мат. задачами, а просто "если нажата кнопка, то сделать ...", то хоть 4 байтные вводите.

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

добрый день

 

меня инетерсует различие в реализации условий :

if(byte == byte)

if(byte & byte)

if(word & word)

в разрезе машинных команд (отличие, подводные камни, особенно в двухбайтовом условии, ведь процессор 8ми разрядный и, следовательно, по разному обробатывает двухбайтовые операнды и однобайтовые)

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

ну да, кода будет больше при сравнении 2 байтного числа. Но у вас опрос клавиатуры, какая вам разница, процесс медленный. За то врем пока прийдет нажатие другой клавиши, МК уже 1000 раз успеет ваше условие обработать.

Хотите разницу в коде увидеть, смотрте листинг на асме после компиляции

 

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

>> у вас опрос клавиатуры - с чего вы взяли? забудьте про клавиатуру

>> смотрте листинг на асме после компиляции - с ассемблером не дружу - могу судить только по размеру скетча, который "говорит" о том, что условие "if(byte & byte)" - всяко разно меньше "if(byte == byte)"

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

вообще то операции | и ||, & и &&, ну и т.п.  совсем разные. Одни побитовые, другие логические. И полученный результат тож будет отличаться, как и код.

См. язык С

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

а результат, вообще то, у них может быть одинаковый, только скорость выполнения операций будет разная

см. "оптимизация кода" 

всем спасибо

п.с. тему можно закрывать, т.к. нет специалистов :о)

 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

для скорости пишите на асме.

sva1509
Offline
Зарегистрирован: 07.12.2012

Доброго времени суток !

Вообще то сомманды cmp, and, or, xor  они однотактовые если используются в качестве операндов регистры процессора. cmp - комманда сравнения, работает так же как комманда вычитания, только без сохранения результата. В случае если у вас 2-ва байта то комманда повторится. По поводу быстродействия надо смотреть  как транслирует компилятор (по моему -S). В любом случае выборка из памяти более длительна чем само сравнение. Для ускорения если ситуация позволяет, то перед переменной можно использовать спецификатор register. В этом случае переменная будет хранится в регистре и операции с ней будут максимально быстры.