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

 
 
 
Reply to this topicStart new topic
> Размещение библиотеки
Brain13
сообщение Feb 11 2014, 06:45
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Здравствуйте.
Имеется проект на stm8 на iar'е. Устройство имеет шифрованный протокол связи с верхним уровнем. Устройство должно иметь возможность обновлять прошивку через бутлоадер. Дело в том, что шифрование занимают много места и используют операции с 32 битными числами. Компилятор, понятное дело подтянул все необходимые функции для работы с такими числами. Я собираюсь сделать библиотеку с функциями шифрования и разместить ее в области бутлоадера. Но у меня появился ряд вопросов:
1) Как мне разместить библиотеку в области бутлоадера?
2) Как сделать так, чтобы и основная программа и бутлдоадер могли обращаться к функциям одной и той же библиотеки ?
3) Я правильно понимаю, что функции для работы с 32 битными числами уже будут в библиотеке?
4) Если я буду использовать операции с 32 битными числами в основной программе, то будут использоваться функции из библиотеки или подтянутся новые экземпляры тех же функций?
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 11 2014, 08:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Brain13 @ Feb 11 2014, 10:45) *
1) Как мне разместить библиотеку в области бутлоадера?

Я сделал через структуру с указателями на функции, размещённую по фиксированному адресу. Привожу реальный код.
Загрузчик:
CODE
struct export_table
{
void (*adc_init)(void);
void (*adc_poll)(void);
uint16_t (*adc_read)(uint8_t ch);
void (*flash_init)(void);
void (*flash_eraseblock)(void* addr);
void (*flash_writeblock)(void* src, void* dst);
void* (*frame_init)(void);
uint8_t (*frame_rxpoll)(void);
void (*frame_append)(void *src, uint8_t len);
void (*frame_end)(void);
void (*mymalloc_init)(void* pool, unsigned int len);
void* (*mymalloc)(int len);
void (*power_init)(void);
void (*power_poll)(void);
void (*systime_init)(void);
unsigned int (*systime_ms)(void);
void (*start_boot_loader)(void);
};

#pragma location = "ftab"
__root const struct export_table ftab =
{
adc_init,
adc_poll,
adc_read,
flash_init,
flash_eraseblock,
flash_writeblock,
frame_init,
frame_rxpoll,
frame_append,
frame_end,
mymalloc_init,
mymalloc,
power_init,
power_poll,
systime_init,
systime_ms,
start_boot_loader
};

В скрипте линкера:
Код
...
place at start of NearFuncCode  { block INTVEC };
place in NearFuncCode           { ro section ftab };
place in NearFuncCode           { ro section .far.data_init,
...

Приложение содержит объявление той же структуры. Переменная объявляется следующим образом:
Код
#pragma location = 0x8080
__no_init const struct export_table ftab;

Функции вызываются так:
Код
ftab.start_boot_loader();

Цитата(Brain13 @ Feb 11 2014, 10:45) *
2) Как сделать так, чтобы и основная программа и бутлдоадер могли обращаться к функциям одной и той же библиотеки ?
3) Я правильно понимаю, что функции для работы с 32 битными числами уже будут в библиотеке?
4) Если я буду использовать операции с 32 битными числами в основной программе, то будут использоваться функции из библиотеки или подтянутся новые экземпляры тех же функций?

Естественно, при таком подходе вспомогательные функции (для работы с 32-битными числами, например) будут продублированы в загрузчике и в приложении. В этом есть плюсы: при обновлении версии компилятора эти функции могут поменяться, и если они не продублированы, то приложение, собранное новым компилятором, будет несовместимо с загрузчиком, собранным старым компилятором. Сейчас же требование для совместимости только одно: чтобы компилятор не поменял ABI (соглашение о вызовах функций). Такие изменения происходят крайне редко.
Попробуйте изучить map-файл на предмет того, какой выигрыш может дать устранение дублирования вспомогательных функций. Может быть, овчинка не стоит выделки, так как я не вижу простых способов устранить это дублирование.
Go to the top of the page
 
+Quote Post
Brain13
сообщение Feb 11 2014, 10:42
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-08-09
Пользователь №: 52 078



Цитата(scifi @ Feb 11 2014, 12:24) *
Я сделал через структуру с указателями на функции, размещённую по фиксированному адресу.

Да, спасибо, видел такое решение.
Цитата
Естественно, при таком подходе вспомогательные функции (для работы с 32-битными числами, например) будут продублированы в загрузчике и в приложении. В этом есть плюсы: при обновлении версии компилятора эти функции могут поменяться, и если они не продублированы, то приложение, собранное новым компилятором, будет несовместимо с загрузчиком, собранным старым компилятором. Сейчас же требование для совместимости только одно: чтобы компилятор не поменял ABI (соглашение о вызовах функций). Такие изменения происходят крайне редко.

Версию компилятора менять не собираюсь. Если надо, буду пользоваться одной версией хоть всю жизнь устройства.
Цитата
Попробуйте изучить map-файл на предмет того, какой выигрыш может дать устранение дублирования вспомогательных функций. Может быть, овчинка не стоит выделки, так как я не вижу простых способов устранить это дублирование.

Выигрыш около 700-800байт, при размере флеша 8к. У меня и так все под завязку, так что стоит.

Кстати, а есть в природе простой и надежный алгоритм шифрования для 8 битников? что-то подобное xtea, но без 32 битных чисел?
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 11 2014, 11:13
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Brain13 @ Feb 11 2014, 14:42) *
Кстати, а есть в природе простой и надежный алгоритм шифрования для 8 битников? что-то подобное xtea, но без 32 битных чисел?

Мне кажется, трудно придумать шифр проще, чем XTEA. Если именно он вызывает головную боль со вспомогательными функциями, я бы переписал его на ассемблере. Кстати, не удивлюсь, если получится существенно лучше, чем у компилятора: мне показалось, что яр для стм8 хромает в части оптимальности кода.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Feb 12 2014, 04:29
Сообщение #5


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Brain13 @ Feb 11 2014, 10:45) *
....
1) Как мне разместить библиотеку в области бутлоадера?
2) Как сделать так, чтобы и основная программа и бутлдоадер могли обращаться к функциям одной и той же библиотеки ?
..


директивами для компилятора можете разместить где угодна определённый кусок кода.
То, что по фиксированным адресам функции - это замечательно, но...куда же без этого вездесущего но sm.gif
в своё время делал немного по другому (чем функции по фиксированным адресам).
кмк лучше делать таблицу векторов для таких функций. Вот она фиксирована (расположение, очерёдность, наполнение).
а сами функции - пофигу. тем самым вы достигаете универсальности на будущее. когда возможно модифицируете бут
загрузчик - не надо будет лезть в другой код и менять оффсеты для вызовов, перекомпилировать
исходники, выкладывать на сайт поддержки(если есть) и разруливать распознавание железа-версия...

но тут есть опять но sm.gif
1) что будет если сами функции(которые Вы захотели расположить в буте) содержат ошибки?
2) бут не безразмерен. надо помнить, что у некоторых МК есть ограничения на бут. т.е. у АВР(к примеру) записывать во флэш нильзя не из бута. т.е.
напихав туда код - мы можем функцию записи во флэш расположить уже не в пределах этих адресов...


Go to the top of the page
 
+Quote Post

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

 


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


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