Pinboard II (AVR) Demo (видео)


Смотреть в HD. Исходники для симуляции в Протеус: mysvn.ru/schoolbell/pbiidemo/
ТОЛЬКО РЕВИЗИЯ 11 (!) Т.к. там для 4 МГц я сделал сборку.



П.С. У меня есть вопрос к neiver по поводу использования его класса умных указателей. Это благодаря этому классу получилось более менее красиво совместить IAR и AVR GCC.
Вопрос или точнее проблема в том, что оператор разъименования хотя и компилируется в GCC, но не работает как надо для массива структур. Код в исходник попадает, но что он там копирует никому не известно. Мне очень нужно разместить массив стуктур описателей окон LCD дисплея во влеш, но для GCC работа с ним так просто как в IAR никак не получается.

Вот исходник, где нужен оператор разъименования или оператор[]:
mysvn.ru/schoolbell/pbiidemo/PLC.cpp

Там есть кусок кода:

//#ifdef __ICCAVR__
//    extern __flash SWINDOW Windows[];
//#elif defined __GNUC__
//    extern FlashPtr<SWINDOW> Windows;
//#endif
extern SWINDOW Windows[];

// ...

LRESULT CPLC::DispatchMessage( const MSG * lpMsg ){

    // Перебираем все окна и доставляем сообщение
    for ( uint8_t ii = 0; ii < MENU_WINDOWS_COUNT; ii++ ) {

        SWINDOW Window = Windows[ii];

        // TODO: Если окно имеет статус "скрытое", то пропускаем его
        // ...

        // Вызываем функцию окна
        if ( Window.hWnd == lpMsg->hwnd ) {

            if ( Window.pfnWndProc != NULL ) {

                return Window.pfnWndProc( lpMsg->hwnd,
                                            lpMsg->message,
                                            lpMsg->wParam,
                                            lpMsg->lParam );

            } else {

                return NULL;

            }

        }
    }

    // Если сообщение ни кем не получено, всё равно обрабатываем его
	return DefWindowProc( lpMsg->hwnd,
                            lpMsg->message,
                            lpMsg->wParam,
                            lpMsg->lParam );

}

Я создаю переменную Window, чтобы скопировать в неё структуру из флеш, но в GCC это не получается. Закомментирована там часть кода, которая размещает стурктуру во флеш, точнее в этом модуле я лишь только ссылаюсь на это.

Проблему вижу тут: mysvn.ru/schoolbell/pbiidemo/SmartPtr.h

    // Операция разъименовывания указателя. Здесь осуществляется чтение по указателю.
    inline const T operator *() const {
        
        union {
                T value;
                uint8_t bytes[ sizeof(T) ];
        } data;

        for ( unsigned i = 0; i < sizeof(T); ++i ) {
         
            data.bytes[i] = Accessor::Read( _address + i );

        }

        return data.value;

    }

Но я не понимаю что нужно изменить, чтобы процесс пошёл правильно (т.е. это работало).
  • +1
  • 29 февраля 2012, 03:38
  • uni

Комментарии (7)

RSS свернуть / развернуть
У меня в операции разъименовывания указателя была ошибка. Надо так:
inline const T operator *() const {
        union {
                T value;
                uint8_t bytes[ sizeof(T) ];
        } data;
        for ( unsigned i = 0; i < sizeof(T); ++i ) {
            data.bytes[i] = Accessor::Read( (const uint8_t* const)(_address) + i );
        }
        return data.value;
...
template<class T>
class FlashPtr: public BasePtr<T, FlashPtr<T> > {
    public:
        FlashPtr( T *address ): BasePtr< T, FlashPtr<T> >( address ) {}
        static uint8_t Read( const uint8_t *addr ) {
                return pgm_read_byte( addr );
        }
};
    }

Выражение _address + i даёт адрес не i-того байта в текущем элементе, а адрес i-того элемента массива и в данном случае читались байты непонятно откуда. Поэтому эти указатели работали только для обнобайтных типов.
+1
Ура! Это работает! Спасибо! Где бы хорошую практическую книжку по шаблонам почитать, а то я только интуитивно в них разбираюсь, а этого мало даже для того, чтобы сделать такое несложное исправление.

У меня массив с описанием менюшек в ОЗУ находился из-за этого недочёта, что очень меня ограничивало, зато теперь я могу делать практически произвольное количество и иерархию окошек, т.к. всё их описание находится полностью во флеш как и должно быть. Это было последнее ограничение на мою разработку «наноОкна» (аналог обработки сообщений окна как у Windows). Вот где описание этих окон и как я хитро изворачиваюсь для обоих компиляторов:
mysvn.ru/schoolbell/pbiidemo/Menu.cpp

У меня sizeof(SWINDOW) = 10 байтам. Тратить целых 10 байт (!) ОЗУ просто так было обидно.
0
После ревизии 11 этот файл стал ненужен. Кому интересно, см. файл PLC.cpp в корне проекта.
0
А что ты за среду для GCC используешь? Это AVRStudio5 или ты как-то MSVS с GCC-AVR подружил?
0
  • avatar
  • Vga
  • 02 марта 2012, 00:32
Это стандартная Студия 2008, конечно, не AVR Studio c 2010, которая жутко тормозная. Т.е. я использую MS Visual Studio 2008, причём даже не просто так (что уже приятно), а с двумя плагинами специальными: один для работы с SVN, а второй более специфичен. Весь инструментарий я описал в readme.txt.
Вся эта история со студиями началась давно, лет 5-6 назад, когда кто-то (вероятно, что китайцы) сделал клон Visual Studio 6.0, который работал с AVR проектами на подобии как сейчас в 2010 у них сделано. Было очень приятно иметь шуструю и удобную MSVS 6.0 вместо тогдашней 3-ей студии от Atmel. Были, конечно, у той поделки проблемы и в народ видимо она не пошла, но идею переняли, как все заметили. Сам Atmel и перенял.

В MSVS2008, как и в любой другой версии, можно сделать проект на основе Makefile, правда она думает, что это её файл, но мы подсовываем свой, прописываем пути где нужно и вуаля. Там так много вкусностей и удобства, что я ничем другим и не пользуюсь в качестве редактора кода. Привык. Тогда и IAR имел дохлый редактор, который мне и до сих пор действует на нервы. Он Студии в подмётки по этой части даже не годится. Вот, к примеру, такая фича как затенение false'овых веток препроцессора прямо в коде! Это вещь. Там много чего удобного есть.

Скажу больше, Студию можно настроить так, что можно компилировать Release и Debug версии и для IAR и для AVR GCC, не выходя никуда. В Makefile, что я использую, есть зачатки работы над этим, но нужно доделывать. В идеале я бы хотел вообще не использовать визуальную среду IAR, а только как иногда отладчик и командный компилятор, уж очень убог интерфейс.
0
а второй более специфичен.
Enterprise Architect чтоли?

То есть студию ты используешь по сути только как редактор кода, сборка через мейк, отладки нет?

А чем не понравилось AVR Studio 5? Лично мне оно не нравится той частью, которую делал Atmel — она довольно-таки крива.

Там так много вкусностей и удобства, что я ничем другим и не пользуюсь в качестве редактора кода.
Это да, из сравнимых с MSVS IDE я видел только одну — Delphi IDE/BDS (старые версии хотя и менее функциональны, чем BDS, но тоже хороши).
0
Честно говоря, я всеми практически средами пользуюсь, кроме тех, что есть на Linux. А что касается Дельфи, тут недавно себе поставил сборку (опять же от китайцев что-ли):
Delphi7_Lite_Full_Edition_7.3.4.3_Build_20110801.rar (не помню уже где взял, но понравилась)
Очень удивился всяким примочкам со всех сторон.
Но я не брезгую даже Visual Basic 6 и тоже с примочками (есть портабл версия на рутрекере — самое то для кодинга на коленке), которые упрощают жизнь, некоторых нет даже у Visual Studio 2008. Но это для мелких утилит только.

Отладки конечно там нет. Это было бы уже просто супер, если бы можно было как-то подрубить. Отладку я делаю в AVR Studio или в IAR, или в Proteus, или в железе JTAG'ом. Благо хватает всего, тем более у меня исходники для всех сред сразу — где хочу там и отлаживаю. Между прочим, IAR для простой симуляции мне больше нравится, чем AVR Studio, т.к. IAR изначально знаком с C++. В Proteus тоже одно удовольствие симулировать, если, конечно, это возможно. Там можно даже в Power Down загнать контроллер и по прерыванию разбудить (я пробовал). Вещь.

Да, EA очень помогает в генерации шаблонных классов. Пару кликов там в мастере, потом нажать генерацию и в студии уже подключаешь готовые заголовочники, которые стильно оформлены (у каждого класса свой GUID — о как). EA их так маркирует для уникальности. Мне лень создавать пустые cpp и h файлы, а потом там что-то писать, сам не знаешь что. Он, кстати, работает в обе стороны. Удобная вещь, но иногда (редко) глючит. Я вот в последней ревизии им окна (LCD) клепал для проекта. Даже понравилось, так бы и клепал.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.