реклама на сайте
подробности

 
 
> Ещё раз о бутлоадере, Некоторые тонкости.
SasaVitebsk
сообщение Oct 4 2007, 09:17
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Задумка такая.

По старту попадаем в бут. Там считаем CRC и если Ok - выходим на саму приложение. Если не Ok то переходим на сам лодырь.

В приложении по команде переходим непосредственно на лоадырь.


То есть мне надо две точки входа. По сбросу и по команде. Хотелось бы использовать незадействованные вектора бутлоадера. Например +2. Как это сделать. Если использовать pragma location, то наверняка будет linker ругаться.

Конечно можно упростить задачу и использовать какой нибудь признак в EEPROM. Или портить CRC к примеру, но что-то мне не нравится такой подход.

А кто как делает?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Oct 9 2007, 23:55
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Сергей, всётаки по коду не уложился в 2к. Со своим WakeUp-ом. Там ещё некоторые приколы есть. У меня должно осуществляться обновление прямо в сети. Соответственно при обновлении требуется сверять серийный номер устройства. Его я не хочу записывать в лоадер, дабы лоадер унифицированный был. Поэтому при перепрошивке вытаскиваю номер перепрошиваю и сохраняю номер. smile.gif

Короче впрямую в 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)???


Сори. smile.gif Разобрался.

Просто как-то в голове не укладывается как в ассемблере имена структур фигурируют. Понятно что потом линкер их к адресам приводит, но всё равно несколько диковато. smile.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 10 2007, 10:58
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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) *
Соответственно при обновлении требуется сверять серийный номер устройства. Его я не хочу записывать в лоадер, дабы лоадер унифицированный был. Поэтому при перепрошивке вытаскиваю номер перепрошиваю и сохраняю номер. smile.gif
У меня в области загрузчика есть функция
Код
#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) *
Сори. smile.gif Разобрался.
Просто как-то в голове не укладывается как в ассемблере имена структур фигурируют. Понятно что потом линкер их к адресам приводит, но всё равно несколько диковато. smile.gif
Ну, если не на плюсах писать, то имена как и у обычных переменных. А вот к полям из ассемблера, увы, только вручную указывая смещение от начала структуры.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Oct 10 2007, 13:35
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Сергей Борщ @ Oct 10 2007, 13:58) *
Ты пытаешься засунуть в загрузчик еще какие-то команды кроме UpdateFirmware? У меня Wake-подобный протокол, я сделал так:


Пытаюсь Сергей. sad.gif

Вчера в 3 часа ночи получил результат 2232. sad.gif Если бы надо было байт 50 выжать ещё бы попытался, а так буду пробовать в обход. Я видишь ли с прерываниями завязался. Возможно придётся отказаться. Только вектора занимают 112 байт. Можно конечно их под себя подмять.

Короче буду думу думать. Жалко выделять 4к если нехватает совсем чуть чуть.


Спасибо за рекомендации. Разбираюсь. Пользуюсь. Помагает.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 16 2007, 18:01
Сообщение #5


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(SasaVitebsk @ Oct 10 2007, 17:35) *
Вчера в 3 часа ночи получил результат 2232. sad.gif Если бы надо было байт 50 выжать ещё бы попытался, а так буду пробовать в обход. Я видишь ли с прерываниями завязался. Возможно придётся отказаться. Только вектора занимают 112 байт. Можно конечно их под себя подмять.
Короче буду думу думать. Жалко выделять 4к если нехватает совсем чуть чуть.
SasaVitebsk, а Вы принципиально не будете пробовать Gcc ?
Стало интересно, посмотрел на исходники, ну этот код, особенно aes.c просто предназначен для
компилирования gcc smile.gif
на Iar там принципиально хуже...

P.S. Еще очень порадовало обращение к EEPROM переменным через функции писанные на асм...
Интересно, почему на Iar не воспользовались __eeprom ???
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01467 секунд с 7
ELECTRONIX ©2004-2016