Попробовал портировать проект с 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 )
Непонятна такая разница в размере ОЗУ, буду разбираться, все ли указатели оказались во флэши. Объем кода и констант выглядит равным, с учетом того, что библиотеки подключены не полностью.
--------------------
Уходя, оставьте свет...
|