DogPawlowa 0 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба Попробовал портировать проект с 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 0 19 мая, 2010 Опубликовано 19 мая, 2010 · Жалоба Тоже интересуюсь STM8. Вообще их фирмваре библиотека на данный момент написана только для инструментариев Raisonance и Cosmic. Или у вас какой то новый релиз? Хотя переделать ее под себя не составляет никаких проблем. Я пока определился на связке STVD + Raisonance. Буду пока использовать бесплатную весию, дальше посмотрим. Что касаемо векторов прерываний, из примеров я подсмотрел, что для Cosmicа есть два файла, таблица векторов и их реализация. Для raisonance пишешь ручками void функцию с номером прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 19 мая, 2010 Опубликовано 19 мая, 2010 · Жалоба Хороший отчёт! Но похоже пока сыроват этот тулчейн. Нужно feedback IARовцам отправить по-хорошему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stanislav_S 0 19 мая, 2010 Опубликовано 19 мая, 2010 · Жалоба Спасибо за отчет! сам сейчас буду переводить проект с 88 меги на S8, поэтому интересует вопрос производительность часом не измеряли? а то пока привязаиться особо не к чему, железо еще не готово. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 19 мая, 2010 Опубликовано 19 мая, 2010 (изменено) · Жалоба Спасибо за отчет! сам сейчас буду переводить проект с 88 меги на S8, поэтому интересует вопрос производительность часом не измеряли? а то пока привязаиться особо не к чему, железо еще не готово. Я пробовал чуток с "железом" поиграться. Есть кое-какие проблемы. Но по производительности STM8 ни чуть не хуже AVR. Большинство команд так же выполняется за 1 такт, плюс инструкции обработки 16-разрядных данных... и т.д. PS: Использую STVD + ассемблер от Cosmic. Изменено 19 мая, 2010 пользователем _Bill Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stanislav_S 0 19 мая, 2010 Опубликовано 19 мая, 2010 · Жалоба Я пробовал чуток с "железом" поиграться. Есть кое-какие проблемы. Но по производительности STM8 ни чуть не хуже AVR. Большинство команд так же выполняется за 1 такт, плюс инструкции обработки 16-разрядных данных... и т.д. PS: Использую STVD + ассемблер от Cosmic. Ясно, кстати о проблемах могли бы рассказать? ( дабы не ходить самому по граблям :) ). Работать буду скорее всего в IAR, так мне привычней :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 19 мая, 2010 Опубликовано 19 мая, 2010 · Жалоба Ясно, кстати о проблемах могли бы рассказать? Только давайте не смешивать проблемы названной среды (которые желательно обсуждать здесь) с проблемами контроллера (которые правильно обсуждать в прочих микроконтроллерах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 19 мая, 2010 Опубликовано 19 мая, 2010 · Жалоба Только давайте не смешивать проблемы названной среды (которые желательно обсуждать здесь) с проблемами контроллера (которые правильно обсуждать в прочих микроконтроллерах. Понятно, про проблемы - в другом форуме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LiTr 0 5 декабря, 2010 Опубликовано 5 декабря, 2010 · Жалоба Разработчики 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, тем более, что адресное пространство единое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 5 декабря, 2010 Опубликовано 5 декабря, 2010 · Жалоба Это кажется непонятным - что мешает на этапе загрузки программы во флэш грузить данные и в EEPROM, тем более, что адресное пространство единое. Ну, те костыли, которые Atmel предоставил по записи EEPROM, скорее избыточны, а возможность записи определяется не только единым адресным пространством (это скорее трюк), а возможностями отладчика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 5 декабря, 2010 Опубликовано 5 декабря, 2010 · Жалоба особенно это неприятно, поскольку создать инициализированный массив данных в области EEPROM не представляется возможным (сегмент объявлен как .noinit). Это кажется непонятным - что мешает на этапе загрузки программы во флэш грузить данные и в EEPROM, тем более, что адресное пространство единое.По поводу EEPROM и общего адресного пространства навевается такая аналогия из обычной жизни. Допустим у вас есть свой дом и гараж рядом с ним или под ним, в общем и дом и гараж находятся на одном участке. Возвращаясь с работы вы заезжаете во двор своего дома и, выходя из авто, бросаете привратнику: "Джон, поставь машину в гараж и запри ворота". Однако машина окажется в гараже только в том случае, если у вас есть этот привратник. В противном случае авто так и простоит до утра у распахнутых ворот, если только вы сами не заведете его в гараж и не запрете ворота. ;) Atmel предоставляет в пользование "привратника", а ST видимо не считает это целесообразным. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LiTr 0 5 декабря, 2010 Опубликовано 5 декабря, 2010 (изменено) · Жалоба Аналогия не совсем корректна, в приведенном Вами примере EEPROM - это просто место для гаража, который необходимо построить (создать массив данных) и поставить туда машину (инициализировать). Нет, Вы, конечно в праве построить гараж сами, по собственному чертежу (предварительно изучив основы строительства, закупив стройматериалы и т.п.) ну или прибегнуть к помощи строительной бригады которая сама все сделает за Ваши же деньги. Если инициализировать EEPROM отдельно, т.е. через программатор зашивать в неё данные (поскольку среда этого делать не может) то это равносильно строительству гаража собственными силами, если городить функцию копирования данных из Flash в EEPROM, все равно что нанять (а то и содержать) строительную бригаду. Возможно у Вас EEPROM используется иначе, а вот в моем случае, в неё необходимо при первоначальной прошивке устройства занести массив (точнее структуру) настроек устройства, которые в процессе работы могут редактироваться. У STM8 памяти конечно не мало, но занимать килобайт ПЗУ только ради того чтоб его один раз использовать для инициализации ЭСППЗУ - это неправильно. К стати, Atmel и ST тут не причем, речь об IAR, обе платформы и AVR и STM8 имеют возможность чтения/записи EEPROM посредством внутрисхемного программатора, это палка в огород IAR. К слову: STVD+Cosmic прекрасно умеют инициализировать eeprom, только что проверил. Изменено 5 декабря, 2010 пользователем Fktrctq Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 5 декабря, 2010 Опубликовано 5 декабря, 2010 · Жалоба но занимать килобайт ПЗУ Это не единственная альтернатива. Есть еще доступ через какой-нить интерфейс. Обычно интерфейс все равно существует, для чтения установок, истории, событий, управления, и проч. Добавить запись - пара строчек кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LiTr 0 5 декабря, 2010 Опубликовано 5 декабря, 2010 · Жалоба Это все конечно понятно, но дело вот в чем: 1. Зачем делать лишнюю работу? Если все можно (точнее очень хочется) прошить за один раз. 2. Вы верно говорите, если в устройстве есть (точнее используются) эти самые интерфейсы. У меня вот например - не используются и ноги все заняты... 3. В IAR у меня даже не получилось создать отдельный файл с данными EEPROM (например HEX или ещё какой), чтоб, например, используя какой-либо из интерфейсов загнать их в МК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 19 апреля, 2012 Опубликовано 19 апреля, 2012 · Жалоба Проявился неприятный эффект неполного попадания всех переменных в инициализируемую секцию ОЗУ. В результате после сброса не все переменные остаются проинициализированными. В частности, указатели циклического буфера, и устройство после включения постоянно что-то передает. Это произошло сначала в одном проекте, потом в другом, по мере развития проектов. В одном проекте добавил инициализацию ручками, все заработало, во втором проекте случилось сегодня, и чувствую отвращение к этому контроллеру и компилятору. STM8 - это была ошибка. Никакие преимущества не нужны, если не уверен в результате компиляции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться