Перейти к содержанию

Запретить Keil генерить кусок кода в определенной памяти .hex

Пишу под nrf52. Сделал бутлоадер. Но есть задача- при перезагрузке софта сохранять данные. По описанию, данные надо располагать с определенного адреса.
Вот пример структуры, которая именно там и расположена.
Код
volatile PASSKEY_CONTEXT pass __attribute__((section(".ARM.__at_0x72500"))) =
{
    .passkey_length             = 6,     .passkey                 = "123456",
};


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

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

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


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

Как решить задачу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Метценгерштейн @ May 11 2018, 10:39) <{POST_SNAPBACK}>
Как решить задачу?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Метценгерштейн @ May 11 2018, 11:08) <{POST_SNAPBACK}>
Вот кусок файла.

Выложите полностью. И .scat тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Я вообще корректно структуру располагаю по адресу? Может есть еще какой способ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Метценгерштейн @ May 11 2018, 14:25) <{POST_SNAPBACK}>
Я вообще корректно структуру располагаю по адресу? Может есть еще какой способ?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
У меня есть данные, которые не должны быть затерты при обновлении бутлоадером. Только очевидное расположение их по данному адресу позволяет это сделать.

Можете продолжить код- как теперь значение там записать? Чтобы сразу в глобальной инициализации?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Метценгерштейн @ May 11 2018, 14:44) <{POST_SNAPBACK}>
Можете продолжить код- как теперь значение там записать? Чтобы сразу в глобальной инициализации?

Код
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";

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(Метценгерштейн @ May 11 2018, 15:20) <{POST_SNAPBACK}>
Код
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) <{POST_SNAPBACK}>
Разместите структуру в неинициализированной секции.

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

разместил. Ну толку-то. Код уменьшился. Теперь она где-то в недрах проекта. Тоже самое, если бы я указал адрес середины кода, или буквально начала проекта.
Мне надо именно чтобы она лежала в определенном месте, и в самом конце прошивки. Там бутлоадер ее не перетирает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
А секцию по определённому адресу разместить не судьба?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
можете пример привести?
Я вроде так и делал у себя. Секцию размещаю по нужному адресу.
Код
volatile PASSKEY_CONTEXT pass __attribute__((section(".ARM.__at_0x72500"))) =

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вы по ссылке то ходили что я привёл?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация