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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Недокументированные возможности IAR, extended keywords __x_z, __z?
Old1
сообщение Dec 19 2005, 20:39
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 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
Rst7
сообщение Dec 20 2005, 06:20
Сообщение #17


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

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



Да, господа, по поводу __root прогнал. Конечно, __noreturn не имеет отношения к __root. Я больше имел в виду __task. Для EWAVR отличия вот в чем. __noreturn не сохраняет контекст. __task также не сохраняет контекст, но если вы вызываете процедуру с __task, контекст сохраняется в ВЫЗЫВАЮЩЕЙ процедуре. Точнее, даже не контекст сохраняется, а вызывающая процедура устраивается так, чтобы не зависеть от изменения контекста.


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


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(zltigo @ Dec 19 2005, 22:20) *
Эксперимент:
IAR ARM ANSI C/C++ Compiler V4.30A-P050906/W32
__raw

Это ключевое слово было введено изначально только в пакет EW430 исключительно по личной просьбе. До него в версиях пакета до 2.20 включительно эту функциональность выполняло сочетание __task __interrupt (выглядит забавно-шокирующе, но работало), в дальнейшем в версии 2.21 такое сочетание было запрещено по идеологическим причинам (что, в общем, правильно). Но поскольку потребность в выполняемой ими функциональности никуда не делась, то в версиях 3.хх появилось новое слово __raw (еще рассматривался вариант __naked, как в ГНУтых компиляторах, но IAR'овцы открестились от него - gcc наиболее серьезный конкурент их продуктам). Такова вкратце история появления оного ключевого слова. Поскольку все это шло в контексте EW430, то неудивительно, что в пакетах под другие платформы такого слова нет. Возможно, это только временно. Я ожидал, что в EWAVR 4.10А это появится. Не появилось. Поэтому и удивился, когда сказали, что в 4.11[2] появилось. Видать, осознали. smile.gif Т.ч. может и для АРМов тоже со временем появится. Хотя не факт.

Цитата(zltigo @ Dec 19 2005, 22:20) *
и __task - знать не знает, ведать не ведает таких

Хм, это странно. Такое слово было всегда. Сначала оно называлось C_task. Потом __C_task. Потом привели к общему виду __task. Смысл в нем был, есть и будет всегда. Странно, если EWARM этого не имеет. Может оно там просто по-другому называется?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 20 2005, 07:55
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(dxp @ Dec 20 2005, 09:22) *
Хм, это странно. Такое слово было всегда. Сначала оно называлось C_task. Потом __C_task. Потом привели к общему виду __task. Смысл в нем был, есть и будет всегда. Странно, если EWARM этого не имеет. Может оно там просто по-другому называется?

Забавно, в потрохах компилятора _упоминается_, но попытка использовать его однозначно приводит
к сообщениям аналогичным указанию произвольного несуществующего слова в качестве
ключевого. Возможно работает только в сочетании с чем-то еще. Поэкспериментирую на досуге.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ig_z
сообщение Dec 20 2005, 12:31
Сообщение #20


Местный
***

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



Цитата(dxp @ Dec 20 2005, 11:22) *
Это ключевое слово было введено изначально только в пакет EW430 исключительно по личной просьбе.

Пару лет назад в переписке с Harry Zhurov впервые прочитал эту фразу.
Да и по вашим ответам складывалось впечатление что это вы и есть. Я прав?
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 20 2005, 12:52
Сообщение #21


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(ig_z @ Dec 20 2005, 18:31) *
Да и по вашим ответам складывалось впечатление что это вы и есть. Я прав?

smile.gif Вам бы аналитиком в контрразведке работать. Ни один шпион бы мимо не прошел. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 20 2005, 13:24
Сообщение #22


Шаман
******

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



Цитата(dxp @ Dec 20 2005, 14:52) *
Цитата(ig_z @ Dec 20 2005, 18:31) *

Да и по вашим ответам складывалось впечатление что это вы и есть. Я прав?

smile.gif Вам бы аналитиком в контрразведке работать. Ни один шпион бы мимо не прошел. smile.gif

Это ж надо!!!
Сколько переписывался с Harry Zhurov, а в лицо то и не узнал!!!
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 20 2005, 14:34
Сообщение #23


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(IgorKossak @ Dec 20 2005, 19:24) *
Это ж надо!!!
Сколько переписывался с Harry Zhurov, а в лицо то и не узнал!!!

smile.gif Я Вас тоже смог идентифицировать только после того, как Вы у меня сорцы библиотек из EWAVR 4.хх спросили (у меня не оказалось), а потом этот же вопрос на форуме задали. Тут-то я и сообразил, кто у нас модератор. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
ig_z
сообщение Dec 20 2005, 15:22
Сообщение #24


Местный
***

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



2 dxp
scmRTOS планируете развивать?
Интересно было бы видеть отладочные фичи. Типа мюкосвью. И какой нибудь генератор orti файла для дебугера. Мои эксперименты к сожалению продвигаются очень медленно sad.gif
Go to the top of the page
 
+Quote Post
dxp
сообщение Dec 21 2005, 07:15
Сообщение #25


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(ig_z @ Dec 20 2005, 21:22) *
2 dxp
scmRTOS планируете развивать?
Интересно было бы видеть отладочные фичи. Типа мюкосвью. И какой нибудь генератор orti файла для дебугера. Мои эксперименты к сожалению продвигаются очень медленно sad.gif

Ничего определенного сказать не могу. Проект некоммерческий, делается в свободное время, которого что-то все меньше и меньше. sad.gif Пока в планах две задумки, одна - в связи с появлением __raw в EWAVR, другая помасштабнее (подробности не хочу пока раскрывать, связано с механизмом перепланировки). В скором времени подойдет работа с процом, на ней и обкатаю.

Что касается отладки, то не очень понимаю, что там нужно. Вещица очень простая, прозрачная, чего там, собсно, отлаживать. Если только написать монитор, к нему интерфейс и ГУИ на ПК, чтобы смотреть загрузку процессов... Не знаю, такая работа сама по себе достаточно трудоемка, а смысла в ней большого, имхо, нет. К тому же, такой монитор внесет тормозов, во всяком случае его оверхед будет соизмерим с оверхедом самой RTOS. Поскольку главный смысл этой RTOS - получить максимальное быстродействие при минимальных накладных расходах (а также максимальную простоту использования), то любая сколько-нибудь посторонняя фишка в той или иной степени нивелирует эту самую основную идею. Т.ч., исходя из перечисленных причин, даже не задумывался об каких-то специальных средствах отладки.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Turion
сообщение Dec 27 2005, 12:29
Сообщение #26





Группа: Новичок
Сообщений: 9
Регистрация: 28-11-05
Пользователь №: 11 498



По поводу инструкций SBRA и CBRA - попробуйте в www.google.com
набрать SBRA CBRA instructions avr и посмотрите сохраненные в кэше
результаты по первой ссылке.
Вкратце это инструкции ядра SecureAVR версии AVR3+, информацию по ним
достать очень тяжело, т.к. Atmel ее дает при подписании соглашения о нераспостранении.
Сохраненная страница гласит:

SBRA - Set bit in RAM

Operation: RAM(A,В) <- 1
Syntax: SBRA A,b
Operand: 0<= A <= 15, 0<= b <= 7
Program Counter: PC <- PC+1
16-bit Opcode: 1001 001A AAAb 01bb


example:
sbra 14,0 ; Sets bit 0 in the RAM adress $xxx + $0E ($xxx depends on MCU)

CBRA - Clear bit in RAM
same as above but with Opcode: 1001 00AA AAbb b011

Сообщение отредактировал Turion - Dec 27 2005, 12:32
Go to the top of the page
 
+Quote Post
Old1
сообщение Jan 14 2006, 18:35
Сообщение #27


Знающий
****

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



Вот еще один квалификатор (или атрибут типа функции): __version_3. Узнал о нем получив вот такое сообщение об шибке: Error[Ta027]: Cannot combine function type attributes '__x_z' and '__version_3'... Кто-нибудь знает, что за атрибут такой?
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 15 2006, 06:42
Сообщение #28


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

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



Цитата(Old1 @ Jan 14 2006, 20:35) *
Вот еще один квалификатор (или атрибут типа функции): __version_3. Узнал о нем получив вот такое сообщение об шибке: Error[Ta027]: Cannot combine function type attributes '__x_z' and '__version_3'... Кто-нибудь знает, что за атрибут такой?


Хм, странно, я так понял, что __version_3 - это как раз по умолчанию. А поподробней, где ты нарыл применение этого модификатора?


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


Знающий
****

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



Цитата(Rst7 @ Jan 15 2006, 10:42) *
Цитата(Old1 @ Jan 14 2006, 20:35) *

Вот еще один квалификатор (или атрибут типа функции): __version_3. Узнал о нем получив вот такое сообщение об шибке: Error[Ta027]: Cannot combine function type attributes '__x_z' and '__version_3'... Кто-нибудь знает, что за атрибут такой?


Хм, странно, я так понял, что __version_3 - это как раз по умолчанию. А поподробней, где ты нарыл применение этого модификатора?

О применении его я, как раз, ничего не знаю, потому и спрашиваю. А узнал о нем из сообщения об ошибке (см. выше) после того как пытался скомпилировать код (см. аттачмент). Если подробнее, то ошибка выскакивает при попытке инициализации массива указателей на функции, при определении которых я пытался использовать квалификатор __z_x. Если этот самый __z_x убрать, то все нормально компилируется. Возможно проблема в нестытковке определения типа указателя на функции и определении самих функций...
Прикрепленные файлы
Прикрепленный файл  main.rar ( 600 байт ) Кол-во скачиваний: 45
 
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jan 16 2006, 06:19
Сообщение #30


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

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



Цитата(Old1 @ Jan 15 2006, 18:55) *
...
О применении его я, как раз, ничего не знаю, потому и спрашиваю. А узнал о нем из сообщения об ошибке (см. выше) после того как пытался скомпилировать код (см. аттачмент). Если подробнее, то ошибка выскакивает при попытке инициализации массива указателей на функции, при определении которых я пытался использовать квалификатор __z_x. Если этот самый __z_x убрать, то все нормально компилируется. Возможно проблема в нестытковке определения типа указателя на функции и определении самих функций...


Нельзя при использовании модификатора с _z использовать вызов функции по указателю, т.к. IJMP имеет адрес в Z. Идея ясна?


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

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

 


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


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