|
Недокументированные возможности IAR, extended keywords __x_z, __z? |
|
|
|
Dec 16 2005, 10:12
|

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

|
Просматривал хидер pgmspace.h и обратил внимание на модификаторы __x_z и __z, в мануале на компилятор про их назаначение ничего не нашел (или плохо искал?...), в апликашках они тоже вроде бы не встречаются. Решил попробовать использовать их наугад, написал простенький код на С++ (описал две одинаковых функции одна с __x_z, другая без, исходный код и результат компиляции см. в присоединенных файлах), скомпилировал, оказалось что код функции с модификатором компактнее (за счет ИМХО более рационального использования регистров-указателей) и выполняется быстрей (на 30% в данном примере). Вопросы: кто, что о них (модификаторах) знает (особенности их использования)? Какие мысли есть о том, почему ИАР ничего не пишет о них ( ведь ИМХО вещ вроде бы полезная)?
|
|
|
|
|
 |
Ответов
|
Dec 16 2005, 11:02
|

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

|
Для улучшения скорости и компактности некоторых функций, особенно static, применяю эти квалификаторы. О ни действительно в руководствах ничего нет. Некоторые замеченные особенности: - квалификаторы действуют только на указатели, в остальных случаях игнорируются; - не существует квалификатора __z_x  ; - ...
|
|
|
|
|
Dec 16 2005, 14:08
|

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

|
Цитата(IgorKossak @ Dec 16 2005, 13:02)  Для улучшения скорости и компактности некоторых функций, особенно static, применяю эти квалификаторы. О ни действительно в руководствах ничего нет. Некоторые замеченные особенности: - квалификаторы действуют только на указатели, в остальных случаях игнорируются; - не существует квалификатора __z_x  ; - ... Cуществует и __z_x и __x_z - соответственно, как передавать первый и второй указатель. По поводу только указателей - если очень надо, преобразуй например int в void * и передай, а потом наоборот. На форуме "Точка опоры" я писал про недокумментированные фичи иара, всякие "__raw", "__no_return" и прочее. Поищи там, давненько дело было. Также есть еще SBRA и CBRA - это коммады какие-то AVR, иар их может использовать. Что за хрень - не знаю.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Dec 16 2005, 15:43
|

Шаман
     
Группа: Модераторы
Сообщений: 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) таких инструкций нет. Что имели в виду ИАРовцы - не понятно.
|
|
|
|
|
Dec 17 2005, 03:58
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
Как то пытался переписывать порты под вытесняющие ОСи на чистом С в иар для мсп430. __no_return не оказывает никакого эффекта. Т.е. компилятор не ругается, но и рет не подавляет. Плюс __interrupt разрешают применять только для обработчиков прерываний, так что красота не получается пока Цитата(IgorKossak @ Dec 16 2005, 19:43)  __no_return - в бутлоадере (немного сокращает размер). Подавляет ret, тем самым позволяет на С создавать конструкции типа "несколько точек входа на одну точку выхода", я правильно понимаю? И почему в бутлоадере? Это как-то связанно с АВР или больше нигде не возникает необходимость в подобном механизме?
|
|
|
|
|
Dec 17 2005, 07:40
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 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 в любой комбинации, если используется вызов данной функции по указателю.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Dec 19 2005, 15:36
|
Местный
  
Группа: Свой
Сообщений: 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. Чесно предупреждает, что больше не сможет вернуться в точку вызова  . Но т.к. не подавляет ret в вызываемой функции, благополучно возвращается в точку вызова На мсп430 3.30 __noreturn не делает ничего. Т.е. ret не подавляется, а регистры сохраняются. Все остальные extended keywords работают корректно.
|
|
|
|
|
Dec 19 2005, 20:39
|

Знающий
   
Группа: Свой
Сообщений: 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. Чесно предупреждает, что больше не сможет вернуться в точку вызова  . Но т.к. не подавляет ret в вызываемой функции, благополучно возвращается в точку вызова На мсп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...
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|