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

 
 
> Как в "незанятой" области FLASH-памяти контроллера сделать определенные значение
RiseOfDeath
сообщение Oct 19 2015, 13:00
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 2-10-13
Пользователь №: 78 579



Добрый день.

Имеется:
Некий контроллер STM32F4XX (применительно к задаче не важно какой именно)
IDE Keil uVision
Программатор J-Link (мне кажется он тут ни к чему, но всеже)
Некоторая программа.
Некоторый набор двоичных данных.

Сосбтвенно что я хочу:
Я использую встроенную нанду для хранения настроек и хочу чтобы при программировании контроллера в него сразу, вместе с программой, зашивались настройки по-умолчанию. (читать и писать программа умеет, но надо чтобы вместо стандартных 0xff в нужной области памяти "изначально" были какие-то определенные значения)
Я предполагаю что мне надо как-то получить на выходе из программы такой hex, чтобы после программирования им контроллера, помимо собственно программы, в жестко заданной области памяти, был тот самый "набор двоичных данных".

Есть мысли как это сделать?

Сообщение отредактировал RiseOfDeath - Oct 19 2015, 13:02
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KnightIgor
сообщение Oct 27 2015, 14:20
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(RiseOfDeath @ Oct 19 2015, 14:00) *
Сосбтвенно что я хочу:
Я использую встроенную нанду для хранения настроек и хочу чтобы при программировании контроллера в него сразу, вместе с программой, зашивались настройки по-умолчанию. (читать и писать программа умеет, но надо чтобы вместо стандартных 0xff в нужной области памяти "изначально" были какие-то определенные значения)
Я предполагаю что мне надо как-то получить на выходе из программы такой hex, чтобы после программирования им контроллера, помимо собственно программы, в жестко заданной области памяти, был тот самый "набор двоичных данных".

Мне кажется, Вашу задачу надо переформулировать так: в программе имеются константы настройки, которые необходимо менять в процессе работы. Эти константы есть часть кода, поэтому говорить о хранении настроек в области "свободной" памяти, как бы вне программы, неверно, т.к. настройки есть часть программного кода в рамках занимаемой памяти.

В принципе, все достаточно просто:
1. Настройка - это есть константа во флэше, объявленная в рамках исходного кода, например:
Код
const float MyCoeff = 5.5;

Очевидно, что 5.5 - это значение по-умолчанию, которое и будет " грузиться" во флэш вместе с программой во время записи/обновления кода. Вот Вам и зашивка настроек по-умолчанию. Также очевидно, что использование настройки в коде есть ни что иное как просто использование имени константы в выражениях.

2. Т.к. предполагается менять значение константы, ее нельзя смешивать с исполняемым кодом, а надо разместить где-то отдельно, чтобы безболезненно переписывать флэш и не завалить код. Это проистекает из принципа работы флэша с постраничными стираниями/записью. Для этого константу для начала надо поместить в известную секцию:
Код
const float MyCoeff __attribute__((section("MYSETTINGS"), used)) = 5.5;

Так нужно поступить со всеми подобными константами-настройками. Компоновщик соберет затем все такие константы в одну секцию.

3. Теперь надо поработать ручками и модифицировать файл скаттера (скрипта компоновщика). Например,
Код
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
;
;   Assume 64Flash
;
LR_IROM1 0x08000000 0x00010000  {  ; load region size_region
  ER_IROM1 0x08000000 0x00010000  {; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00002000  {; RW data
   .ANY (+RW +ZI)
  }
}
;
; In-flash rewritable params, size 1K, must be 1K aligned (page size of used CPU)
;
LR_IROM3 (0x08000000 + (0x00010000-0x400)) 0x400    ; load region size_region
{
   ER_IROM3 (0x08000000 + (0x00010000-0x400)) 0x400 ; load address = execution address
   {
      *(MYSETTINGS)
   }
}

Здесь дано указание компоновщику создать загружаемый регион LR_IROM3 размером в 1К (это размер страницы в STM32F051), а в нем - подрегион ER_IROM3, в котором и соберутся все настройки. Использована последняя страница флэша. Если посмотреть карту памяти готовой программы, можно разместить страницу настроек и непосредственно (но выровненно на страницу!) за "основным" кодом, указав нужные адреса, но лично мне последняя страница нравится больше.

4. Для модификации значений из кода программы надо, очевидно, прочитать всю страницу в буфер, модифицировать значение настройки в буфере по смещению и записать страницу назад по месту.
Смещение будет ((int)&MyCoeff)%0x400. Базовый адрес всей страницы можно вычислить из любой настройки в странице как ((int)&MyCoeff)/0x400*0x400. Это все, конечно, при условии, что все настройки помещаются в одну страницу. Для объемных настроек, пересекающих границы страниц (структуры), нужны соответствующие многостраничные алгоритмы записи во флэш. Или можно выровнять все настройки так, чтобы они никогда не пересекали страницу. Есть еще интересная возможность у компоновщика генерировать константы, доступные в программе. Например, базовый адрес региона можно получить как (void *)&Load$$LR$$LR_IROM3$$Base, а длину региона как (int)&Load$$LR$$LR_IROM3$$Length.

5. Если на образ ELF "натравить" утилиту fromelf.exe как
Код
fromelf.exe --i32 myproject.axf --output myproject.hex

то будет создан ПОДКАТАЛОГ myproject.hex, в котором появятся два файла с именами ER_IROM1 и ER_IROM3 и без расширений. На самом деле это *.HEX файлы. В файле ER_IROM3 собраны все настройки.

6. Внешняя программа, которая хочет модифицировать такой файл, должна, конечно, знать, по какому смещению какая переменная находится. Это нетривиальная задача, особенно по мере развития программы, версий, и т.п. Можно предложить путь дескрипторов или меток. Например, метки всегда четырехбуквенные:
Код
const char myLabel __attribute__((section("MYSETTINGS"), used)) = "MYCO";
const float MyCoeff __attribute__((section("MYSETTINGS"), used)) = 5.5;

Внешняя программа может найти строку MYCO и знать, что после нее идет MyCoeff.

Сообщение отредактировал KnightIgor - Oct 27 2015, 14:27
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- RiseOfDeath   Как в "незанятой" области FLASH-памяти контроллера сделать определенные значение   Oct 19 2015, 13:00
- - ЯadiatoR   Если взглянуть на стартап.s то можно увидеть запис...   Oct 19 2015, 13:08
|- - zltigo   QUOTE (ЯadiatoR @ Oct 19 2015, 16:08) Поп...   Oct 19 2015, 13:13
- - scifi   Цитата(RiseOfDeath @ Oct 19 2015, 16:00) ...   Oct 19 2015, 13:24
|- - RiseOfDeath   Цитата(scifi @ Oct 19 2015, 16:24) Очень ...   Oct 19 2015, 13:37
- - ЯadiatoR   загуглил, проверил: int var __at(0x80001000) = 20;...   Oct 19 2015, 13:24
|- - zltigo   QUOTE (ЯadiatoR @ Oct 19 2015, 16:24) заг...   Oct 19 2015, 13:32
|- - ЯadiatoR   Цитата(zltigo @ Oct 19 2015, 16:32) квали...   Oct 19 2015, 13:47
|- - zltigo   QUOTE (ЯadiatoR @ Oct 19 2015, 16:47) а г...   Oct 19 2015, 13:55
|- - ЯadiatoR   Цитата(zltigo @ Oct 19 2015, 16:55) Дивны...   Oct 19 2015, 13:56
- - RiseOfDeath   Цитата(ЯadiatoR @ Oct 19 2015, 16:08) Есл...   Oct 19 2015, 13:25
- - smalcom   в скрипт линковщика добавляете свою секцию Цитата...   Oct 19 2015, 13:38
- - RiseOfDeath   Благодарю всех за помощь. Я решил, что лучше буду...   Oct 21 2015, 08:42
- - Golikov A.   Хорошим тоном является проверять 1. пустоту секто...   Oct 21 2015, 09:12
- - stas00n   Цитата(RiseOfDeath @ Oct 19 2015, 15:00) ...   Oct 21 2015, 10:23
- - RiseOfDeath   Цитата(Golikov A. @ Oct 21 2015, 12:12) Х...   Oct 23 2015, 11:35
- - Sanya_kv   В Keil пользуюсь данным способом: const char имя_п...   Oct 27 2015, 05:34
|- - scifi   Цитата(KnightIgor @ Oct 27 2015, 17:20) 1...   Oct 27 2015, 14:33
|- - KnightIgor   Цитата(scifi @ Oct 27 2015, 15:33) Тогда ...   Oct 27 2015, 15:15
|- - zltigo   QUOTE (KnightIgor @ Oct 27 2015, 18:15) М...   Oct 27 2015, 17:48
- - Сергей Борщ   Да и перезагрузка не спасет. gcc очень хорошо умее...   Oct 27 2015, 18:21
- - KnightIgor   Цитата(Сергей Борщ @ Oct 27 2015, 19:21) ...   Oct 28 2015, 10:12


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 19:51
Рейтинг@Mail.ru


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