Перейти к содержанию
    

Недокументированные возможности IAR

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

У меня мсп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: . Но т.к. не подавляет ret в вызываемой функции, благополучно возвращается в точку вызова :tongue:

 

На мсп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...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эксперимент:

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] появилось. Видать, осознали. :) Т.ч. может и для АРМов тоже со временем появится. Хотя не факт.

 

и __task - знать не знает, ведать не ведает таких

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Забавно, в потрохах компилятора _упоминается_, но попытка использовать его однозначно приводит

к сообщениям аналогичным указанию произвольного несуществующего слова в качестве

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это ключевое слово было введено изначально только в пакет EW430 исключительно по личной просьбе.

Пару лет назад в переписке с Harry Zhurov впервые прочитал эту фразу.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Это ж надо!!!

Сколько переписывался с Harry Zhurov, а в лицо то и не узнал!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это ж надо!!!

Сколько переписывался с Harry Zhurov, а в лицо то и не узнал!!!

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 dxp

scmRTOS планируете развивать?

Интересно было бы видеть отладочные фичи. Типа мюкосвью. И какой нибудь генератор orti файла для дебугера. Мои эксперименты к сожалению продвигаются очень медленно :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 dxp

scmRTOS планируете развивать?

Интересно было бы видеть отладочные фичи. Типа мюкосвью. И какой нибудь генератор orti файла для дебугера. Мои эксперименты к сожалению продвигаются очень медленно :(

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу инструкций 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

main.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...