|
IAR STM8, Краткий отчет |
|
|
|
May 18 2010, 18:50
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Попробовал портировать проект с 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 )
Непонятна такая разница в размере ОЗУ, буду разбираться, все ли указатели оказались во флэши. Объем кода и констант выглядит равным, с учетом того, что библиотеки подключены не полностью.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
May 19 2010, 10:58
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Stanislav_S @ May 19 2010, 13:51)  Спасибо за отчет! сам сейчас буду переводить проект с 88 меги на S8, поэтому интересует вопрос производительность часом не измеряли? а то пока привязаиться особо не к чему, железо еще не готово. Я пробовал чуток с "железом" поиграться. Есть кое-какие проблемы. Но по производительности STM8 ни чуть не хуже AVR. Большинство команд так же выполняется за 1 такт, плюс инструкции обработки 16-разрядных данных... и т.д. PS: Использую STVD + ассемблер от Cosmic.
Сообщение отредактировал _Bill - May 19 2010, 11:03
|
|
|
|
|
May 19 2010, 17:27
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Dog Pawlowa @ May 19 2010, 18:55)  Только давайте не смешивать проблемы названной среды (которые желательно обсуждать здесь) с проблемами контроллера (которые правильно обсуждать в прочих микроконтроллерах. Понятно, про проблемы - в другом форуме.
|
|
|
|
|
Dec 5 2010, 08:44
|

Участник

Группа: Участник
Сообщений: 38
Регистрация: 10-11-05
Из: Таганрог
Пользователь №: 10 659

|
Разработчики 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, тем более, что адресное пространство единое.
--------------------
Вы пробовали выключить и снова включить?
|
|
|
|
|
Dec 5 2010, 15:58
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Fktrctq @ Dec 5 2010, 11:44)  Это кажется непонятным - что мешает на этапе загрузки программы во флэш грузить данные и в EEPROM, тем более, что адресное пространство единое. Ну, те костыли, которые Atmel предоставил по записи EEPROM, скорее избыточны, а возможность записи определяется не только единым адресным пространством (это скорее трюк), а возможностями отладчика.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Dec 5 2010, 17:02
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Fktrctq @ Dec 5 2010, 13:44)  особенно это неприятно, поскольку создать инициализированный массив данных в области EEPROM не представляется возможным (сегмент объявлен как .noinit). Это кажется непонятным - что мешает на этапе загрузки программы во флэш грузить данные и в EEPROM, тем более, что адресное пространство единое. По поводу EEPROM и общего адресного пространства навевается такая аналогия из обычной жизни. Допустим у вас есть свой дом и гараж рядом с ним или под ним, в общем и дом и гараж находятся на одном участке. Возвращаясь с работы вы заезжаете во двор своего дома и, выходя из авто, бросаете привратнику: "Джон, поставь машину в гараж и запри ворота". Однако машина окажется в гараже только в том случае, если у вас есть этот привратник. В противном случае авто так и простоит до утра у распахнутых ворот, если только вы сами не заведете его в гараж и не запрете ворота. Atmel предоставляет в пользование "привратника", а ST видимо не считает это целесообразным.
|
|
|
|
|
Dec 5 2010, 18:28
|

Участник

Группа: Участник
Сообщений: 38
Регистрация: 10-11-05
Из: Таганрог
Пользователь №: 10 659

|
Аналогия не совсем корректна, в приведенном Вами примере EEPROM - это просто место для гаража, который необходимо построить (создать массив данных) и поставить туда машину (инициализировать). Нет, Вы, конечно в праве построить гараж сами, по собственному чертежу (предварительно изучив основы строительства, закупив стройматериалы и т.п.) ну или прибегнуть к помощи строительной бригады которая сама все сделает за Ваши же деньги. Если инициализировать EEPROM отдельно, т.е. через программатор зашивать в неё данные (поскольку среда этого делать не может) то это равносильно строительству гаража собственными силами, если городить функцию копирования данных из Flash в EEPROM, все равно что нанять (а то и содержать) строительную бригаду. Возможно у Вас EEPROM используется иначе, а вот в моем случае, в неё необходимо при первоначальной прошивке устройства занести массив (точнее структуру) настроек устройства, которые в процессе работы могут редактироваться. У STM8 памяти конечно не мало, но занимать килобайт ПЗУ только ради того чтоб его один раз использовать для инициализации ЭСППЗУ - это неправильно. К стати, Atmel и ST тут не причем, речь об IAR, обе платформы и AVR и STM8 имеют возможность чтения/записи EEPROM посредством внутрисхемного программатора, это палка в огород IAR. К слову: STVD+Cosmic прекрасно умеют инициализировать eeprom, только что проверил.
Сообщение отредактировал Fktrctq - Dec 5 2010, 18:38
--------------------
Вы пробовали выключить и снова включить?
|
|
|
|
|
Dec 5 2010, 18:39
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Fktrctq @ Dec 5 2010, 22:28)  но занимать килобайт ПЗУ Это не единственная альтернатива. Есть еще доступ через какой-нить интерфейс. Обычно интерфейс все равно существует, для чтения установок, истории, событий, управления, и проч. Добавить запись - пара строчек кода.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Dec 5 2010, 19:03
|

Участник

Группа: Участник
Сообщений: 38
Регистрация: 10-11-05
Из: Таганрог
Пользователь №: 10 659

|
Это все конечно понятно, но дело вот в чем: 1. Зачем делать лишнюю работу? Если все можно (точнее очень хочется) прошить за один раз. 2. Вы верно говорите, если в устройстве есть (точнее используются) эти самые интерфейсы. У меня вот например - не используются и ноги все заняты... 3. В IAR у меня даже не получилось создать отдельный файл с данными EEPROM (например HEX или ещё какой), чтоб, например, используя какой-либо из интерфейсов загнать их в МК.
--------------------
Вы пробовали выключить и снова включить?
|
|
|
|
|
Apr 19 2012, 13:01
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Проявился неприятный эффект неполного попадания всех переменных в инициализируемую секцию ОЗУ. В результате после сброса не все переменные остаются проинициализированными. В частности, указатели циклического буфера, и устройство после включения постоянно что-то передает. Это произошло сначала в одном проекте, потом в другом, по мере развития проектов. В одном проекте добавил инициализацию ручками, все заработало, во втором проекте случилось сегодня, и чувствую отвращение к этому контроллеру и компилятору. STM8 - это была ошибка. Никакие преимущества не нужны, если не уверен в результате компиляции.
--------------------
Уходя, оставьте свет...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|