23.11.2012, 17:47
|
|
Частый гость
Регистрация: 11.09.2011
Адрес: Екатеринбург
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Шаблоны проектов на C++ для AVR [GCC, IAR]
Ссылка на svn репозиторий:
Шаблоны: https://mysvn.ru/avr/templates/
Примеры: https://mysvn.ru/avr/examples/
Экспортировать из репозитория к себе можно при помощи плагина к проводнику: TortoiseSVN.
Шаблоны для микроконтроллеров: ATtiny2313, ATmega48, ATmega16, ATmega32, ATmega128, ATtiny2313.
Особенности шаблонов:
1. Проекты шаблонов собраны таким образом, что компилируются в двух C++ компиляторах: avr-gcc и iar.
2. Каждый шаблон имеет класс CMCU, который является программной моделью микроконтроллера AVR.
3. Обработка событий (прерываний) осуществляется через соответствующие методы класса CMCU, которые имеют соответствующие названия.
4. Код максимально самодокументирован, вплоть до отдельных настроечных битов конфигурационных регистров.
5. В каждый проект шаблона включён заголовочный файл с классом CVersion. Этот класс создаётся автоматически перед каждой компиляции проекта (и в iar, и в gcc). Его назначение - автоматически отслеживать номер версии прошивки в стиле: Major.Minor.Build.Revision, где первое число изменяется от 0 до 9, второе от 0 до 99, а последние два от 0 до 9999. Также в классе есть метод, возвращающий дату билда в виде строки. Строка находится во флеш.
6. Первоначально проекты шаблонов настроены для работы с WinAVR-20100110 и IAR 6.10.
7. Каждый шаблон имеет возможность однообразного описания декларации переменных и одномерных массивов, которые должны находится во флеш. При использовании специального C++ шаблона умного указателя (SmartPtr.h) можно забыть про функции типа pgm_read_byte() и eeprom_read_byte(). С++ компилятор автоматически вызовет эти функции для чтения данных из флеш или eeprom.
8. Для тех, кто умеет пользоваться VS2008, в каждой папке есть GCC проект для этой IDE, в котором можно работать над проектом. Сборка идёт через Makefile.
Назначение:
1. Переход на объектный C.
2. Небольшие проекты без сильных требований к быстродействию, т.е. там где не нужны в большом количестве ассемблерные вставки. Их можно подключать и в шаблонах, но только в качестве исключения.
3. Для тех, кому нравится ООП или хочет писать с использованием ООП на AVR.
Ограничения и недостатки:
1. При использовании двумерных массивов, которые должны находится во флеш, теряется кросс-компиляция.
2. Шаблоны пока ещё не готовы на 100%, в них могут быть неточности в плане описания регистров или битов. Нужно быть внимательными.
Последний раз редактировалось Вячеслав Мезенцев; 06.10.2013 в 18:25.
Причина: Исправления и добавления
|
|
|
Эти 2 пользователя(ей) сказали Спасибо Вячеслав Мезенцев за это сообщение:
|
|
|
23.11.2012, 17:48
|
|
Частый гость
Регистрация: 11.09.2011
Адрес: Екатеринбург
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Шаблоны проектов на C++ для AVR [GCC, IAR]
Пример 1. Проект на основе шаблона ATmega16: freemodbus.
Код:
|
AVR Memory Usage
----------------
Device: atmega16
Program: 6398 bytes (39.1% Full)
(.text + .data + .bootloader)
Data: 421 bytes (41.1% Full)
(.data + .bss + .noinit)
-------- end --------
IAR Universal Linker V5.2.3.14
Copyright 1987-2011 IAR Systems AB.
5 778 bytes of CODE memory (+ 32 range fill )
484 bytes of DATA memory (+ 25 absolute ) |
Настройки адреса и регистров находятся в файле Configuration.h:
Код:
|
#define REG_INPUT_START 1000
#define REG_INPUT_NREGS 4 |
В проекте определены 4 регистра:
Код:
|
/**
* Главный (основной) поток программы
*/
HRESULT CMCU::MainThreadProcedure(){
const UCHAR ucSlaveID[] = { 0xAA, 0xBB, 0xCC };
eMBErrorCode eStatus;
eStatus = eMBInit( ::MB_RTU, 0x0A, 0, 9600, ::MB_PAR_NONE );
eStatus = eMBSetSlaveID( 0x34, TRUE, ucSlaveID, 3 );
__enable_interrupt();
// Enable the Modbus Protocol Stack
eStatus = eMBEnable();
do {
( void ) eMBPoll();
// Here we simply count the number of poll cycles
usRegInputBuf[0] = Value1;
usRegInputBuf[1] = Value2;
usRegInputBuf[2] = ( USHORT ) CVersion::GetRevision();
usRegInputBuf[3] = ( USHORT ) CVersion::GetBuild();
} while ( true );
// Все проверки прошли успешно, объект в рабочем состоянии
return NO_ERROR;
} |
Value1 изменяется с частотой 1 секунда, а Value2 - 5 секунд.
|
|
|
|
23.11.2012, 17:50
|
|
Частый гость
Регистрация: 11.09.2011
Адрес: Екатеринбург
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Шаблоны проектов на C++ для AVR [GCC, IAR]
Пример 2. Проект на основе шаблона ATmega16: uSD с модулем Petit FAT File System.
Код:
|
AVR Memory Usage
----------------
Device: atmega16
Program: 10238 bytes (62.5% Full)
(.text + .data + .bootloader)
Data: 461 bytes (45.0% Full)
(.data + .bss + .noinit)
-------- end --------
IAR Universal Linker V5.2.3.14
Copyright 1987-2011 IAR Systems AB.
8 740 bytes of CODE memory (+ 36 range fill )
585 bytes of DATA memory (+ 16 absolute ) |
Размер кода можно изменять включая и выключая части драйвера Petit FS.
Подключение флешки к ATmega16:
Код:
|
// Definitions for MMC/SDC connection
#define SD_DI 5 // MOSI
#define SD_DO 6 // MISO
#define SD_CLK 7 // CLK
#define SD_CS 4 // SS
#define SD_INS 0 // CD
#define SD_WP 1 // WP |
|
|
|
|
23.11.2012, 17:51
|
|
Частый гость
Регистрация: 11.09.2011
Адрес: Екатеринбург
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Шаблоны проектов на C++ для AVR [GCC, IAR]
Пример 3. Пример проекта на основе шаблона ATmega16: MicroVGA conio/user interface library.
Код:
|
AVR Memory Usage
----------------
Device: atmega16
Program: 13874 bytes (84.7% Full)
(.text + .data + .bootloader)
Data: 523 bytes (51.1% Full)
(.data + .bss + .noinit)
-------- end --------
IAR Universal Linker V5.2.3.14
Copyright 1987-2011 IAR Systems AB.
12 839 bytes of CODE memory (+ 36 range fill )
625 bytes of DATA memory (+ 19 absolute ) |
|
|
|
|
07.12.2012, 20:11
|
|
Частый гость
Регистрация: 11.09.2011
Адрес: Екатеринбург
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Шаблоны проектов на C++ для AVR [GCC, IAR]
6-минутный ролик, демонстрирующий работу простого файлового менеджера на ATmega16 @ 16 МГц. Показана идентичная работа обеих прошивок (iar и avr-gcc): www.youtube.com/watch?v=6OPQV9aZWaE
В качестве отладочной платы используется Pinboard 2. Схема включения типовая. Этот проект можно запустить в Proteus, схема прилагается к исходникам. Правда там будут тормоза, но отлаживать можно.
Исходник: https://mysvn.ru/avr/examples/uSD/
|
|
|
Сказали "Спасибо" Вячеслав Мезенцев
|
|
|
07.12.2012, 20:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
|
Re: Шаблоны проектов на C++ для AVR [GCC, IAR]
Сообщение от Вячеслав Мезенцев
|
Код:
AVR Memory Usage
----------------
Device: atmega16
Program: 13874 bytes (84.7% Full)
(.text + .data + .bootloader)
Data: 523 bytes (51.1% Full)
(.data + .bss + .noinit)
-------- end --------
IAR Universal Linker V5.2.3.14
Copyright 1987-2011 IAR Systems AB.
12 839 bytes of CODE memory (+ 36 range fill )
625 bytes of DATA memory (+ 19 absolute
|
Довольно странные результаты. Я тестил и Яр и Гнутый компилятор - разница в среднем 200 байт на 10 килобайт (при объёмах больше 2 к). Самое большее было 400 с мелочью байт. Но не килобайты.
|
|
|
|
07.12.2012, 21:12
|
|
Частый гость
Регистрация: 11.09.2011
Адрес: Екатеринбург
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Шаблоны проектов на C++ для AVR [GCC, IAR]
Многое зависит от ключей компилятора. К примеру, в проекте uSD 28-й ревизии разница между компиляцией iar'а и avr-gcc (C++) по флеш составляет несколько килобайт (2-4 Кбайт). iar много кушает ОЗУ, но у него хорошо C++ код упаковывается, у avr-gcc наоборот.
Дело ещё в том (я забыл упомянуть), что в avr-gcc я использую эмуляцию __flash iar'а при помощи специального C++ шаблона. Поэтому там, где у iar'а и так всё понятно при работе со строками во флеш, avr-gcc трудится гораздо больше. Вот в чём может быть причина. Если есть "прямая" работа со строками, таблицами во флеш, то разница будет больше.
Надеюсь, что когда 4.7 версия войдёт в массы, то отпадёт необходимость в дополнительных инструментах, т.к. там __flash уже есть.
|
|
|
|
08.12.2012, 11:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
|
Re: Шаблоны проектов на C++ для AVR [GCC, IAR]
Мдя, я собсно на 4.7.0 и сравнивал...
|
|
|
|
08.12.2012, 12:13
|
|
Частый гость
Регистрация: 11.09.2011
Адрес: Екатеринбург
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Шаблоны проектов на C++ для AVR [GCC, IAR]
Сообщение от _guardianangel
|
Мдя, я собсно на 4.7.0 и сравнивал...
|
4.7.0, как говорится, это для храбрых : avr-gcc 4.7.0 for the brave .
Значит нужно так и писать: я сравнивал такой-то gcc и такой-то iar на таких-то конкретных примерах (стандартных может быть) для такого-то языка (C, C++), с преимущественным использованием или неиспользованием чего-то.
В 10 К можно залить всё что угодно и говорить потом о 200 байтах различий .
У меня много конструкций такого характера:
Код:
|
static void WriteString( FCHAR_PTR Value, EnCodePage CodePage = cp866, uint8_t Length = 0 );
static void WriteString( const char * Value, EnCodePage CodePage = cp866, uint8_t Length = 0 );
static FRESULT Open( const char * FileName );
static FRESULT Open( FCHAR_PTR FileName );
static FRESULT Write( const void * Buffer, WORD ByteToWrite, WORD * BytesWritten );
static FRESULT Write( FCHAR_PTR Buffer, WORD ByteToWrite, WORD * BytesWritten );
static FRESULT OpenDir( DIR * DirObject, const char * DirName );
static FRESULT OpenDir( DIR * DirObject, FCHAR_PTR DirName );
inline static FRESULT FollowPath( DIR * DirObject, const char * path );
inline static FRESULT FollowPath( DIR * DirObject, FCHAR_PTR path );
inline static FRESULT CreateName( DIR * DirObject, const char * * path );
inline static FRESULT CreateName( DIR * DirObject, FCHAR_PTR * path ); |
Где FCHAR_PTR определён при помощи шаблона C++, чтобы я мог единым образом использовать в iar и gcc конструкции вида:
Код:
|
CConsole::WriteString( SPSTR( "Файловый менеджер, ATmega16 @ 16 МГц, версия сборки: " ), CConsole::cp1251 );
CConsole::WriteString( Version ); |
При этом все строки расположены во флеш и там и там и я явно не использую вызов pgm_read_xxx(). Не уверен, что кто-то уже освоил __flash в 4.7.0 на полную катушку и может показать примеры тестовых проектов для iar и gcc размером в 10К, которые компилируются в обоих компиляторах.
Мне было бы интересно как сейчас можно определить одномерные и двумерные массивы во флеш, особенно интересует массив строк. Как это выглядит хотелось бы взглянуть, т.к. это часто используется в менюшках и интерфейсах на основе иерархического меню.
|
|
|
|
28.06.2013, 21:35
|
|
Частый гость
Регистрация: 11.09.2011
Адрес: Екатеринбург
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Шаблоны проектов на C++ для AVR [GCC, IAR]
Пример 4. Проект на основе шаблона ATmega16 (WinAVR-20100110, IAR 6.10.2): Игра Тетрис.
Код:
|
AVR Memory Usage
----------------
Device: atmega16
Program: 6730 bytes (41.1% Full)
(.text + .data + .bootloader)
Data: 347 bytes (33.9% Full)
(.data + .bss + .noinit)
IAR Universal Linker V5.2.3.14
Copyright 1987-2011 IAR Systems AB.
6 154 bytes of CODE memory (+ 36 range fill )
439 bytes of DATA memory (+ 19 absolute ) |
Проект ещё не доработан. Текущий функционал: поочерёдно падающие фигурки.
Что нужно, чтобы отлаживать проект как на картинке:
1. Настроить в Makefile частоту 8 МГц (для IAR'а она выставляется в Configuration.h), скорость в Configuration.h выставить BAUD 38400UL.
2. Нужна программа, эмулирующая нульмодем (Virtual Serial Ports Driver XP 4.0).
3. Нужен терминал, поддерживающий ANSI (ZOC или PuTTY). Там выставить соответствующие настройки: 38400, 8N1.
4. Не забыть в Proteus выбрать объектный файл (gccout.elf или iccout_ubrof8.d90) и частоту генератора у ATmega16 выставить 8МГц.
С такими настройками всё работает почти как на реальном железе, для которого лучше поставить и кварц и скорости по больше. Можете прочитать readme, где описан инструментарий.
|
|
|
Сказали "Спасибо" Вячеслав Мезенцев
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:33.
|
|