Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Генерация HEX в Keil
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > Keil
Booger
Добрый день!
Возникла необходимость кусок кода, а точнее функцию, выделить в отдельную, не занятую область. С этим разобрался. Функция в отдельном файле test_file.c

Код
__attribute__((section(".ARM.__at_0x08012B00"))) float test(float t1, float t2, float t3)  
{
    return (t1 * t2 + t3);    
}

всё хорошо, область не занятая
вот выписки из map файла
сама функция (кстати, не пойму почему адрес 0x08012b01, а не 0x08012b00?)
Код
test(float, float, float)            0x08012b01   Thumb Code    30  metrologicalcalculation.o(.ARM.__at_0x08012B00)

секция
Код
.ARM.__at_0x08012B00                     0x08012b00   Section        0  test_file.o(.ARM.__at_0x08012B00)

генерируется hex, всё замечательно
Код
:102AE00000000000000000000000000000000000E6
:102AF00000000000000000000000000000000000D6
:102B00002DE9F04105460E46144631462846FDF7AC
:102B10007DF907462146FDF7A3F8BDE8F0810000E6
:102B200000000000000000000000000000000000A5
:102B30000000000000000000000000000000000095

но при изменении кода, никак не касающегося этой функции! имею, что в этом куске hex происходят изменения во второй строке
Код
:102AE00000000000000000000000000000000000E6
:102AF00000000000000000000000000000000000D6
:102B00002DE9F04105460E46144631462846FDF7AC
:102B100039F907462146FDF75FF8BDE8F08100006E
:102B200000000000000000000000000000000000A5
:102B30000000000000000000000000000000000095

не могу понять почему?
Задача, выделить эту функцию, посчитать ее CRC, и чтобы это CRC не менялось при изменении остальной части программы.
Kabdim
Надо посмотреть дизасемблером разницу и станет понятно. Палльцем в небо: там вызываются функции для плавающей арифметике и при этомих адреса меняются при изменении кода.
>> сама функция (кстати, не пойму почему адрес 0x08012b01, а не 0x08012b00?)
Особенности вызова Thumb Code.
scifi
Цитата(Booger @ Feb 19 2016, 16:08) *
Задача, выделить эту функцию, посчитать ее CRC, и чтобы это CRC не менялось при изменении остальной части программы.

Метрология что ли какая-то? Кстати, CRC от врагов не защищает. От врагов нужна криптостойкая хеш-функция.
SyncLair
Вам нужно сформировать ABI - binary interface -- и скопмпилировать его отдельно и по фиксированному адресу разместить не функцию, а таблицу указателей на функции. Таки образом вам нужно отдельно скомпилировать эти функции в отдельном проэкте, а в другом проэкте пользоваться этими функциями через структуры и таблицу указателей -- посмотрите как это сделано у NXP когда они встраивают код в спец память контроллера. (LPC11u68 например) уверен так сделано и у некоторых других производилей МК.

А вот как объяснить это компилятору (что функции main() не существует) -- в случае с Keil не представляю.
Booger
Цитата
Kabdim

В дизасемблере все одинаково

Цитата
scifi

да, метрология

Цитата
SyncLair

Попробовал создал отдельный проект-либу. Подключил либу к своему проекту и та же фигня.

На ум приходит только лепить из разных hex-ов разных проектов один hex, но это чудовище Франкинштейна не очень мне нравится.

Есть мнение, что, если организовать не функцию, а класс, то всё может получится. Попробую, отпишусь.


Попробовал.
Создал класс с одним единственным методом, объявил объект класса, разместил этот объект по нужному адресу.
Прикол в том, что объект занимает 1 байт и смысл считать его CRC нет.
редактор
Если большой объем программы, то возможно смотрите не тот сегмент.
Преобразуйте Hex бинарник и бинарники (образы прошивок) уже сравнивайте.
scifi
Цитата(Booger @ Feb 20 2016, 08:08) *
Попробовал создал отдельный проект-либу. Подключил либу к своему проекту и та же фигня.

Всё правильно SyncLair написал. То, что вы игнорируете его совет, - это ваши проблемы.

Кстати, а вот эта штука с проверкой целостности функции - это нужно по-честному сделать или абы так, чтобы отстали? Потому что по-честному там будет ещё десяток нюансов, о которых вы пока не догадываетесь.
demiurg_spb
Цитата(scifi @ Feb 20 2016, 10:40) *
Потому что по-честному там будет ещё десяток нюансов, о которых вы пока не догадываетесь.
И каких же? Вроде ничего особенного...
scifi
Цитата(demiurg_spb @ Feb 20 2016, 11:15) *
И каких же? Вроде ничего особенного...

Ну, я немного преувеличил, но немного. Скажем, для защиты от врагов CRC не годится, как я уже писал выше. Также для защиты от врагов нужно залочивать МК. В общем, как-то так.
Kabdim
Цитата(Booger @ Feb 20 2016, 08:08) *
В дизасемблере все одинаково

Приведите листинг 1 и 2 варианта, только так что бы было видно хексы-асемблерная команда. Как могут быть дизасемблерованые команды быть полностью одинаковыми при разном бинарном наполнении. Это же не х86 в котором можно десяток байт только префиксов вставить.
esaulenka
Цитата(scifi @ Feb 20 2016, 10:40) *
Всё правильно SyncLair написал. То, что вы игнорируете его совет, - это ваши проблемы.
Кстати, а вот эта штука с проверкой целостности функции - это нужно по-честному сделать или абы так, чтобы отстали? Потому что по-честному там будет ещё десяток нюансов, о которых вы пока не догадываетесь.


А эта задача в принципе честно решается?
Ну получим мы функцию, которая точно не изменяется после прохождения сертификации. Но никто ж не обещает, что данные ей на вход будут поступать без обработки. Или что вообще будет использоваться эта функция, а не соседняя, "слегка доработанная".

Цитата(Kabdim @ Feb 20 2016, 12:27) *
Приведите листинг 1 и 2 варианта, только так что бы было видно хексы-асемблерная команда. Как могут быть дизасемблерованые команды быть полностью одинаковыми при разном бинарном наполнении. Это же не х86 в котором можно десяток байт только префиксов вставить.


Так это от уровня дизассемблера зависит. Если он развернёт команду "branch по адресу 0xabcd" в "branch в функцию def()", в дизассемблере, действительно "ничего не поменяется" :-)
ViKo
По-моему, во втором сообщении уже дан ответ.
У процессора есть плавающая арифметика? Если нет, то вызываются функции. Которые размещаются, где понравится компилятору.
scifi
Цитата(esaulenka @ Feb 20 2016, 12:35) *
А эта задача в принципе честно решается?

Смотря как задача ставится. Если нужна реально защищённая система с указанием возможностей врага, то всё можно спроектировать. А если задача - это "ну изобразите тут что-то такое, похожее на некую меру некой защиты", то и будет так, как вы написали:
Цитата(esaulenka @ Feb 20 2016, 12:35) *
Ну получим мы функцию, которая точно не изменяется после прохождения сертификации. Но никто ж не обещает, что данные ей на вход будут поступать без обработки. Или что вообще будет использоваться эта функция, а не соседняя, "слегка доработанная".
x893
CRC32 вполне подходит для защиты.
Код по дисассемблеру посмотрите - там всё понятно будет.
Тем более в Keil это не проблема.
Booger
Добрый день!

Пока оставил эту проблему до лучших времен. Попробую реализовать совет SyncLair позже.
Нужно считать только CRC, никаких больше защит не нужно.
Еще раз говорю, в дизассемблере функция выглядит одинаково. Или не функцию нужно смотреть?
scifi
Цитата(Booger @ Feb 25 2016, 16:08) *
Еще раз говорю, в дизассемблере функция выглядит одинаково. Или не функцию нужно смотреть?

Ещё раз говорю, читайте то, что вам пишут. А то неприлично как-то получается.

Цитата(Kabdim @ Feb 20 2016, 12:27) *
Приведите листинг 1 и 2 варианта, только так что бы было видно хексы-асемблерная команда. Как могут быть дизасемблерованые команды быть полностью одинаковыми при разном бинарном наполнении. Это же не х86 в котором можно десяток байт только префиксов вставить.

Цитата(esaulenka @ Feb 20 2016, 12:35) *
Так это от уровня дизассемблера зависит. Если он развернёт команду "branch по адресу 0xabcd" в "branch в функцию def()", в дизассемблере, действительно "ничего не поменяется" :-)
Kabdim
Цитата(esaulenka @ Feb 20 2016, 12:35) *
Так это от уровня дизассемблера зависит. Если он развернёт команду "branch по адресу 0xabcd" в "branch в функцию def()", в дизассемблере, действительно "ничего не поменяется" :-)

Видимо мораль из этого - слишком хороший инструментарий мешает учиться. sm.gif
scifi
Цитата(Kabdim @ Feb 25 2016, 17:24) *
Видимо мораль из этого - слишком хороший инструментарий мешает учиться. sm.gif

Нет, не так. Мораль такова: чукче нужно поменьше писать и побольше читать. laughing.gif
scifi
Цитата(Booger @ Feb 29 2016, 07:23) *
Вот скриншоты обоих вариантов.

Ну и?
Там же всё очевидно и уже объяснено выше. В чём трудности?
Kabdim
Да и дизасм у вас не совпадает. Он вам в скобочках после асемблерной команды пишет адрес вызываемой функции, но вы эту информацию игнорируете.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.