Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

WinAVR+switch на таблицах

Непрочитано 05.04.2010, 22:03  
di_halt
Прописка
 
Аватар для di_halt
 
Регистрация: 17.10.2006
Сообщений: 147
Сказал спасибо: 2
Сказали Спасибо 22 раз(а) в 11 сообщении(ях)
di_halt на пути к лучшему
По умолчанию WinAVR+switch на таблицах

Понадобилось мне сварганить один весьма толстый свитч. На на три десятка позиций. Позиции же идут совершенно равномерно от 0 до 30.

Поглядел я в ассемблерный код и стало тошно -- увидел я там пачку
CPI по одному на каждый вариант. $&#$@ стыд! Мне на такое убийство компилятором процессорного времени и памяти флеша смотреть больно

Я же как старый ассемблерный боец -- ни такта ни байта врагу. И подумал можно ли сварганить на Си свитч по таблицам, как на асме родимом.

То есть в памяти у нас лежит таблица адресов переходов, а входное значение - смещение. А дальше хвать его и ускакал по IJMP.

Но получилось только с указателями на функции, но это несколько не то.

Я предпочитаю иметь кейс сишного типа - захотели вышли из ветви через break; не захотели - пошли выполнять следующую ветвь. C функциями тут такое не прокатит. Разве что усложнить конструкцию с анализом возвращаемого значения. Но, блин, мы же бьемся за компактность и скорость, а не за то кто больше нагородит.

Полагаю тут только через метки и GOTO всякие (чую щас полетят тухлые помидоры)

Но вот скормить в таблицу адреса меток не вышло.

Есть ли в Си (в частности в WinAvr) способ сварганить переход по IJMP не прибегая к ассемблерным вставкам, только средствами языка Си?
Реклама:
__________________
Мой блог по электронике - www.easyelectronics.ru
di_halt вне форума  
Непрочитано 05.04.2010, 22:59  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

CVAVR в финальном коде по условным переходам использует IJMP )))

Но банальное тосование строк в си коде может увеличить финальный размер на приличное количество пустого бесполезного асма кидающего данные в стек и из стека обратно. Сжирание тактов невероятное )))

Тоесть гдето выигрываеш где-то проигрываеш. если уж конкретно решился работать с СИ то рекомендую компилятор IAR и конструктиву табличного перехода SWITCH

пример:

PHP код:
switch( PEREMENNAYA ) 
 {
    case 1:
    //тут 1 это значение
        PORTx=0x33;
    break;

    case 2:
       PORTx=0x12;
    break;
    case N:
     // тут N это скажем значение заданное ранее #define N 10 )))
       PORTx=0x33;
       PORTy=0x01
    break;

    default:
      //Тут после default пишется то что попадает в случае если не подошло ни одно условие
      PORTx=0x00;
    break;
    } 
MasterMushi вне форума  
Непрочитано 05.04.2010, 23:04  
di_halt
Прописка
 
Аватар для di_halt
 
Регистрация: 17.10.2006
Сообщений: 147
Сказал спасибо: 2
Сказали Спасибо 22 раз(а) в 11 сообщении(ях)
di_halt на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

IAR хорош, но хочет денег, а мне, поскольку веду публичный ресурс, как то западло вот так внаглую навязвывать моим читателям что либо платное (либо, что еще хуже, предлагать воровать). Поэтому остановился на WinAVR + на нем решений готовых дофига. Ну и под линухом он вполне неплохо живет.

IAR делает switch на таблицах или на CPI? Можете показать асмовские потроха этой конструкции из под IAR?
__________________
Мой блог по электронике - www.easyelectronics.ru
di_halt вне форума  
Непрочитано 05.04.2010, 23:22  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Это не Ваш вопрос - http://forum.ixbt.com/topic.cgi?id=48:9372 ?
А вообще способа такого ИМХО нет. Да и ненужен он. А чем не нравятся указатели на функции?
kison вне форума  
Непрочитано 05.04.2010, 23:23  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Я не использую IAR )))) Просто по тестам у него наилучшая оптимизация кода. Поэтому его и предложил.
MasterMushi вне форума  
Непрочитано 05.04.2010, 23:26  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Сообщение от di_halt Посмотреть сообщение
IAR делает switch на таблицах или на CPI?
А для CPI аналога то и нет. Условия в свитче вовсе не обязаны идти последовательно и непрерывно. Что делать если нужно выполнять специфические действия при значениях переменной 3,7,19,27 ? Заводить таблицу на 27 значений? А если последнее условие 254?
kison вне форума  
Непрочитано 05.04.2010, 23:41  
alexgap
Гражданин KAZUS.RUN
 
Аватар для alexgap
 
Регистрация: 08.07.2006
Сообщений: 883
Сказал спасибо: 119
Сказали Спасибо 1,108 раз(а) в 175 сообщении(ях)
alexgap на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Сообщение от di_halt Посмотреть сообщение
Понадобилось мне сварганить один весьма толстый свитч. На на три десятка позиций. Позиции же идут совершенно равномерно от 0 до 30.
WinAVR уже делает switch с исользованием таблиц. Версия gcc 4.3.2.
__________________
.

В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
alexgap вне форума  
Непрочитано 05.04.2010, 23:44  
di_halt
Прописка
 
Аватар для di_halt
 
Регистрация: 17.10.2006
Сообщений: 147
Сказал спасибо: 2
Сказали Спасибо 22 раз(а) в 11 сообщении(ях)
di_halt на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Нет не мой.

Чем мне не нравится переход по функциям? Да не очень он гибкий. Откуда пришел туда и ушел.

Например есть уменя

А: action1
B: action2
C: action3 break
D: Action4

Переход на А даст акт1,2,3 переход на Б даст только 2 и 3. Переход на С только 3

А будь там функции то либо 1,либо 2, либо 3 - все по одному. Придется добавлять доп условия, вызовы пачками нужных комбинаций и так далее.

Аналог CPI есть при наличии мозга. Где то можно на CPI, а где то на таблицах А где-то совместить и то и другое.

На асме такое прокатывало, вот, думал, может и компиляторы тоже поумнели и сами могут соориентироваться выдав наиболее оптимальный вариант. Но, видимо, увы.
__________________
Мой блог по электронике - www.easyelectronics.ru
di_halt вне форума  
Непрочитано 05.04.2010, 23:46  
di_halt
Прописка
 
Аватар для di_halt
 
Регистрация: 17.10.2006
Сообщений: 147
Сказал спасибо: 2
Сказали Спасибо 22 раз(а) в 11 сообщении(ях)
di_halt на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Сообщение от alexgap Посмотреть сообщение
WinAVR уже делает switch с исользованием таблиц. Версия gcc 4.3.2.
Хм у меня WinAVR-20090313 вроде бы не самая древняя. - на CPI мне наплодило оптимизация Os
__________________
Мой блог по электронике - www.easyelectronics.ru
di_halt вне форума  
Непрочитано 06.04.2010, 00:01  
alexgap
Гражданин KAZUS.RUN
 
Аватар для alexgap
 
Регистрация: 08.07.2006
Сообщений: 883
Сказал спасибо: 119
Сказали Спасибо 1,108 раз(а) в 175 сообщении(ях)
alexgap на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Сообщение от di_halt Посмотреть сообщение
Хм у меня WinAVR-20090313 вроде бы не самая древняя. - на CPI мне наплодило оптимизация Os
Попробуйте запустить avr-gcc --version, интересно какая версия у вас.
__________________
.

В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
alexgap вне форума  
 

Метки
winavr
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подниму тему WinAVR vs IAR oleg110592 Микроконтроллеры, АЦП, память и т.д 5 24.10.2015 14:06
Библиотеки для Xmega под WinAVR harchenko_pavel AVR 21 15.03.2013 23:00
На WinAVR + AVR Studio c CVAVR Vetal-soft Embedd С 87 03.03.2013 20:31
Вопрос winavr wss60 Микроконтроллеры, АЦП, память и т.д 6 09.03.2010 07:33
Оптимизация в WinAVR && GCC igor-k Микроконтроллеры, АЦП, память и т.д 1 30.11.2009 17:37


Часовой пояс GMT +4, время: 12:44.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.