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

 
 
> Недокументированные возможности IAR, extended keywords __x_z, __z?
Old1
сообщение Dec 16 2005, 10:12
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Просматривал хидер pgmspace.h и обратил внимание на модификаторы __x_z и __z, в мануале на компилятор про их назаначение ничего не нашел (или плохо искал?...), в апликашках они тоже вроде бы не встречаются. Решил попробовать использовать их наугад, написал простенький код на С++ (описал две одинаковых функции одна с __x_z, другая без, исходный код и результат компиляции см. в присоединенных файлах), скомпилировал, оказалось что код функции с модификатором компактнее (за счет ИМХО более рационального использования регистров-указателей) и выполняется быстрей (на 30% в данном примере). Вопросы: кто, что о них (модификаторах) знает (особенности их использования)? Какие мысли есть о том, почему ИАР ничего не пишет о них ( ведь ИМХО вещ вроде бы полезная)?
Прикрепленные файлы
Прикрепленный файл  modifikaori.rar ( 1.71 килобайт ) Кол-во скачиваний: 92
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
IgorKossak
сообщение Dec 16 2005, 11:02
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Для улучшения скорости и компактности некоторых функций, особенно static, применяю эти квалификаторы.
О ни действительно в руководствах ничего нет.
Некоторые замеченные особенности:
- квалификаторы действуют только на указатели, в остальных случаях игнорируются;
- не существует квалификатора __z_x wink.gif ;
- ...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Dec 16 2005, 14:08
Сообщение #3


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(IgorKossak @ Dec 16 2005, 13:02) *
Для улучшения скорости и компактности некоторых функций, особенно static, применяю эти квалификаторы.
О ни действительно в руководствах ничего нет.
Некоторые замеченные особенности:
- квалификаторы действуют только на указатели, в остальных случаях игнорируются;
- не существует квалификатора __z_x wink.gif ;
- ...


Cуществует и __z_x и __x_z - соответственно, как передавать первый и второй указатель.

По поводу только указателей - если очень надо, преобразуй например int в void * и передай, а потом наоборот.

На форуме "Точка опоры" я писал про недокумментированные фичи иара, всякие "__raw", "__no_return" и прочее. Поищи там, давненько дело было.

Также есть еще SBRA и CBRA - это коммады какие-то AVR, иар их может использовать. Что за хрень - не знаю.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 16 2005, 15:43
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Rst7 @ Dec 16 2005, 16:08) *
...По поводу только указателей - если очень надо, преобразуй например int в void * и передай, а потом наоборот.

В том то и дело, что кроме головной боли такие преобразования не принесут, а выигрыша никакого.
Цитата(Rst7 @ Dec 16 2005, 16:08) *
На форуме "Точка опоры" я писал про недокумментированные фичи иара, всякие "__raw", "__no_return" и прочее. Поищи там, давненько дело было.

Хорошие фичи, применяю.
__raw - в прерываниях, обслуживаемых ОСРВ (там свои функции сохранения/восстановления контекста);
__no_return - в бутлоадере (немного сокращает размер).
Цитата(Rst7 @ Dec 16 2005, 16:08) *
Также есть еще SBRA и CBRA - это коммады какие-то AVR, иар их может использовать. Что за хрень - не знаю.

Ни в стандартном, ни в расширенном наборе (по крайней мере для ATmega) таких инструкций нет. Что имели в виду ИАРовцы - не понятно.
Go to the top of the page
 
+Quote Post
ig_z
сообщение Dec 17 2005, 03:58
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



Как то пытался переписывать порты под вытесняющие ОСи на чистом С в иар для мсп430.
__no_return не оказывает никакого эффекта. Т.е. компилятор не ругается, но и рет не подавляет.
Плюс __interrupt разрешают применять только для обработчиков прерываний, так что красота не получается пока glare.gif

Цитата(IgorKossak @ Dec 16 2005, 19:43) *
__no_return - в бутлоадере (немного сокращает размер).


Подавляет ret, тем самым позволяет на С создавать конструкции типа "несколько точек входа на одну точку выхода", я правильно понимаю?
И почему в бутлоадере? Это как-то связанно с АВР или больше нигде не возникает необходимость в подобном механизме?
Go to the top of the page
 
+Quote Post
Rst7
сообщение Dec 17 2005, 07:40
Сообщение #6


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(ig_z @ Dec 17 2005, 05:58) *
.....
Подавляет ret, тем самым позволяет на С создавать конструкции типа "несколько точек входа на одну точку выхода", я правильно понимаю?
И почему в бутлоадере? Это как-то связанно с АВР или больше нигде не возникает необходимость в подобном механизме?


Подавляет не ret. Подавляет сохранение регистров. Но как-то отличается от __root. Особо не разбирался.

По поводу гемороя с передачей значений как указатели. Используя такой метод (с __x_z) можно за раз передать в функцию не 8 (R16-R23), а 12 (R16,R23,X,Z) байт БЕЗ ИСПОЛЬЗОВАНИЯ СТЕКА. В некоторых случаях очень удобно и позволяет повысить производительность. Единственное, нельзя сделать функцию с _z в любой комбинации, если используется вызов данной функции по указателю.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Old1
сообщение Dec 19 2005, 07:34
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(Rst7 @ Dec 17 2005, 11:40) *
Подавляет не ret. Подавляет сохранение регистров. Но как-то отличается от __root. Особо не разбирался.

Непонятно (по поводу __noreturn), если я правильно перевел, этот квалификатор указывает компилятору, что программа после выполнения функции не возвращается к точке ее вызова (если я не прав поправьте), в этом случае ИМХО функция уже вроде как не функция (заметил, что после добавления __noreturn переход на функцию осуществляется при помощи RJMP) и как следствие регистры уже не сохраняются (но это вторично)... И какое отношение __root имеет к сохранению регистров?
Go to the top of the page
 
+Quote Post
ig_z
сообщение Dec 19 2005, 15:36
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



Цитата(Old1 @ Dec 19 2005, 11:34) *
Цитата(Rst7 @ Dec 17 2005, 11:40) *

Подавляет не ret. Подавляет сохранение регистров. Но как-то отличается от __root. Особо не разбирался.

Непонятно (по поводу __noreturn), если я правильно перевел, этот квалификатор указывает компилятору, что программа после выполнения функции не возвращается к точке ее вызова (если я не прав поправьте), в этом случае ИМХО функция уже вроде как не функция (заметил, что после добавления __noreturn переход на функцию осуществляется при помощи RJMP) и как следствие регистры уже не сохраняются (но это вторично)... И какое отношение __root имеет к сохранению регистров?


Очень странно. Какой у вас компилер и версия?
У меня мсп430 3.30

итак:
__raw и __task подавляют сохранение/восстановление регистров в для "прерывательных" и "обычных" функций
__interrupt -заменяет рет на ирет
__root обязывает компилятор/линкер включать функцию в объектный/бинарный файл, даже если на нее нет ни одной ссылки
__noreturn keyword can be used on a function to inform the compiler that the function will not return. Т.е. не будет возврата из функции - будет выполняться следующий по порядку оператор. О подавлении/сохранении регистров ни слова. Точно так же очень сомнительно выглядит вызов функции по jmp. По крайней мере мсп430 3.30 вызывает __noreturn функцию через call. Чесно предупреждает, что больше не сможет вернуться в точку вызова cranky.gif . Но т.к. не подавляет ret в вызываемой функции, благополучно возвращается в точку вызова tongue.gif

На мсп430 3.30 __noreturn не делает ничего. Т.е. ret не подавляется, а регистры сохраняются. Все остальные extended keywords работают корректно.
Go to the top of the page
 
+Quote Post
Old1
сообщение Dec 19 2005, 20:39
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(ig_z @ Dec 19 2005, 19:36) *
Очень странно. Какой у вас компилер и версия?
У меня мсп430 3.30

Компилятор IAR EWAVR 4.11A
Цитата
итак:
__raw и __task подавляют сохранение/восстановление регистров в для "прерывательных" и "обычных" функций
__interrupt -заменяет рет на ирет

тут все понятно...
Цитата
__root обязывает компилятор/линкер включать функцию в объектный/бинарный файл, даже если на нее нет ни одной ссылки

не только функции но и переменные...
Цитата
__noreturn keyword can be used on a function to inform the compiler that the function will not return. Т.е. не будет возврата из функции - будет выполняться следующий по порядку оператор. О подавлении/сохранении регистров ни слова. Точно так же очень сомнительно выглядит вызов функции по jmp. По крайней мере мсп430 3.30 вызывает __noreturn функцию через call. Чесно предупреждает, что больше не сможет вернуться в точку вызова cranky.gif . Но т.к. не подавляет ret в вызываемой функции, благополучно возвращается в точку вызова tongue.gif

На мсп430 3.30 __noreturn не делает ничего. Т.е. ret не подавляется, а регистры сохраняются. Все остальные extended keywords работают корректно.

Поделюсь результатами своих экспериментов. Программа выполняет тело функции __noreturn а затем выполняет инструкцию RET функции из которой была вызвана ф-ция __noreturn, все что было между функцией __noreturn и RET игнорируется. Причем если функция __noreturn (по какой-то причине) описана как возвращающая значение, она это значение вычисляет, но не возвращает (это логично, поскольку после выполния функции, возврата к точке вызова нет). Переход на выполнение __noreturn функции осуществляется при помощи инструкции RJMP (или JMP). Например:
Код

unsigned char A=10, B=0;
__noreturn unsigned char Funk10(unsigned char V1)
{
  return(V1+3);
}

void Funk8(void)
{
  A+=10;
  return;
}

void Funk9(void)
{
  B+=2;
  A=Funk10(23);
  Funk8();//это не выполняется
  --B;//и это тоже
}

В результате выполнения Funk9 имеем A=10, В=2...
Заметил, что при включенном режиме оптимизации Function inlining все выполняется как будто __noreturn нет в природе, но это, думаю, от того, что все функции у меня были определены в одном модуле (и они выполнялись как inline-функции), как только функцию __noreturn определил в отдельном модуле все стало на свои места...
Если __noreturn-функцию вызвать непосредственно внутри функции main то все работает как описано выше, если __noreturn-функция определена как void, и внутри main нет бесконечного цикла, в противном случае компилятор выдает ошибку...
В результате пришел к выводу, что механизм выполнения __noreturn-функции сводится к следующему: выполняется тело __noreturn-функции функции (без RET), после этого инструкция RET функции непосредственно внутри которой вызвана __noreturn-функция...
З.Ы. Насчет подавления сохранения регистров: если __interrupt-функцию сделать еще и __noreturn, то регистры не сохраняются, и по крайней мере чисто внешне все выглядит так же как при использовании __raw...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Old1   Недокументированные возможности IAR   Dec 16 2005, 10:12
- - dxp   Цитата(Old1 @ Dec 16 2005, 16:12) Просмат...   Dec 16 2005, 10:31
||- - dxp   Цитата(IgorKossak @ Dec 16 2005, 21:43) Х...   Dec 16 2005, 17:27
|||- - Old1   Цитата(dxp @ Dec 16 2005, 20:27) А что в ...   Dec 16 2005, 18:51
|||- - IgorKossak   Цитата(ig_z @ Dec 17 2005, 05:58) Подавля...   Dec 19 2005, 08:08
||- - _Bill   Цитата(IgorKossak @ Dec 16 2005, 18:43) Ц...   Jun 27 2006, 11:55
|- - PrSt   Цитата(Rst7 @ Dec 16 2005, 17:08) Cуществ...   Nov 1 2013, 04:41
- - zltigo   Цитата(IgorKossak @ Dec 19 2005, 10:08) а...   Dec 19 2005, 11:57
- - IgorKossak   Для задач я обычно применяю __task. Помогает одноз...   Dec 19 2005, 12:37
- - zltigo   Цитата(ig_z @ Dec 19 2005, 17:36) Очень с...   Dec 19 2005, 16:20
|- - dxp   Цитата(zltigo @ Dec 19 2005, 22:20) Экспе...   Dec 20 2005, 07:22
|- - ig_z   Цитата(dxp @ Dec 20 2005, 11:22) Это ключ...   Dec 20 2005, 12:31
|- - dxp   Цитата(ig_z @ Dec 20 2005, 18:31) Да и по...   Dec 20 2005, 12:52
|- - IgorKossak   Цитата(dxp @ Dec 20 2005, 14:52) Цитата(i...   Dec 20 2005, 13:24
|- - dxp   Цитата(IgorKossak @ Dec 20 2005, 19:24) Э...   Dec 20 2005, 14:34
|- - ig_z   2 dxp scmRTOS планируете развивать? Интересно был...   Dec 20 2005, 15:22
|- - dxp   Цитата(ig_z @ Dec 20 2005, 21:22) 2 dxp s...   Dec 21 2005, 07:15
- - Rst7   Да, господа, по поводу __root прогнал. Конечно, __...   Dec 20 2005, 06:20
- - zltigo   Цитата(dxp @ Dec 20 2005, 09:22) Хм, это ...   Dec 20 2005, 07:55
- - Turion   По поводу инструкций SBRA и CBRA - попробуйте в w...   Dec 27 2005, 12:29
- - Old1   Вот еще один квалификатор (или атрибут типа функци...   Jan 14 2006, 18:35
|- - Rst7   Цитата(Old1 @ Jan 14 2006, 20:35) Вот еще...   Jan 15 2006, 06:42
|- - Old1   Цитата(Rst7 @ Jan 15 2006, 10:42) Цитата(...   Jan 15 2006, 16:55
|- - Rst7   Цитата(Old1 @ Jan 15 2006, 18:55) ... О п...   Jan 16 2006, 06:19
|- - Old1   Цитата(Rst7 @ Jan 16 2006, 10:19) Нельзя ...   Jan 16 2006, 20:49
- - Old1   Если кому интересно, в версии ИАР 4.20а атрибуты _...   Jun 25 2006, 17:54
- - Rst7   QUOTE Хочу уточнить(это вопрос) - На сколько я пон...   Nov 1 2013, 23:01
- - grand1987   Здравствуйте, у меня есть вопрос подобный тем что ...   Mar 15 2014, 13:29
- - dxp   QUOTE (grand1987 @ Mar 15 2014, 20:29) Зд...   Mar 16 2014, 12:58


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

 


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


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