Old1 0 19 декабря, 2005 Опубликовано 19 декабря, 2005 · Жалоба Очень странно. Какой у вас компилер и версия? У меня мсп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... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 20 декабря, 2005 Опубликовано 20 декабря, 2005 · Жалоба Да, господа, по поводу __root прогнал. Конечно, __noreturn не имеет отношения к __root. Я больше имел в виду __task. Для EWAVR отличия вот в чем. __noreturn не сохраняет контекст. __task также не сохраняет контекст, но если вы вызываете процедуру с __task, контекст сохраняется в ВЫЗЫВАЮЩЕЙ процедуре. Точнее, даже не контекст сохраняется, а вызывающая процедура устраивается так, чтобы не зависеть от изменения контекста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 20 декабря, 2005 Опубликовано 20 декабря, 2005 · Жалоба Эксперимент: 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 этого не имеет. Может оно там просто по-другому называется? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 20 декабря, 2005 Опубликовано 20 декабря, 2005 · Жалоба Хм, это странно. Такое слово было всегда. Сначала оно называлось C_task. Потом __C_task. Потом привели к общему виду __task. Смысл в нем был, есть и будет всегда. Странно, если EWARM этого не имеет. Может оно там просто по-другому называется? Забавно, в потрохах компилятора _упоминается_, но попытка использовать его однозначно приводит к сообщениям аналогичным указанию произвольного несуществующего слова в качестве ключевого. Возможно работает только в сочетании с чем-то еще. Поэкспериментирую на досуге. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ig_z 0 20 декабря, 2005 Опубликовано 20 декабря, 2005 · Жалоба Это ключевое слово было введено изначально только в пакет EW430 исключительно по личной просьбе. Пару лет назад в переписке с Harry Zhurov впервые прочитал эту фразу. Да и по вашим ответам складывалось впечатление что это вы и есть. Я прав? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 20 декабря, 2005 Опубликовано 20 декабря, 2005 · Жалоба Да и по вашим ответам складывалось впечатление что это вы и есть. Я прав? :) Вам бы аналитиком в контрразведке работать. Ни один шпион бы мимо не прошел. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 20 декабря, 2005 Опубликовано 20 декабря, 2005 · Жалоба Да и по вашим ответам складывалось впечатление что это вы и есть. Я прав? :) Вам бы аналитиком в контрразведке работать. Ни один шпион бы мимо не прошел. :) Это ж надо!!! Сколько переписывался с Harry Zhurov, а в лицо то и не узнал!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 20 декабря, 2005 Опубликовано 20 декабря, 2005 · Жалоба Это ж надо!!! Сколько переписывался с Harry Zhurov, а в лицо то и не узнал!!! :) Я Вас тоже смог идентифицировать только после того, как Вы у меня сорцы библиотек из EWAVR 4.хх спросили (у меня не оказалось), а потом этот же вопрос на форуме задали. Тут-то я и сообразил, кто у нас модератор. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ig_z 0 20 декабря, 2005 Опубликовано 20 декабря, 2005 · Жалоба 2 dxp scmRTOS планируете развивать? Интересно было бы видеть отладочные фичи. Типа мюкосвью. И какой нибудь генератор orti файла для дебугера. Мои эксперименты к сожалению продвигаются очень медленно :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 21 декабря, 2005 Опубликовано 21 декабря, 2005 · Жалоба 2 dxp scmRTOS планируете развивать? Интересно было бы видеть отладочные фичи. Типа мюкосвью. И какой нибудь генератор orti файла для дебугера. Мои эксперименты к сожалению продвигаются очень медленно :( Ничего определенного сказать не могу. Проект некоммерческий, делается в свободное время, которого что-то все меньше и меньше. :( Пока в планах две задумки, одна - в связи с появлением __raw в EWAVR, другая помасштабнее (подробности не хочу пока раскрывать, связано с механизмом перепланировки). В скором времени подойдет работа с процом, на ней и обкатаю. Что касается отладки, то не очень понимаю, что там нужно. Вещица очень простая, прозрачная, чего там, собсно, отлаживать. Если только написать монитор, к нему интерфейс и ГУИ на ПК, чтобы смотреть загрузку процессов... Не знаю, такая работа сама по себе достаточно трудоемка, а смысла в ней большого, имхо, нет. К тому же, такой монитор внесет тормозов, во всяком случае его оверхед будет соизмерим с оверхедом самой RTOS. Поскольку главный смысл этой RTOS - получить максимальное быстродействие при минимальных накладных расходах (а также максимальную простоту использования), то любая сколько-нибудь посторонняя фишка в той или иной степени нивелирует эту самую основную идею. Т.ч., исходя из перечисленных причин, даже не задумывался об каких-то специальных средствах отладки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Turion 0 27 декабря, 2005 Опубликовано 27 декабря, 2005 (изменено) · Жалоба По поводу инструкций 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 Изменено 27 декабря, 2005 пользователем Turion Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 14 января, 2006 Опубликовано 14 января, 2006 · Жалоба Вот еще один квалификатор (или атрибут типа функции): __version_3. Узнал о нем получив вот такое сообщение об шибке: Error[Ta027]: Cannot combine function type attributes '__x_z' and '__version_3'... Кто-нибудь знает, что за атрибут такой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 15 января, 2006 Опубликовано 15 января, 2006 · Жалоба Вот еще один квалификатор (или атрибут типа функции): __version_3. Узнал о нем получив вот такое сообщение об шибке: Error[Ta027]: Cannot combine function type attributes '__x_z' and '__version_3'... Кто-нибудь знает, что за атрибут такой? Хм, странно, я так понял, что __version_3 - это как раз по умолчанию. А поподробней, где ты нарыл применение этого модификатора? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Old1 0 15 января, 2006 Опубликовано 15 января, 2006 · Жалоба Вот еще один квалификатор (или атрибут типа функции): __version_3. Узнал о нем получив вот такое сообщение об шибке: Error[Ta027]: Cannot combine function type attributes '__x_z' and '__version_3'... Кто-нибудь знает, что за атрибут такой? Хм, странно, я так понял, что __version_3 - это как раз по умолчанию. А поподробней, где ты нарыл применение этого модификатора? О применении его я, как раз, ничего не знаю, потому и спрашиваю. А узнал о нем из сообщения об ошибке (см. выше) после того как пытался скомпилировать код (см. аттачмент). Если подробнее, то ошибка выскакивает при попытке инициализации массива указателей на функции, при определении которых я пытался использовать квалификатор __z_x. Если этот самый __z_x убрать, то все нормально компилируется. Возможно проблема в нестытковке определения типа указателя на функции и определении самих функций... main.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 16 января, 2006 Опубликовано 16 января, 2006 · Жалоба ... О применении его я, как раз, ничего не знаю, потому и спрашиваю. А узнал о нем из сообщения об ошибке (см. выше) после того как пытался скомпилировать код (см. аттачмент). Если подробнее, то ошибка выскакивает при попытке инициализации массива указателей на функции, при определении которых я пытался использовать квалификатор __z_x. Если этот самый __z_x убрать, то все нормально компилируется. Возможно проблема в нестытковке определения типа указателя на функции и определении самих функций... Нельзя при использовании модификатора с _z использовать вызов функции по указателю, т.к. IJMP имеет адрес в Z. Идея ясна? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться