|
Ещё раз о бутлоадере, Некоторые тонкости. |
|
|
|
 |
Ответов
|
Oct 9 2007, 23:55
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Сергей, всётаки по коду не уложился в 2к. Со своим WakeUp-ом. Там ещё некоторые приколы есть. У меня должно осуществляться обновление прямо в сети. Соответственно при обновлении требуется сверять серийный номер устройства. Его я не хочу записывать в лоадер, дабы лоадер унифицированный был. Поэтому при перепрошивке вытаскиваю номер перепрошиваю и сохраняю номер.  Короче впрямую в 2к не влез. В связи с тем, что сам протокол Wake, если работать ч/з прерывания, практически не связан с лоадером - переписал его на ASM. Думаю так влезу. Но вот возник вопрос. там есть конструкция в лоадере если помнишь. typedef union { struct { uint8_t m_rxBuffer[BUFFER_SIZE]; // Receive buffer uint8_t m_pageBuffer[PAGE_SIZE]; // Page is assembled here before // getting programmed to flash mem } part1; #define rxBuffer sharedbufs.part1.m_rxBuffer Честно говоря смысл её не всосал. Чтобы к одному и тому же участку памяти под разными именами обращаться, что ли. Но у меня с ней проблемы на ASM. Не могу понять как на ASM указать адрес начала буфера приёмного (rxBuffer)??? Сори.  Разобрался. Просто как-то в голове не укладывается как в ассемблере имена структур фигурируют. Понятно что потом линкер их к адресам приводит, но всё равно несколько диковато.
|
|
|
|
|
Oct 10 2007, 10:58
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(SasaVitebsk @ Oct 10 2007, 02:55)  Сергей, всётаки по коду не уложился в 2к. Со своим WakeUp-ом. Ты пытаешься засунуть в загрузчик еще какие-то команды кроме UpdateFirmware? У меня Wake-подобный протокол, я сделал так: Код static unsigned char busReceiveByte(void) { uint8_t c = UART_getchar(); if(c == CTL) c = UART_getchar() ^ 0x20; return c; } __C_task void main(void) { ....... if(!dir(MANUAL_PROG)) { uint8_t command[7]; command[0] = 0xC0; // Begin Of Frame uint16_t Tmp = SerialNo(); command[1] = Tmp; command[2] = Tmp >> 8; command[3] = 0xFF; uint8_t *ptr = &command[1]; Tmp = 0xFFFF; Tmp = CRC_XMODEM (*ptr++, Tmp); Tmp = CRC_XMODEM (*ptr++, Tmp); Tmp = CRC_XMODEM (*ptr++, Tmp); command[4] = ~Tmp; command[5] = ~(Tmp >> 8); command[6] = 0xC1; // End Of Frame uint8_t idx = 0; do { uint8_t c = busReceiveByte();
if(c != command[idx]) idx = 0; else idx++; } while(idx < sizeof(command)); // wait for EOM } busReplyByte(ERROR_OK); Т.е. я формирую образ всей команды и сравниваю проходящий поток с образцом. Сгенерить образец гораздо проще, чем реализовывать весь конечный автомат приема. Увы, это проходит только для одной команды. Цитата(SasaVitebsk @ Oct 10 2007, 02:55)  Соответственно при обновлении требуется сверять серийный номер устройства. Его я не хочу записывать в лоадер, дабы лоадер унифицированный был. Поэтому при перепрошивке вытаскиваю номер перепрошиваю и сохраняю номер.  У меня в области загрузчика есть функция Код #pragma segment="GET_SERIAL" #pragma location="GET_SERIAL" __root uint16_t SerialNo(void) { return ~0;} При прошивке я указываю AvRealу -c?serno2=1826,serno.txt и он автоматически при программировании подставляет в эту функцию уникальные номера. Номер хранится в загрузчике и не может быть случайно стерт с приложением. Функцию SerialNo() можно вызвать и из приложения, поэтому и приложение становится независимым от серийника. Функция занимает 6 байт, что меньше чем код для чтения 16-битной константы из флеш с помощью LPM Цитата(SasaVitebsk @ Oct 10 2007, 02:55)  Честно говоря смысл её не всосал. Чтобы к одному и тому же участку памяти под разными именами обращаться, что ли. Именно так. Для улучшения читабельности. Т.е. "сейчас мы работаем с этим блоком как с буфером приема" Цитата(SasaVitebsk @ Oct 10 2007, 02:55)  Сори.  Разобрался. Просто как-то в голове не укладывается как в ассемблере имена структур фигурируют. Понятно что потом линкер их к адресам приводит, но всё равно несколько диковато.  Ну, если не на плюсах писать, то имена как и у обычных переменных. А вот к полям из ассемблера, увы, только вручную указывая смещение от начала структуры.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 10 2007, 13:35
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Сергей Борщ @ Oct 10 2007, 13:58)  Ты пытаешься засунуть в загрузчик еще какие-то команды кроме UpdateFirmware? У меня Wake-подобный протокол, я сделал так: Пытаюсь Сергей.  Вчера в 3 часа ночи получил результат 2232.  Если бы надо было байт 50 выжать ещё бы попытался, а так буду пробовать в обход. Я видишь ли с прерываниями завязался. Возможно придётся отказаться. Только вектора занимают 112 байт. Можно конечно их под себя подмять. Короче буду думу думать. Жалко выделять 4к если нехватает совсем чуть чуть. Спасибо за рекомендации. Разбираюсь. Пользуюсь. Помагает.
|
|
|
|
|
Oct 16 2007, 18:01
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(SasaVitebsk @ Oct 10 2007, 17:35)  Вчера в 3 часа ночи получил результат 2232.  Если бы надо было байт 50 выжать ещё бы попытался, а так буду пробовать в обход. Я видишь ли с прерываниями завязался. Возможно придётся отказаться. Только вектора занимают 112 байт. Можно конечно их под себя подмять. Короче буду думу думать. Жалко выделять 4к если нехватает совсем чуть чуть. SasaVitebsk, а Вы принципиально не будете пробовать Gcc ? Стало интересно, посмотрел на исходники, ну этот код, особенно aes.c просто предназначен для компилирования gcc  на Iar там принципиально хуже... P.S. Еще очень порадовало обращение к EEPROM переменным через функции писанные на асм... Интересно, почему на Iar не воспользовались __eeprom ???
|
|
|
|
Сообщений в этой теме
SasaVitebsk Ещё раз о бутлоадере Oct 4 2007, 09:17 Сергей Борщ Цитата(SasaVitebsk @ Oct 4 2007, 12:17) Х... Oct 4 2007, 09:37 IJAR Цитата(Сергей Борщ @ Oct 4 2007, 13:37) Е... Oct 9 2007, 11:40  Сергей Борщ Цитата(IJAR @ Oct 9 2007, 14:40) А какой ... Oct 9 2007, 12:01   IJAR Цитата(Сергей Борщ @ Oct 9 2007, 16:01) Ч... Oct 9 2007, 12:33    Сергей Борщ Цитата(IJAR @ Oct 9 2007, 15:33) Но есть ... Oct 9 2007, 14:33 SasaVitebsk Спасибо Сергей. Всё доступно объяснил. Подходят о... Oct 4 2007, 19:14 arttab а почему бы не объявить переменную в озу в загрузч... Oct 7 2007, 14:34 Сергей Борщ Цитата(arttab @ Oct 7 2007, 17:34) В загр... Oct 8 2007, 08:16 IJAR Цитата(SasaVitebsk @ Oct 4 2007, 13:17) З... Oct 9 2007, 07:28 Сергей Борщ Цитата(IJAR @ Oct 9 2007, 10:28) 1. Испол... Oct 9 2007, 10:45   Сергей Борщ Цитата(SasaVitebsk @ Oct 10 2007, 16:35) ... Oct 10 2007, 15:46    Dog Pawlowa Цитата(Сергей Борщ @ Oct 10 2007, 18:46) ... Oct 10 2007, 16:42     Сергей Борщ Цитата(Dog Pawlowa @ Oct 10 2007, 19:42) ... Oct 10 2007, 16:57    Сергей Борщ Цитата(singlskv @ Oct 16 2007, 21:01) Ста... Oct 17 2007, 09:56 SasaVitebsk Код
2 106 bytes of CODE memory
1 430 bytes of D... Oct 11 2007, 09:07 Waso Извиняюсь что лезу в чужую тему, но есть дилетантс... Oct 12 2007, 08:36 Сергей Борщ Цитата(Waso @ Oct 12 2007, 11:36) Я плани... Oct 12 2007, 11:04 Waso Спасибо за совет!
Нашел апноты. Изучаю.
Safe ... Oct 15 2007, 07:02 SasaVitebsk Ещё один вопрос, напрямую с бутлоадером не связанн... Oct 16 2007, 10:28 Сергей Борщ Цитата(SasaVitebsk @ Oct 16 2007, 13:28) ... Oct 16 2007, 12:51  IgorKossak Цитата(Сергей Борщ @ Oct 16 2007, 15:51) ... Oct 16 2007, 20:32 SasaVitebsk Спасибо, но я не планирую запрещать локи на чтение... Oct 16 2007, 16:47 SasaVitebsk 2 singlskv. Не планирую переходить на GCC. Работы ... Oct 16 2007, 20:58 singlskv Цитата(SasaVitebsk @ Oct 17 2007, 00:58) ... Oct 17 2007, 20:29  zltigo Цитата(singlskv @ Oct 17 2007, 23:29) то ... Oct 17 2007, 20:47   singlskv Цитата(zltigo @ Oct 18 2007, 00:47) Т.е. ... Oct 17 2007, 20:57    zltigo Цитата(singlskv @ Oct 17 2007, 23:57) Опя... Oct 17 2007, 21:12     singlskv Цитата(zltigo @ Oct 18 2007, 01:12) Конте... Oct 17 2007, 21:53      zltigo Цитата(singlskv @ Oct 18 2007, 00:53) Ско... Oct 17 2007, 22:04       singlskv Цитата(zltigo @ Oct 18 2007, 02:04) Легко... Oct 17 2007, 22:24        zltigo Цитата(singlskv @ Oct 18 2007, 01:24) а п... Oct 17 2007, 22:35         singlskv Цитата(zltigo @ Oct 18 2007, 02:35) В aes... Oct 17 2007, 22:55  SasaVitebsk Цитата(singlskv @ Oct 17 2007, 23:29) Ну ... Oct 18 2007, 19:35   Сергей Борщ Цитата(SasaVitebsk @ Oct 18 2007, 22:35) ... Oct 18 2007, 20:40   zltigo Цитата(SasaVitebsk @ Oct 18 2007, 22:35) ... Oct 18 2007, 22:05   singlskv To zltigo и SasaVitebsk,
признаю, погорячился насч... Oct 18 2007, 22:48    zltigo Цитата(singlskv @ Oct 19 2007, 01:48) Спр... Oct 19 2007, 07:31    Непомнящий Евгений Цитата(singlskv @ Oct 19 2007, 02:48) Ну ... Oct 19 2007, 07:37     zltigo Цитата(Непомнящий Евгений @ Oct 19 2007, 10... Oct 19 2007, 08:01 Непомнящий Евгений Если максимальная оптимизация по размеру, то первы... Oct 19 2007, 08:33 singlskv Цитата(Непомнящий Евгений @ Oct 19 2007, 11... Oct 19 2007, 15:08  SasaVitebsk Цитата(singlskv @ Oct 19 2007, 18:08) А о... Oct 20 2007, 20:07   singlskv Цитата(SasaVitebsk @ Oct 21 2007, 00:07) ... Oct 21 2007, 17:28    pvp Цитата(singlskv @ Oct 21 2007, 21:28) __z... Oct 22 2007, 15:24     Сергей Борщ Цитата(pvp @ Oct 22 2007, 18:24) Поясните... Oct 22 2007, 15:33      pvp Цитата(Сергей Борщ @ Oct 22 2007, 19:33) ... Oct 23 2007, 14:02 SasaVitebsk Внимательно просмотрю.
Правда я отказался на сегод... Oct 22 2007, 10:43 singlskv Цитата(SasaVitebsk @ Oct 22 2007, 14:43) ... Oct 22 2007, 16:43 SasaVitebsk Я когда первый раз увидел результаты компилировани... Oct 22 2007, 21:24 skripach Не стал создавать новую тему, поэтому здесь.
Можно... Nov 9 2009, 14:11 skripach Что никто не знает? ...или я что-то не то спросил. Nov 12 2009, 07:30 zltigo Цитата(skripach @ Nov 12 2009, 10:30) Что... Nov 12 2009, 09:39 KSN Есть вопрос по прерываниям в bootloader и applicat... Feb 27 2010, 09:55 Сергей Борщ Цитата(KSN @ Feb 27 2010, 11:55) Может у ... Feb 27 2010, 11:39
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|