|
Оптимизация switch? |
|
|
|
Oct 7 2008, 18:39
|

Группа: Новичок
Сообщений: 5
Регистрация: 15-06-08
Из: Кировская слобода
Пользователь №: 38 298

|
Привет народ! Посоветуйте, как можно создать таблицу переходов для оптимизации switch (case-ов за сотню)? "__even_in_range" в данном случае не очень универсален и ограничен 30 переходами. Заранее благодарен за любую идею.
|
|
|
|
|
Oct 8 2008, 07:52
|

Группа: Новичок
Сообщений: 5
Регистрация: 15-06-08
Из: Кировская слобода
Пользователь №: 38 298

|
Цитата(plombir @ Oct 8 2008, 08:09)  А вот поймёт ли компилятор указатель на метку (как при goto), не пробовал. Но команда "Indirect Jump to (Z)" у AVR есть. Хорошая мысль, да, вот только с меткой проблемы. Никак не удается получить ее адрес, да и goto не желает иметь переменной в качестве аргумента :( Цитата(Rst7 @ Oct 8 2008, 09:23)  Чето вопрос не совсем ясен. IAR при больших свичах создает таблицу переходов. Самостоятельно. А вообще - код в студию. Хорошо бы знать директиву, чтобы компилятор создавал эту таблицу всегда, а не когда ему вздумается. Дело в том, что задача критична ко времени отклика, где каждый тик на счету и хорошо бы и на малых switch-ах реализовать эти переходы. Код больно длинен, а вообще тоже самое, что и любой свитч с кучей case-ов, ничего сверхестественного. А какая грань, при которой он создает таблицу, не подскажете? Цитата(MrYuran @ Oct 8 2008, 09:27)  Откуда такие сведения? У меня при "switch(__even_in_range( state,60 ))" компилятор говорит что большой код (свободной flash-памяти завались) и реализуй-ка ты на "switch(state)", с 58 все ок. Отсюда 30 case-ов. И потом условие, при которых используется __even_in_range, требует четных state-ов, а у меня какие попало, с интервалом (0-10000), вразброс.
|
|
|
|
|
Oct 8 2008, 09:49
|

Группа: Новичок
Сообщений: 5
Регистрация: 15-06-08
Из: Кировская слобода
Пользователь №: 38 298

|
Похоже одновременно изящного и эффективного решения нет, будем ставить костыли, ну, как-то так: if (state<60) { switch(__even_in_range(state,58)) {...} } else [if (state<120)] { state-=60; switch(__even_in_range(state,58)) {...} } ... покеда :)
|
|
|
|
|
Oct 8 2008, 11:58
|

Группа: Новичок
Сообщений: 5
Регистрация: 15-06-08
Из: Кировская слобода
Пользователь №: 38 298

|
Цитата(Dog Pawlowa @ Oct 8 2008, 15:22)  Я сам создаю таблицу при количестве case'ов больше десятка. Все равно код становится длинным и нечитаемым. Каким образом вы создаете таблицу, можете поведать? Если он выполняется быстрее, то пускай он длинный и нечитаемый, для моего случая это не критично.
|
|
|
|
|
Oct 8 2008, 13:12
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(1eXX @ Oct 8 2008, 14:58)  Каким образом вы создаете таблицу, можете поведать? Если он выполняется быстрее, то пускай он длинный и нечитаемый, для моего случая это не критично. Примитивно //определения аргументов case, имен функций, и текста для вывода в одном месте Код ... #define stERROR 7 #define nm7 "Error" #define F7 fError #define stLOW_POWER 8 #define nm8e "Low power" #define nm8g "Unterspannung" #define F8 fLowPower ... // массив функций const VECTORS function[stQty] = Код { f0, f1, f2, f3, f4, f5, f6, f7, f8, f9...f103 }; //собственно "switch" в теле программы Код function[state]();
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Oct 8 2008, 17:42
|

Группа: Новичок
Сообщений: 5
Регистрация: 15-06-08
Из: Кировская слобода
Пользователь №: 38 298

|
Самое яблочко, Дог :beer:
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|