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

Попробовал портировать проект с 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 )

 

Непонятна такая разница в размере ОЗУ, буду разбираться, все ли указатели оказались во флэши.

Объем кода и констант выглядит равным, с учетом того, что библиотеки подключены не полностью.

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


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

Тоже интересуюсь STM8. Вообще их фирмваре библиотека на данный момент написана только для инструментариев Raisonance и Cosmic. Или у вас какой то новый релиз? Хотя переделать ее под себя не составляет никаких проблем. Я пока определился на связке STVD + Raisonance. Буду пока использовать бесплатную весию, дальше посмотрим. Что касаемо векторов прерываний, из примеров я подсмотрел, что для Cosmicа есть два файла, таблица векторов и их реализация. Для raisonance пишешь ручками void функцию с номером прерывания.

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


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

Хороший отчёт!

Но похоже пока сыроват этот тулчейн.

Нужно feedback IARовцам отправить по-хорошему.

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


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

Спасибо за отчет! сам сейчас буду переводить проект с 88 меги на S8, поэтому интересует вопрос производительность часом не измеряли? а то пока привязаиться особо не к чему, железо еще не готово.

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


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

Спасибо за отчет! сам сейчас буду переводить проект с 88 меги на S8, поэтому интересует вопрос производительность часом не измеряли? а то пока привязаиться особо не к чему, железо еще не готово.

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

PS: Использую STVD + ассемблер от Cosmic.

Изменено пользователем _Bill

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


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

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

PS: Использую STVD + ассемблер от Cosmic.

Ясно, кстати о проблемах могли бы рассказать? ( дабы не ходить самому по граблям :) ). Работать буду скорее всего в IAR, так мне привычней :)

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


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

Ясно, кстати о проблемах могли бы рассказать?

 

Только давайте не смешивать проблемы названной среды (которые желательно обсуждать здесь) с проблемами контроллера (которые правильно обсуждать в прочих микроконтроллерах.

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


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

Только давайте не смешивать проблемы названной среды (которые желательно обсуждать здесь) с проблемами контроллера (которые правильно обсуждать в прочих микроконтроллерах.

Понятно, про проблемы - в другом форуме.

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


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

Разработчики 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, тем более, что адресное пространство единое.

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


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

Это кажется непонятным - что мешает на этапе загрузки программы во флэш грузить данные и в EEPROM, тем более, что адресное пространство единое.

Ну, те костыли, которые Atmel предоставил по записи EEPROM, скорее избыточны, а возможность записи определяется не только единым адресным пространством (это скорее трюк), а возможностями отладчика.

 

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


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

особенно это неприятно, поскольку создать инициализированный массив данных в области EEPROM не представляется возможным (сегмент объявлен как .noinit). Это кажется непонятным - что мешает на этапе загрузки программы во флэш грузить данные и в EEPROM, тем более, что адресное пространство единое.
По поводу EEPROM и общего адресного пространства навевается такая аналогия из обычной жизни.

Допустим у вас есть свой дом и гараж рядом с ним или под ним, в общем и дом и гараж находятся на одном участке. Возвращаясь с работы вы заезжаете во двор своего дома и, выходя из авто, бросаете привратнику: "Джон, поставь машину в гараж и запри ворота". Однако машина окажется в гараже только в том случае, если у вас есть этот привратник. В противном случае авто так и простоит до утра у распахнутых ворот, если только вы сами не заведете его в гараж и не запрете ворота. ;)

Atmel предоставляет в пользование "привратника", а ST видимо не считает это целесообразным. :laughing:

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


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

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

Возможно у Вас EEPROM используется иначе, а вот в моем случае, в неё необходимо при первоначальной прошивке устройства занести массив (точнее структуру) настроек устройства, которые в процессе работы могут редактироваться. У STM8 памяти конечно не мало, но занимать килобайт ПЗУ только ради того чтоб его один раз использовать для инициализации ЭСППЗУ - это неправильно.

К стати, Atmel и ST тут не причем, речь об IAR, обе платформы и AVR и STM8 имеют возможность чтения/записи EEPROM посредством внутрисхемного программатора, это палка в огород IAR. К слову: STVD+Cosmic прекрасно умеют инициализировать eeprom, только что проверил.

Изменено пользователем Fktrctq

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


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

но занимать килобайт ПЗУ

Это не единственная альтернатива.

Есть еще доступ через какой-нить интерфейс.

Обычно интерфейс все равно существует, для чтения установок, истории, событий, управления, и проч.

Добавить запись - пара строчек кода.

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


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

Это все конечно понятно, но дело вот в чем:

1. Зачем делать лишнюю работу? Если все можно (точнее очень хочется) прошить за один раз.

2. Вы верно говорите, если в устройстве есть (точнее используются) эти самые интерфейсы. У меня вот например - не используются и ноги все заняты...

3. В IAR у меня даже не получилось создать отдельный файл с данными EEPROM (например HEX или ещё какой), чтоб, например, используя какой-либо из интерфейсов загнать их в МК.

 

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


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

Проявился неприятный эффект неполного попадания всех переменных в инициализируемую секцию ОЗУ.

В результате после сброса не все переменные остаются проинициализированными. В частности, указатели циклического буфера, и устройство после включения постоянно что-то передает. Это произошло сначала в одном проекте, потом в другом, по мере развития проектов.

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

STM8 - это была ошибка. Никакие преимущества не нужны, если не уверен в результате компиляции.

 

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


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

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

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

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

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

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

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

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

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

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