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
У меня в операции разъименовывания указателя была ошибка. Надо так:
Выражение _address + i даёт адрес не i-того байта в текущем элементе, а адрес i-того элемента массива и в данном случае читались байты непонятно откуда. Поэтому эти указатели работали только для обнобайтных типов.
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-того элемента массива и в данном случае читались байты непонятно откуда. Поэтому эти указатели работали только для обнобайтных типов.
Ура! Это работает! Спасибо! Где бы хорошую практическую книжку по шаблонам почитать, а то я только интуитивно в них разбираюсь, а этого мало даже для того, чтобы сделать такое несложное исправление.
У меня массив с описанием менюшек в ОЗУ находился из-за этого недочёта, что очень меня ограничивало, зато теперь я могу делать практически произвольное количество и иерархию окошек, т.к. всё их описание находится полностью во флеш как и должно быть. Это было последнее ограничение на мою разработку «наноОкна» (аналог обработки сообщений окна как у Windows). Вот где описание этих окон и как я хитро изворачиваюсь для обоих компиляторов:
mysvn.ru/schoolbell/pbiidemo/Menu.cpp
У меня sizeof(SWINDOW) = 10 байтам. Тратить целых 10 байт (!) ОЗУ просто так было обидно.
У меня массив с описанием менюшек в ОЗУ находился из-за этого недочёта, что очень меня ограничивало, зато теперь я могу делать практически произвольное количество и иерархию окошек, т.к. всё их описание находится полностью во флеш как и должно быть. Это было последнее ограничение на мою разработку «наноОкна» (аналог обработки сообщений окна как у Windows). Вот где описание этих окон и как я хитро изворачиваюсь для обоих компиляторов:
mysvn.ru/schoolbell/pbiidemo/Menu.cpp
У меня sizeof(SWINDOW) = 10 байтам. Тратить целых 10 байт (!) ОЗУ просто так было обидно.
Это стандартная Студия 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, а только как иногда отладчик и командный компилятор, уж очень убог интерфейс.
Вся эта история со студиями началась давно, лет 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, а только как иногда отладчик и командный компилятор, уж очень убог интерфейс.
а второй более специфичен.Enterprise Architect чтоли?
То есть студию ты используешь по сути только как редактор кода, сборка через мейк, отладки нет?
А чем не понравилось AVR Studio 5? Лично мне оно не нравится той частью, которую делал Atmel — она довольно-таки крива.
Там так много вкусностей и удобства, что я ничем другим и не пользуюсь в качестве редактора кода.Это да, из сравнимых с MSVS IDE я видел только одну — Delphi IDE/BDS (старые версии хотя и менее функциональны, чем BDS, но тоже хороши).
Честно говоря, я всеми практически средами пользуюсь, кроме тех, что есть на 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) клепал для проекта. Даже понравилось, так бы и клепал.
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) клепал для проекта. Даже понравилось, так бы и клепал.
Комментарии (7)
RSS свернуть / развернуть