Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запретить Keil генерить кусок кода в определенной памяти .hex
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Метценгерштейн
Пишу под nrf52. Сделал бутлоадер. Но есть задача- при перезагрузке софта сохранять данные. По описанию, данные надо располагать с определенного адреса.
Вот пример структуры, которая именно там и расположена.
Код
volatile PASSKEY_CONTEXT pass __attribute__((section(".ARM.__at_0x72500"))) =
{
    .passkey_length             = 6,     .passkey                 = "123456",
};


Теперь бутлоадер при обновлении эту область памяти не перетирает. Данные сохраняются.

Но замечена одна особенность, при генерации прошивки, добавляется после этой структуры еще кусок кода в 40 кБ. Если прошивка сильно отличается, то этот код тоже изменяется. И получается, что обновляется прошивка, а в конце памяти этот кусок не обновляется. Результат- проект падает и перезагружается.

Приведу сгенерированный .hex
Код
:102500000631323334353600000000000000000090
:1025100000000000011022011A4002B11BFFFF144D
:10252000016194618A028B893D0C012E0C101818F0
:1025300018122901014E1220027540C490D00314D4
:08254000E136022303FF000055
:040000050001F20103
:00000001FF


как видите, четко видна расположенная структура, но еще какой-то код. В дисассемблере кейла- это какие-то инструкции. Что-то пишет, копирует, сравнивает. В исходниках это так и не нашел.

Как решить задачу?
aaarrr
Цитата(Метценгерштейн @ May 11 2018, 10:39) *
Как решить задачу?

1. Посмотреть map-файл, узнать, к чему относится код в этом "хвосте" (скорее всего, что-то из библиотек)
2. Вручную разместить все как надо
Метценгерштейн
в мар файле особо ничего подобного нет. Может не туда смотрю.
Вот кусок файла. Там ничего нет.
Код
    0x0002ccf8   0x00000010   Data   RO         6570    .constdata          ble_nus.o
    0x0002cd08   0x00000081   Data   RO         6731    .constdata          mc_w.l(ctype_o.o)
    0x0002cd89   0x00000003   PAD
    0x0002cd8c   0x00000004   Data   RO         6732    .constdata          mc_w.l(ctype_o.o)
    0x0002cd90   0x00000186   Data   RO         2313    .conststring        nrf_ble_gatt.o
    0x0002cf16   0x00000002   PAD
    0x0002cf18   0x00000043   Data   RO         5796    .conststring        app_uart_fifo.o
    0x0002cf5b   0x00000001   PAD
    0x0002cf5c   0x0000005e   Data   RO         6343    .conststring        softdevice_handler.o
    0x0002cfba   0x00000002   PAD
    0x0002cfbc   0x00000047   Data   RO         6474    .conststring        ble_dis.o
    0x0002d003   0x00000001   PAD
    0x0002d004   0x00000040   Data   RO         7092    Region$$Table       anon$$obj.o
    0x0002d044   0x000453bc   PAD
    0x00072400   0x0000005b   Data   RW           19    .ARM.__at_0x72400   main.o
    0x0007245b   0x000000a5   PAD
    0x00072500   0x00000011   Data   RW           20    .ARM.__at_0x72500   main.o
aaarrr
Цитата(Метценгерштейн @ May 11 2018, 11:08) *
Вот кусок файла.

Выложите полностью. И .scat тоже.
Метценгерштейн
в личке.
Метценгерштейн
Я вообще корректно структуру располагаю по адресу? Может есть еще какой способ?
scifi
Цитата(Метценгерштейн @ May 11 2018, 14:25) *
Я вообще корректно структуру располагаю по адресу? Может есть еще какой способ?

Есть очевидный способ: ничто нигде не располагать, а обращаться к нужной области памяти через указатель.
Код
PASSKEY_CONTEXT volatile* const pass = (PASSKEY_CONTEXT volatile*)0x72500;
Метценгерштейн
У меня есть данные, которые не должны быть затерты при обновлении бутлоадером. Только очевидное расположение их по данному адресу позволяет это сделать.

Можете продолжить код- как теперь значение там записать? Чтобы сразу в глобальной инициализации?
scifi
Цитата(Метценгерштейн @ May 11 2018, 14:44) *
Можете продолжить код- как теперь значение там записать? Чтобы сразу в глобальной инициализации?

Код
void global_init(void)
{
  if (*pass != init_pass)
  {
    program_flash(init_pass);
  }
}

Или что-то в этом духе. Во всяком случае, у себя всегда там делаю.
Метценгерштейн
Код
typedef struct
{
    uint8_t         passkey_length;
    const char     passkey[MAX_STRING_SIZE];
} PASSKEY_CONTEXT;


Код
pass->passkey_length = 6;
    pass->passkey = "334";


Пытаюсь по простому пока проинициализировать.
По последней строчке- что-то ругается. Что ему не нравится?
..\main.c(280): error: #137: expression must be a modifiable lvalue
pass->passkey = "334";
VladislavS
Разместите структуру в неинициализированной секции.

http://www.keil.com/support/docs/3480.htm
Метценгерштейн
Цитата(Метценгерштейн @ May 11 2018, 15:20) *
Код
typedef struct
{
    uint8_t         passkey_length;
    const char     passkey[MAX_STRING_SIZE];
} PASSKEY_CONTEXT;


Код
pass->passkey_length = 6;
    pass->passkey = "334";


Пытаюсь по простому пока проинициализировать.
По последней строчке- что-то ругается. Что ему не нравится?
..\main.c(280): error: #137: expression must be a modifiable lvalue
pass->passkey = "334";

Этот вопрос снимается- не заметил, что const стоит у меня.

Цитата(VladislavS @ May 11 2018, 15:24) *
Разместите структуру в неинициализированной секции.

http://www.keil.com/support/docs/3480.htm

разместил. Ну толку-то. Код уменьшился. Теперь она где-то в недрах проекта. Тоже самое, если бы я указал адрес середины кода, или буквально начала проекта.
Мне надо именно чтобы она лежала в определенном месте, и в самом конце прошивки. Там бутлоадер ее не перетирает.
VladislavS
А секцию по определённому адресу разместить не судьба?
Метценгерштейн
можете пример привести?
Я вроде так и делал у себя. Секцию размещаю по нужному адресу.
Код
volatile PASSKEY_CONTEXT pass __attribute__((section(".ARM.__at_0x72500"))) =
VladislavS
Вы по ссылке то ходили что я привёл?
VladislavS
Вы по ссылке то ходили что я привёл?
Метценгерштейн
ходил по ссылке. Сделал структуру неинициализированной по определенному адресу. Ничего не дало. Возможно, был скрытый смысл в той ссылке,но я не уловил его.

тут еще интересное- прошивка на STM с тем же расположением структуры(подальше от кода) дает другую прошивку.
Код
:0200000400807A
:105500000631323334353600000000000000000060
:045510000000000097
:020000040800F2
:1000000010040020010100080B0A0008030A000880
:10001000070A000849010008550B0008000000000D
:10002000000000000000000000000000710A00084D
:100030004D01000800000000450A0008730A00088E
:100040001B0100081B0100081B0100081B01000820
:100050001B0100081B0100081B0100081B01000810
:100060001B0100081B0100081B0100081B01000800
:100070001B0100081B0100081B0100081B010008F0
:100080001B0100081B0100081B0100081B010008E0
:100090001B0100081B0100081B0100081B010008D0
:1000A0001B0100081B0100081B0100081B010008C0
:1000B0001B0100081B0100081B0100081B010008B0
:1000C0001B0100081B0100081B0100081B010008A0
:1000D0001B0100081B0100081B0100081B01000890
:1000E0001B0100081B0100081B010008DFF80CD0F1
:1000F00000F018F8004800477B0B000810040020AF


Видим, что в начале он расположил структуру и потом уже код. Ничего сплошными нулями он не отделял.
Реально ли так же кейл настроить на нрф?
VladislavS
Скатер-файл мы, я так полагаю, не увидим сегодня?
Метценгерштейн
https://drive.google.com/open?id=1dnGRCJcw3...NJ0hgSluReQXc3x
вот скатр файл. Но в настройках кейла не стоит галочка, чтобы его каждый раз использовать. Он там не подсвечен. Полагаю, каждый раз генерируется новый.
VladislavS
Вы издеваетесь? Вы его должны сами написать и использовать в проекте! То что по ссылке лишь слегка подправить надо.

Блин, ну инструментом то, которым вы работаете, надо уметь пользоваться.
Метценгерштейн
Вот честно, скатером никогда не пользовался. Про него узнал вчера. Не нужен он мне был до того.
Подскажете, как его подправить?

Вообще, для настроек адреса старта программы и прочего есть стандартные настройки, где в поле device все эти адреса есть.
VladislavS
Цитата(Метценгерштейн @ May 11 2018, 16:24) *
Вот честно, скатером никогда не пользовался. Про него узнал вчера. Не нужен он мне был до того.
Учиться никогда не поздно!

Цитата(Метценгерштейн @ May 11 2018, 16:24) *
Подскажете, как его подправить?
Нет sm.gif Сегодня уже некогда, пора в пробку на дачу. Да и Keil-ом я не пользуюсь.
Зато могу волшебный пендель дать, где самому научиться можно. Это куда полезней копипасты чужой.
http://www.keil.com/support/man/docs/ARMLI...62075656353.htm

Цитата(Метценгерштейн @ May 11 2018, 16:24) *
Вообще, для настроек адреса старта программы и прочего есть стандартные настройки, где в поле device все эти адреса есть.
Можно подумать я вас заставляю и вообще мне это надо. Можете и дальше без скатера жить, я не против.
Метценгерштейн
Кстати, хорошо что подсказали про него.
Изменил размер на 51000, и код стал без нулей заполняющих. Ничего лишнего теперь нет. Лежат мои две структуру спокойно.
Так что возможно, победили.
Позже еще отпишусь.
Метценгерштейн
Да, все заработало как надо. Тут вот еще момент- этот .srt файл достаточно удалить и в настройках проекта выставить размер разрешенной прошивки. Он этот файл сам сгенерирует и не надо ничего руками править.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.