Полная версия этой страницы:
IAR STM8
Dog Pawlowa
May 18 2010, 18:50
Попробовал портировать проект с AVR (ATmega32) на STM8s(Discovery), пользуясь IAR STM8 full.
Портирование делалось в условиях одновременного открытия двух сред IAR AVR/STM8, работающих с одними и теми же файлами с условной компиляцией. Исправления, сделанные для портирования в одной среде, тут же проверялись перекомпиляцией в другой среде.
Заметки на полях в случайном порядке, работа не завершена, нужно дописать вызовы функций библиотеки для STM8, сейчас в коде есть заглушки.
1. __delay_cycles в STM8 отсутствует или не подключилась реализация встроенных функций.
2. Диагностика Pe228 "trailing comma" в STM8 отсутствует (в enum). Странно - разбор синтаксиса должен быть идентичен.
3. В файле stm8s.h нет определений векторов прерываний.
Определения векторов прерываний вообще-то находятся в файле iostm8.h, но, если его подключить, находящиеся в этом же файле определения битов конфликтуют с определениями в stm8s.h, который используется в примерах. В stm8s.h - маски, в iostm8.h - битовые структуры. Видимо, ИАР в ходе работ над компилятором перешел на маски, которые используются в библиотеках от ST для STM8. Пришлось указать определения векторов в своих файлах.
4. При ошибках с векторами прерываний происходит внутренняя ошибка компилятора без указания строки ошибки исходника текста!
Очень неприятно, но с MSP430 бывало и хуже - когда из-за ошибок синтаксиса падала среда.
5. Предупреждение Pe083 (type qualifier specified more than once) при генерации массивов с помощью макросов - вылазит только при компиляции оригинального текста, компиляция результата препроцессора проходит без проблем. К сожалению, этот кусок не поддается анализу в трезвом виде.
Речь идет о __flash/const, для STM8 препроцессор должен заменить __flash на const, для AVR - наоборот. Насколько я помню, такой трюк для AVR<>MSP430 проходил без проблем.
6. __enable_interrupt() __disable_interrupt() не выделяет синеньким(что тоже странно), но по крайней мере ошибку не выдает.
7. Линкер не создает HEX-файл.
8. Размер кода
STM8: 14189 3438 1038 (ro code ro data rw data )
AVR: 16060 1850 45
+ common 64
16 100 bytes of CODE memory (+ 24 range fill )
1 850 bytes of DATA memory (+ 45 absolute )
Непонятна такая разница в размере ОЗУ, буду разбираться, все ли указатели оказались во флэши.
Объем кода и констант выглядит равным, с учетом того, что библиотеки подключены не полностью.
topkin
May 19 2010, 06:37
Тоже интересуюсь STM8. Вообще их фирмваре библиотека на данный момент написана только для инструментариев Raisonance и Cosmic. Или у вас какой то новый релиз? Хотя переделать ее под себя не составляет никаких проблем. Я пока определился на связке STVD + Raisonance. Буду пока использовать бесплатную весию, дальше посмотрим. Что касаемо векторов прерываний, из примеров я подсмотрел, что для Cosmicа есть два файла, таблица векторов и их реализация. Для raisonance пишешь ручками void функцию с номером прерывания.
demiurg_spb
May 19 2010, 09:27
Хороший отчёт!
Но похоже пока сыроват этот тулчейн.
Нужно feedback IARовцам отправить по-хорошему.
Stanislav_S
May 19 2010, 09:51
Спасибо за отчет! сам сейчас буду переводить проект с 88 меги на S8, поэтому интересует вопрос производительность часом не измеряли? а то пока привязаиться особо не к чему, железо еще не готово.
Цитата(Stanislav_S @ May 19 2010, 13:51)

Спасибо за отчет! сам сейчас буду переводить проект с 88 меги на S8, поэтому интересует вопрос производительность часом не измеряли? а то пока привязаиться особо не к чему, железо еще не готово.
Я пробовал чуток с "железом" поиграться. Есть кое-какие проблемы. Но по производительности STM8 ни чуть не хуже AVR. Большинство команд так же выполняется за 1 такт, плюс инструкции обработки 16-разрядных данных... и т.д.
PS: Использую STVD + ассемблер от Cosmic.
Stanislav_S
May 19 2010, 13:24
Цитата(_Bill @ May 19 2010, 15:58)

Я пробовал чуток с "железом" поиграться. Есть кое-какие проблемы. Но по производительности STM8 ни чуть не хуже AVR. Большинство команд так же выполняется за 1 такт, плюс инструкции обработки 16-разрядных данных... и т.д.
PS: Использую STVD + ассемблер от Cosmic.
Ясно, кстати о проблемах могли бы рассказать? ( дабы не ходить самому по граблям

). Работать буду скорее всего в IAR, так мне привычней
Dog Pawlowa
May 19 2010, 14:55
Цитата(Stanislav_S @ May 19 2010, 16:24)

Ясно, кстати о проблемах могли бы рассказать?
Только давайте не смешивать проблемы названной среды (которые желательно обсуждать здесь) с проблемами контроллера (которые правильно обсуждать в прочих микроконтроллерах.
Цитата(Dog Pawlowa @ May 19 2010, 18:55)

Только давайте не смешивать проблемы названной среды (которые желательно обсуждать здесь) с проблемами контроллера (которые правильно обсуждать в прочих микроконтроллерах.
Понятно, про проблемы - в другом форуме.
Fktrctq
Dec 5 2010, 08:44
Разработчики IAR сами портировали библиотеку STM8 FWLib под свой компилятор (её можно выдрать из примеров в директории, куда установлен IAR).
По поводу векторов прерываний (пункт 3.): загляните в файл реализации "stm8s_it.c" (который лежит там же, в примерах), в данном случае в IAR нет символьного определения векторов прерываний, используются их порядковые номера вот таким образом:
Код
/**
* @brief Timer4 Update/Overflow Interruption routine.
* @par Parameters:
* None
* @retval
* None
*/
#ifdef _COSMIC_
@far @interrupt void TIM4_UPD_OVF_IRQHandler(void)
#endif
#ifdef _RAISONANCE_
void TIM4_UPD_OVF_IRQHandler(void) interrupt 23
#endif
#ifdef _IAR_SYSTEMS_
#pragma vector=0x19
__interrupt void TIM4_UPD_OVF_IRQHandler(void)
#endif
{
/* Код обработчика */
}
Я в своем проекте не использую заголовочные файлы IAR'а - только из библиотеки, с целью возможности безболезненного портирования на Cosmic или Raisonance.
По поводу линкера (пункт 7.): кроме того что не создает *.hex файлы, на сколько я понял, вообще нет возможности компилировать различные сегменты кода в разные файлы, для последующего программирования, скажем при помощи ST Visual Programmer. особенно это неприятно, поскольку создать инициализированный массив данных в области EEPROM не представляется возможным (сегмент объявлен как .noinit). Это кажется непонятным - что мешает на этапе загрузки программы во флэш грузить данные и в EEPROM, тем более, что адресное пространство единое.
Dog Pawlowa
Dec 5 2010, 15:58
Цитата(Fktrctq @ Dec 5 2010, 11:44)

Это кажется непонятным - что мешает на этапе загрузки программы во флэш грузить данные и в EEPROM, тем более, что адресное пространство единое.
Ну, те костыли, которые Atmel предоставил по записи EEPROM, скорее избыточны, а возможность записи определяется не только единым адресным пространством (это скорее трюк), а возможностями отладчика.
rezident
Dec 5 2010, 17:02
Цитата(Fktrctq @ Dec 5 2010, 13:44)

особенно это неприятно, поскольку создать инициализированный массив данных в области EEPROM не представляется возможным (сегмент объявлен как .noinit). Это кажется непонятным - что мешает на этапе загрузки программы во флэш грузить данные и в EEPROM, тем более, что адресное пространство единое.
По поводу EEPROM и общего адресного пространства навевается такая аналогия из обычной жизни.
Допустим у вас есть свой дом и гараж рядом с ним или под ним, в общем и дом и гараж находятся на одном участке. Возвращаясь с работы вы заезжаете во двор своего дома и, выходя из авто, бросаете привратнику: "Джон, поставь машину в гараж и запри ворота". Однако машина окажется в гараже только в том случае, если у вас
есть этот привратник. В противном случае авто так и простоит до утра у распахнутых ворот, если только вы
сами не заведете его в гараж и не запрете ворота.
Atmel предоставляет в пользование "привратника", а ST видимо не считает это целесообразным.
Fktrctq
Dec 5 2010, 18:28
Аналогия не совсем корректна, в приведенном Вами примере EEPROM - это просто место для гаража, который необходимо построить (создать массив данных) и поставить туда машину (инициализировать). Нет, Вы, конечно в праве построить гараж сами, по собственному чертежу (предварительно изучив основы строительства, закупив стройматериалы и т.п.) ну или прибегнуть к помощи строительной бригады которая сама все сделает за Ваши же деньги. Если инициализировать EEPROM отдельно, т.е. через программатор зашивать в неё данные (поскольку среда этого делать не может) то это равносильно строительству гаража собственными силами, если городить функцию копирования данных из Flash в EEPROM, все равно что нанять (а то и содержать) строительную бригаду.
Возможно у Вас EEPROM используется иначе, а вот в моем случае, в неё необходимо при первоначальной прошивке устройства занести массив (точнее структуру) настроек устройства, которые в процессе работы могут редактироваться. У STM8 памяти конечно не мало, но занимать килобайт ПЗУ только ради того чтоб его один раз использовать для инициализации ЭСППЗУ - это неправильно.
К стати, Atmel и ST тут не причем, речь об IAR, обе платформы и AVR и STM8 имеют возможность чтения/записи EEPROM посредством внутрисхемного программатора, это палка в огород IAR. К слову: STVD+Cosmic прекрасно умеют инициализировать eeprom, только что проверил.
Dog Pawlowa
Dec 5 2010, 18:39
Цитата(Fktrctq @ Dec 5 2010, 22:28)

но занимать килобайт ПЗУ
Это не единственная альтернатива.
Есть еще доступ через какой-нить интерфейс.
Обычно интерфейс все равно существует, для чтения установок, истории, событий, управления, и проч.
Добавить запись - пара строчек кода.
Fktrctq
Dec 5 2010, 19:03
Это все конечно понятно, но дело вот в чем:
1. Зачем делать лишнюю работу? Если все можно (точнее очень хочется) прошить за один раз.
2. Вы верно говорите, если в устройстве есть (точнее используются) эти самые интерфейсы. У меня вот например - не используются и ноги все заняты...
3. В IAR у меня даже не получилось создать отдельный файл с данными EEPROM (например HEX или ещё какой), чтоб, например, используя какой-либо из интерфейсов загнать их в МК.
Dog Pawlowa
Apr 19 2012, 13:01
Проявился неприятный эффект неполного попадания всех переменных в инициализируемую секцию ОЗУ.
В результате после сброса не все переменные остаются проинициализированными. В частности, указатели циклического буфера, и устройство после включения постоянно что-то передает. Это произошло сначала в одном проекте, потом в другом, по мере развития проектов.
В одном проекте добавил инициализацию ручками, все заработало, во втором проекте случилось сегодня, и чувствую отвращение к этому контроллеру и компилятору.
STM8 - это была ошибка. Никакие преимущества не нужны, если не уверен в результате компиляции.
Цитата(Dog Pawlowa @ Apr 19 2012, 17:01)

Проявился неприятный эффект неполного попадания всех переменных в инициализируемую секцию ОЗУ.
Вот
тут сказано про такой же глюк.
Досадно. Попробуйте режим --mfc, вдруг поможет?
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.