реклама на сайте
подробности

 
 
> mspgcc + _even_in_range_, Как бы эту фичу ИАРа в Gcc перетащить...
MrYuran
сообщение Apr 17 2009, 06:57
Сообщение #1


Беспросветный оптимист
******

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



В ИАРе для МСП430 есть такая классная фича - квалификатор _even_in_range_(range) для аргументов switch().
То есть если аргумент чётный и распределён в ограниченном диапазоне, то свитч просто формирует сплошную таблицу переходов, а аргумент свича выступает индексом в этой таблице. Таким образом, осуществляется переход за одну команду независимо от количества кейсов в свиче.
Оптимизация жуткая, причём это особенно актуально при обработке прерываний от второго вектора таймера В (TB_CCR1_VECTOR), когда пишем switch(TBIV) и максимально быстро выруливаем на нужный обработчик.

Так вот, как бы такую штуку провернуть в GCC? На форуме mspgcc были какие-то наброски на асме, но это как-то некрасиво.
типа этого
Хотелось бы на чистом си, типа макроса чтоли...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Apr 17 2009, 09:19
Сообщение #2


Беспросветный оптимист
******

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



Ну, короче, вот что получилось.
Код
#define switch_even_in_range(index, ... )   \
            static const unsigned int *sw[] = {__VA_ARGS__};\
            unsigned int *target = *(void**)((unsigned int*)sw + index);\
            goto *target;

index - переключатель, далее следует записать все метки кейсов.
Код
interrupt (TIMERB1_VECTOR) Timerb_ccr1(void)
{    
  switch_even_in_range(TBIV, &&def, &&l2, &&l4, &&l6, &&l8, &&l10, &&l12 )
  {
    l2:
        pxTimerB1ccr1expired();
    l4:
        pxTimerB1ccr2expired();
    l6:
        (void)pxMBPortCBTimerExpired();
    l8:
        pxTimerB1ccr4expired();
    l10:
        pxTimerB1ccr5expired();
    l12:
        pxTimerB1ccr6expired();

    def:
  }
}

Ничё так, гламурненько smile.gif

А вот выход:
CODE

00002eb0 <Timerb_ccr1>:
2eb0: 0f 12 push r15 ;
2eb2: 0e 12 push r14 ;
2eb4: 0d 12 push r13 ;
2eb6: 0c 12 push r12 ;
2eb8: 05 12 push r5 ;
2eba: 04 12 push r4 ;
2ebc: 05 41 mov r1, r5 ;
2ebe: 35 50 0e 00 add #14, r5 ;#0x000e
2ec2: 21 83 decd r1 ;
2ec4: 04 41 mov r1, r4 ;
2ec6: 1f 42 1e 01 mov &0x011e,r15 ;0x011e
2eca: 0f 5f rla r15 ;
2ecc: 3f 50 04 02 add #516, r15 ;#0x0204
2ed0: a4 4f 00 00 mov @r15, 0(r4) ;
2ed4: 20 44 br @r4 ;
2ed6: 1f 42 ca 03 mov &0x03ca,r15 ;0x03ca
2eda: 8f 12 call r15 ;
2edc: 1f 42 a8 03 mov &0x03a8,r15 ;0x03a8
2ee0: 8f 12 call r15 ;
2ee2: 1f 42 aa 03 mov &0x03aa,r15 ;0x03aa
2ee6: 8f 12 call r15 ;
2ee8: 1f 42 c6 03 mov &0x03c6,r15 ;0x03c6
2eec: 8f 12 call r15 ;
2eee: 1f 42 c4 03 mov &0x03c4,r15 ;0x03c4
2ef2: 8f 12 call r15 ;
2ef4: 1f 42 c2 03 mov &0x03c2,r15 ;0x03c2
2ef8: 8f 12 call r15 ;
2efa: 21 53 incd r1 ;
2efc: 34 41 pop r4 ;
2efe: 35 41 pop r5 ;
2f00: 3c 41 pop r12 ;
2f02: 3d 41 pop r13 ;
2f04: 3e 41 pop r14 ;
2f06: 3f 41 pop r15 ;
2f08: 00 13 reti

ссылка по указателю на функцию в прерывании это конечно изврат, но речь сейчас не об этом.
В целом вроде бы всё удалось.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 17 2009, 10:30
Сообщение #3


Нечётный пользователь.
******

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



Цитата(MrYuran @ Apr 17 2009, 12:19) *
Ну, короче, вот что получилось.
Код
#define switch_even_in_range(index, ... )   \
            static const unsigned int *sw[] = {__VA_ARGS__};\
            unsigned int *target = *(void**)((unsigned int*)sw + index);\
            goto *target;
Симпатишненько.
Только вроде бы ж надо
Цитата
= *(void**)((unsigned char*)sw + index);
, на входе чётное число, смещение в таблице в байтах.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - 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
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 10:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016