Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Опримизация switch case
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
mantech
Собственно заинтересовал такой вопрос, навеянный темой в ветке gcc:
http://electronix.ru/forum/index.php?showt...=61802&st=0

Так получилось, что есть программа с 50ю кейсами, переменная от 1 до 50 и выбор соотв. кейса. Хотелось бы ускорить переход на каждый кейс, путем индексирования. Предложенный вариант с функциями и массивом их адресов особо не катит, т.к. нужна передача параметров и глобально задавать переменые - не вариант. Подход с метками считаю более лучшим, но как получить адрес метки, чтоб закинуть его потом в массив - без понятия.
Может есть какие мысли??
Сергей Борщ
Цитата(mantech @ Mar 9 2016, 16:56) *
Хотелось бы ускорить переход на каждый кейс, путем индексирования.
ИАР достаточно умный компилятор, такую оптимизацию он делал автоматически еще лет 15 назад, посмотрите листинг.
scifi
Цитата(mantech @ Mar 9 2016, 17:56) *
Хотелось бы ускорить переход на каждый кейс, путем индексирования.
...
Может есть какие мысли??

Мысли есть. А оно надо? В смысле из-за неоптимальности именно в этом месте что-то не работает?
И присоединюсь к Сергею: многие компиляторы это сами умеют. А если не умеет, или ему в этом конкретном случае что-то мешает, то и фиг с ним. Делать закат солнца вручную - такой моветон...

Цитата(mantech @ Mar 9 2016, 17:56) *
Подход с метками считаю более лучшим, но как получить адрес метки, чтоб закинуть его потом в массив - без понятия.

Переходите на GCC.
Baser
Цитата(mantech @ Mar 9 2016, 16:56) *
Собственно заинтересовал такой вопрос, навеянный темой в ветке gcc:
...
Может есть какие мысли??

А какая платформа у вас?
Если тот же MSP430, что в ссылке, так чем не устраивает _even_in_range_(range) ?

А если что другое, то в ИАРе делал такое:
Код
__task void main(void)
  {
  StartUp_C();
  asm ("MOV.W   SP,&Task_InitSP");
  asm ("MAIN_CYCLE: ");
  for(;;)
    {
    Main_Services();
    .......
    }
  }

void Foo(unsigned int qwerty)
  {
  ........
  asm ("BR      #MAIN_CYCLE");
  }

Так что, со встроенным ассемблером что нить можно придумать, но для switch-а я это делать крайне не советую...
mantech
Цитата(scifi @ Mar 9 2016, 18:24) *
Мысли есть. А оно надо? В смысле из-за неоптимальности именно в этом месте что-то не работает?


В смысле просто была мысль ускорить интерпретацию команд...

Да, забыл, платформа АРМ кортекс А9.

Цитата(scifi @ Mar 9 2016, 18:24) *
Переходите на GCC.


Нее, уж лучше вы к нам biggrin.gif
scifi
Цитата(mantech @ Mar 9 2016, 21:28) *
В смысле просто была мысль ускорить интерпретацию команд...

Ну так гэцэцэшная фича с метками-указателями для этого и придумана.

Цитата(mantech @ Mar 9 2016, 21:28) *
Нее, уж лучше вы к нам biggrin.gif

А я и там, и здесь. Что удобнее, то и использую. А вы можете продолжать колоться, плакать и кушать свой кактус biggrin.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.