Ардуино, оптимизация условия if()
- Войдите на сайт для отправки комментариев
добрый день.
немного оптимизирую код, на данном этапе хочу попробовать заменить "условия" след. образом
#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)
простите, немного некорректно написал в месте
#define BTN_D 256
#define BTN_D 512
#define BTN_D 1024
надеюсь, понятно, что имелось в виду (т.е. другие идентификаторы, не повторение конечно же)
#define BTN_XXX 256
#define BTN_XXX 512
#define BTN_XXX 1024
... в коде инициализация (BTN_PRESS - это не макрос, а переменная, для дотошных пусть будет беззнаковая целая)
BTN_PRESS = BTN_A
BTN_PRESS = BTN_В
BTN_PRESS = BTN_С
etc...
если у вас МК не нагружен какими-то мат. задачами, а просто "если нажата кнопка, то сделать ...", то хоть 4 байтные вводите.
добрый день
меня инетерсует различие в реализации условий :
if(byte == byte)
if(byte & byte)
if(word & word)
в разрезе машинных команд (отличие, подводные камни, особенно в двухбайтовом условии, ведь процессор 8ми разрядный и, следовательно, по разному обробатывает двухбайтовые операнды и однобайтовые)
ну да, кода будет больше при сравнении 2 байтного числа. Но у вас опрос клавиатуры, какая вам разница, процесс медленный. За то врем пока прийдет нажатие другой клавиши, МК уже 1000 раз успеет ваше условие обработать.
Хотите разницу в коде увидеть, смотрте листинг на асме после компиляции
>> у вас опрос клавиатуры - с чего вы взяли? забудьте про клавиатуру
>> смотрте листинг на асме после компиляции - с ассемблером не дружу - могу судить только по размеру скетча, который "говорит" о том, что условие "if(byte & byte)" - всяко разно меньше "if(byte == byte)"
вообще то операции | и ||, & и &&, ну и т.п. совсем разные. Одни побитовые, другие логические. И полученный результат тож будет отличаться, как и код.
См. язык С
а результат, вообще то, у них может быть одинаковый, только скорость выполнения операций будет разная
см. "оптимизация кода"
всем спасибо
п.с. тему можно закрывать, т.к. нет специалистов :о)
для скорости пишите на асме.
Доброго времени суток !
Вообще то сомманды cmp, and, or, xor они однотактовые если используются в качестве операндов регистры процессора. cmp - комманда сравнения, работает так же как комманда вычитания, только без сохранения результата. В случае если у вас 2-ва байта то комманда повторится. По поводу быстродействия надо смотреть как транслирует компилятор (по моему -S). В любом случае выборка из памяти более длительна чем само сравнение. Для ускорения если ситуация позволяет, то перед переменной можно использовать спецификатор register. В этом случае переменная будет хранится в регистре и операции с ней будут максимально быстры.