|
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 22 2009, 04:44
|

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

|
Мда... Вчера полдня боролся непонятно с чем, пока не поменял свой супероптимизированный свич на стандартный... И ведь вроде всё правильно делает, но программу уносит в неведомые дали, всё виснет на ходу... Будем искать...
Кстати, большим открытием для меня было, что static const sw[] формируется не в флеше, как было бы логично, а в ОЗУ. Пришлось его насильно запихнуть в флешь ( __attribute__(( section(".text") )) )
Ещё один фокус: static inline void PulseRecharge() не инлайнится внутрь обработчика прерывания, пока его принудительно туда не запихнёшь static inline void PulseRecharge()__attribute__((always_inline)); Это если они в одном модуле, а если в разных, то не лезет ни в какую!
#######
Глянул diff-ом, разницы никакой не заметил, за исключением того что все адреса немного сползли из-за изменения размеров функции и добавления таблицы переходов... В общем, полный абзац.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 22 2009, 11:22
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(MrYuran @ Apr 22 2009, 09:44)  Кстати, большим открытием для меня было, что static const sw[] формируется не в флеше, как было бы логично, а в ОЗУ. Пришлось его насильно запихнуть в флешь ( __attribute__(( section(".text") )) ) Подозреваю, что у msp не фон-неймановская архитектура, и для доступа к ОЗУ и ПЗУ должен использоваться разный код. А gcc не поддерживает "универсальных" указателей (типа трехбайтных указателей в IAR'овском компиляторе для MCS51). Поэтмоу все данные размещаются в ОЗУ. При явном размещении данных в .text необходимо так же явно указывать компилятору, что читать объект требуется особым образом.
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Apr 23 2009, 10:21
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(MrYuran @ Apr 22 2009, 18:14)  Да нет, как раз-таки с этим всё нормально. Для чтения совершенно безразлично, флешь это, ОЗУ или регистры периферии. Всё расположено линейно в едином пространстве адресов. Тогда странно. Для ARM gcc размещает константные объекты, как и положено, в .rodata.
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
Сообщений в этой теме
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 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, 07:44) Ещё ... Apr 22 2009, 08:19 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
|
|
|