|
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, 11:43
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
"раз пошла такая пьянка" (Cлабонервным не смотреть, тут, как и в protothreads, не просто используется goto, а ещё и внутрь блока оператора цикла. Правда, "одноразового", как в ATOMIC_BLOCK или привычного в макросах do { } while(0) ) Код #define switch_even_in_range(index, ... ) \ static const void *sw[] = {__VA_ARGS__};\ void *target = *(void**)((unsigned char*)sw + index);\ goto *target; \ for(int s_e_i_r_I = 0; s_e_i_r_I == 0; s_e_i_r_I = 1)
unsigned moo(unsigned sel) { unsigned result; switch_even_in_range(sel, &&la, &&lb, &&lc) { la: result = 2; break; lb: result = 1; break; lc: result = 11; } return result; }
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
Сообщений в этой теме
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 Цитата(MrYuran @ Apr 17 2009, 15:10) Чё-т... Apr 17 2009, 12:27 alx2 Немного отвлеченный вопрос: а откуда берется этот ... Apr 17 2009, 12:12 MrYuran Цитата(alx2 @ Apr 17 2009, 16:12) Немного... Apr 17 2009, 12:37 ReAl Цитата(MrYuran @ Apr 17 2009, 15:37) ... Apr 17 2009, 12:58  MrYuran Цитата(ReAl @ Apr 17 2009, 16:58) Дык -st... Apr 20 2009, 05:10   Сергей Борщ Цитата(MrYuran @ Apr 20 2009, 08:10) Я та... Apr 20 2009, 05:12    MrYuran Цитата(Сергей Борщ @ Apr 20 2009, 09:12) ... Apr 20 2009, 05:27     Сергей Борщ Цитата(MrYuran @ Apr 20 2009, 08:27) Пише... Apr 20 2009, 07:29 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
|
|
|