Метценгерштейн 0 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба Пишу под 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 69 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба Как решить задачу? 1. Посмотреть map-файл, узнать, к чему относится код в этом "хвосте" (скорее всего, что-то из библиотек) 2. Вручную разместить все как надо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба в мар файле особо ничего подобного нет. Может не туда смотрю. Вот кусок файла. Там ничего нет. 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 69 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба Вот кусок файла. Выложите полностью. И .scat тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба в личке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба Я вообще корректно структуру располагаю по адресу? Может есть еще какой способ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба Я вообще корректно структуру располагаю по адресу? Может есть еще какой способ? Есть очевидный способ: ничто нигде не располагать, а обращаться к нужной области памяти через указатель. PASSKEY_CONTEXT volatile* const pass = (PASSKEY_CONTEXT volatile*)0x72500; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба У меня есть данные, которые не должны быть затерты при обновлении бутлоадером. Только очевидное расположение их по данному адресу позволяет это сделать. Можете продолжить код- как теперь значение там записать? Чтобы сразу в глобальной инициализации? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба Можете продолжить код- как теперь значение там записать? Чтобы сразу в глобальной инициализации? void global_init(void) { if (*pass != init_pass) { program_flash(init_pass); } } Или что-то в этом духе. Во всяком случае, у себя всегда там делаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба 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 39 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба Разместите структуру в неинициализированной секции. http://www.keil.com/support/docs/3480.htm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба 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 стоит у меня. Разместите структуру в неинициализированной секции. http://www.keil.com/support/docs/3480.htm разместил. Ну толку-то. Код уменьшился. Теперь она где-то в недрах проекта. Тоже самое, если бы я указал адрес середины кода, или буквально начала проекта. Мне надо именно чтобы она лежала в определенном месте, и в самом конце прошивки. Там бутлоадер ее не перетирает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба А секцию по определённому адресу разместить не судьба? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба можете пример привести? Я вроде так и делал у себя. Секцию размещаю по нужному адресу. volatile PASSKEY_CONTEXT pass __attribute__((section(".ARM.__at_0x72500"))) = Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 11 мая, 2018 Опубликовано 11 мая, 2018 · Жалоба Вы по ссылке то ходили что я привёл? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться