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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
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.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: WinAVR+switch на таблицах

Сообщение от di_halt Посмотреть сообщение
IAR делает switch на таблицах или на CPI?
А для CPI аналога то и нет. Условия в свитче вовсе не обязаны идти последовательно и непрерывно. Что делать если нужно выполнять специфические действия при значениях переменной 3,7,19,27 ? Заводить таблицу на 27 значений? А если последнее условие 254?
kison вне форума  
Непрочитано 05.04.2010, 23:41  
alexgap
Гражданин KAZUS.RU
 
Аватар для alexgap
 
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
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.RU
 
Аватар для alexgap
 
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
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, время: 23:29.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot