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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Запретить Keil генерить кусок кода в определенной памяти .hex, сумбурно, но подробнее внутри
Метценгерштейн
сообщение May 11 2018, 07:39
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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


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

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

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


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

Как решить задачу?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 11 2018, 08:00
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

1. Посмотреть map-файл, узнать, к чему относится код в этом "хвосте" (скорее всего, что-то из библиотек)
2. Вручную разместить все как надо
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 11 2018, 08:08
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



в мар файле особо ничего подобного нет. Может не туда смотрю.
Вот кусок файла. Там ничего нет.
Код
    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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 11 2018, 08:19
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Метценгерштейн @ May 11 2018, 11:08) *
Вот кусок файла.

Выложите полностью. И .scat тоже.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 11 2018, 08:45
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



в личке.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 11 2018, 11:25
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Я вообще корректно структуру располагаю по адресу? Может есть еще какой способ?
Go to the top of the page
 
+Quote Post
scifi
сообщение May 11 2018, 11:31
Сообщение #7


Гуру
******

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



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

Есть очевидный способ: ничто нигде не располагать, а обращаться к нужной области памяти через указатель.
Код
PASSKEY_CONTEXT volatile* const pass = (PASSKEY_CONTEXT volatile*)0x72500;
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 11 2018, 11:44
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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

Можете продолжить код- как теперь значение там записать? Чтобы сразу в глобальной инициализации?
Go to the top of the page
 
+Quote Post
scifi
сообщение May 11 2018, 12:01
Сообщение #9


Гуру
******

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



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

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

Или что-то в этом духе. Во всяком случае, у себя всегда там делаю.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 11 2018, 12:20
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Код
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";
Go to the top of the page
 
+Quote Post
VladislavS
сообщение May 11 2018, 12:24
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Разместите структуру в неинициализированной секции.

http://www.keil.com/support/docs/3480.htm
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 11 2018, 12:43
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Цитата(Метценгерштейн @ 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

разместил. Ну толку-то. Код уменьшился. Теперь она где-то в недрах проекта. Тоже самое, если бы я указал адрес середины кода, или буквально начала проекта.
Мне надо именно чтобы она лежала в определенном месте, и в самом конце прошивки. Там бутлоадер ее не перетирает.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение May 11 2018, 12:46
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



А секцию по определённому адресу разместить не судьба?
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 11 2018, 12:51
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



можете пример привести?
Я вроде так и делал у себя. Секцию размещаю по нужному адресу.
Код
volatile PASSKEY_CONTEXT pass __attribute__((section(".ARM.__at_0x72500"))) =
Go to the top of the page
 
+Quote Post
VladislavS
сообщение May 11 2018, 12:53
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Вы по ссылке то ходили что я привёл?
Go to the top of the page
 
+Quote Post

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

 


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


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