|
mspgcc + _even_in_range_, Как бы эту фичу ИАРа в Gcc перетащить... |
|
|
|
Apr 17 2009, 06:57
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
В ИАРе для МСП430 есть такая классная фича - квалификатор _even_in_range_(range) для аргументов switch(). То есть если аргумент чётный и распределён в ограниченном диапазоне, то свитч просто формирует сплошную таблицу переходов, а аргумент свича выступает индексом в этой таблице. Таким образом, осуществляется переход за одну команду независимо от количества кейсов в свиче. Оптимизация жуткая, причём это особенно актуально при обработке прерываний от второго вектора таймера В (TB_CCR1_VECTOR), когда пишем switch(TBIV) и максимально быстро выруливаем на нужный обработчик. Так вот, как бы такую штуку провернуть в GCC? На форуме mspgcc были какие-то наброски на асме, но это как-то некрасиво. типа этогоХотелось бы на чистом си, типа макроса чтоли...
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
 |
Ответов
|
Apr 17 2009, 12:37
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(alx2 @ Apr 17 2009, 16:12)  Немного отвлеченный вопрос: а откуда берется этот самый index? Не проще ли вместо индекса сразу работать с указателем на нужный код? Не нужно было бы получать указатель из таблицы... index - это переключатель свитча Данный подход выгоден, когда есть переключатель на большое количество индексируемых состояний. Например, стэйт машин или обработчик кодов команд (параметров, etc) То есть пишем switch(comand_code<<1,[список меток]) и максимально быстро перескакиваем на обработчик нужной команды Цитата(ReAl @ Apr 17 2009, 16:27)  Где размер увеличился? Ни на грамм, переменная s_e_i_r_I не создаётся вообще, этот for - это "обёртка" в духе do { } while(0);, не генерирующая кода (при уровне оптимизации, отличающемся от полного отсутствия)
Зато можно писать break; А, теперь понятно... У меня почему-то вставляет цикл. Причём объявление for(int s_e_i_r_I = 0; s_e_i_r_I == 0; s_e_i_r_I = 1) не прокатывает, пишет "TimerB\TimerB.c|168|`for' loop initial declaration used outside C99 mode|" Приходится объявление int s_e_i_r_I вытаскивать наружу. Как бы эту гадость победить, давно хочу.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 20 2009, 05:10
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(ReAl @ Apr 17 2009, 16:58)  Дык -std=c99 Или я чего-то не понял? Я так понимаю, что данная инициализация FOR не соответствует (по мнению компилятора) стандарту С99. Щас вот как раз качаю С99, надо ж когда-то начинать обращаться к первоисточникам... Вот, нарыл. Что и требовалось доказать. Цитата 6.8.5 Iteration statements Syntax iteration-statement: while ( expression ) statement do statement while ( expression ); for ( expressionopt ; expressionopt ; expressionopt ) statement for ( declaration expressionopt ; expressionopt ) statement Чё-то компилер глюкавит...
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 20 2009, 05:27
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(Сергей Борщ @ Apr 20 2009, 09:12)  Как раз соответствует. Просто у вас поддержка C99 не включена. CFLAGS = -mmcu=$(MCU) -c $(OPT) $(DEBUG) -std=c99 Вроде подключил, или нет? Секундочку, чё-то я сам не пойму, куда чего подключил... Ёжкин кот! У меня галка стояла на автомэйке! А я тут чего-то исследую, оптимизацию типа меняю... Ну вот, таки подключил... Вообще чудеса пошли - ругается на всё из io.h Особенно невзлюбил sfrb и sfrw Точнее вот что: #if defined(__MSP430_HAS_PORT1__) || defined(__MSP430_HAS_PORT1_R__) __MSP430_EXTERN__ struct port_full_t port1 asm("0x0020"); #endif Пишет "c:\mspgcc\msp430\include\msp430\iostructures.h|136|syntax error before "asm"|" И дался мне этот долбаный for с евоным с99... есть же ещё do{}while... Хотя нет, в макрос не подставишь...
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
Сообщений в этой теме
MrYuran mspgcc + _even_in_range_ Apr 17 2009, 06:57 ReAl Цитата(MrYuran @ Apr 17 2009, 09:57) Хоте... Apr 17 2009, 07:39 MrYuran Цитата(ReAl @ Apr 17 2009, 11:39) Так пой... Apr 17 2009, 07:57 MrYuran Ну, короче, вот что получилось.
Код#define switch_... Apr 17 2009, 09:19 ReAl Цитата(MrYuran @ Apr 17 2009, 12:19) Ну, ... Apr 17 2009, 10:30 ReAl "раз пошла такая пьянка"
(Cлабонервным н... Apr 17 2009, 11:43 MrYuran Цитата(ReAl @ Apr 17 2009, 15:43) "р... Apr 17 2009, 12:10  ReAl Цитата(MrYuran @ Apr 17 2009, 15:10) Чё-т... Apr 17 2009, 12:27 alx2 Немного отвлеченный вопрос: а откуда берется этот ... Apr 17 2009, 12:12 klen typedef enum { func0=0 , func1 , .... , func_count... Apr 18 2009, 04:57 MrYuran Итак, свершилось чудо!
Было:
Кодswitch_even_i... Apr 20 2009, 08:13 MrYuran Прочитал - таки в книжке про опции компилятора, мн... Apr 20 2009, 14:05 MrYuran Мда...
Вчера полдня боролся непонятно с чем, пока ... Apr 22 2009, 04:44 Сергей Борщ Цитата(MrYuran @ Apr 22 2009, 07:44) Ещё ... Apr 22 2009, 08:19 alx2 Цитата(MrYuran @ Apr 22 2009, 09:44) Кста... Apr 22 2009, 11:22  MrYuran Цитата(alx2 @ Apr 22 2009, 15:22) Подозре... Apr 22 2009, 13:14   alx2 Цитата(MrYuran @ Apr 22 2009, 18:14) Да н... Apr 23 2009, 10:21 MrYuran нашёл у Гриффитса такой абзац:
Похоже, действител... Apr 22 2009, 08:06 vvp532 для gcc-4.9.x (последний msp430-gcc на ti.com v4.9... Sep 30 2015, 15:00
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|