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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как в "незанятой" области 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
RadiatoR
сообщение Oct 19 2015, 13:08
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



Если взглянуть на стартап.s то можно увидеть записи типа:
Stack_Size EQU 0x00000400

AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size

Здесь в качестве STACK идет указатель на область стэка и далее выделяется его размер, равный 0x400
После этого командой DCD можно записать значения в ячейки памяти, так же как это делается с векторной таблицей:

__Vectors
.
.
.
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved

Поправьте если есть более простые варики

Сообщение отредактировал ЯadiatoR - Oct 19 2015, 13:09
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 19 2015, 13:13
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ЯadiatoR @ Oct 19 2015, 16:08) *
Поправьте если есть более простые варики

квалификатор __at


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 19 2015, 13:24
Сообщение #4


Гуру
******

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



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

Очень может быть, что проще и практичнее будет, если прошивка сама при первом запуске зашьёт туда то, что нужно.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Oct 19 2015, 13:24
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



загуглил, проверил:
int var __at(0x80001000) = 20;
не компилит.
ps так заработало:
int variable1 __attribute__((at(0x8000))) = 10;

Сообщение отредактировал ЯadiatoR - Oct 19 2015, 13:27
Go to the top of the page
 
+Quote Post
RiseOfDeath
сообщение Oct 19 2015, 13:25
Сообщение #6


Участник
*

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



Цитата(ЯadiatoR @ Oct 19 2015, 16:08) *
Если взглянуть на стартап.s то можно увидеть записи типа:
Stack_Size EQU 0x00000400

AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size

Здесь в качестве STACK идет указатель на область стэка и далее выделяется его размер, равный 0x400
После этого командой DCD можно записать значения в ячейки памяти, так же как это делается с векторной таблицей:

__Vectors
.
.
.
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved

Поправьте если есть более простые варики



Т.е. типа такого вот:
Код
Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

EQU 0x0x080E0000
DCD 0xDE
DCD 0xAD
DCD 0xBE
DCD 0xEF



Цитата(zltigo @ Oct 19 2015, 16:13) *
квалификатор __at



А как им пользоваться?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 19 2015, 13:32
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ЯadiatoR @ Oct 19 2015, 16:24) *
загуглил, проверил:
int var __at(0x80001000) = 20;
не компилит.
ps так заработало:
int variable1 __attribute__((at(0x8000))) = 10;

квалификатор const для flash забыли


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
RiseOfDeath
сообщение Oct 19 2015, 13:37
Сообщение #8


Участник
*

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



Цитата(scifi @ Oct 19 2015, 16:24) *
Очень может быть, что проще и практичнее будет, если прошивка сама при первом запуске зашьёт туда то, что нужно.



Быть может вы и правы. Сложно сказать.
Go to the top of the page
 
+Quote Post
smalcom
сообщение Oct 19 2015, 13:38
Сообщение #9


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

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



в скрипт линковщика добавляете свою секцию

Цитата
__exidx_end = .;

.flash_var : ALIGN (1024) /* очень важно не прогадать с выравниванием, а то будете затирать программу */
{
*(.flash_var*)
. = ALIGN (1024);
*(.flash_var_end*)
} > ROM

__etext = .;


затем задаёте в какой секции располагается нужкая переменная(структура)
Код
    static uint8_t __attribute__ ((section(".flash_var"))) mConfigDataFlashArray[sizeof(SConfigData_Internal)];



я обычно по-умолчанию не зашиваю, т.к. программа сам должна знать, что там у неё надо сделать. а при запуске проверяю контрольную сумму: не совпала - сохраняем настройки по-умолчанию.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Oct 19 2015, 13:47
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



Цитата(zltigo @ Oct 19 2015, 16:32) *
квалификатор const для flash забыли

а где его писать? да и нужно ли? у меня скомпилилось, парвда я не проверял на деле
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 19 2015, 13:55
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ЯadiatoR @ Oct 19 2015, 16:47) *
а где его писать?

Дивный вопрос. Как Вам, удалось ни разу не воспользоваться ни одним из квалификаторов?
Квалификаторы указываются рядом с типом переменной.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Oct 19 2015, 13:56
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



Цитата(zltigo @ Oct 19 2015, 16:55) *
Дивный вопрос. Как Вам, удалось ни разу не воспользоваться ни одним из квалификаторов?
Квалификаторы указываются рядом с типом переменной.

ой =) вы про это. Я даже не сразу понял о чем идет речь, а const как-то вообще пропустил сквозь текст.
Go to the top of the page
 
+Quote Post
RiseOfDeath
сообщение Oct 21 2015, 08:42
Сообщение #13


Участник
*

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



Благодарю всех за помощь. Я решил, что лучше буду при запуске проверять в той памяти некий magik number и орентируясь на его отсутствие писать туда дефолтные настройких. Мне кажется это и проще и будет более очевидно для другогоразработчика, если ему придется иметь с моей прогой дело.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 21 2015, 09:12
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Хорошим тоном является проверять
1. пустоту сектора - обычно есть прям такая команда ну или просто смотреть что там FFFFF
2. контрольную сумму настроек, что если вы их изменяли, а вам дернули питание и настройки на половину не верны

3. В особых случаях добавляют признак актуальности, то есть делают 2-3 копии настроек,в начале и конце стоит номер, если он в начале и конце совпадает - значит блок настроек полный, а по номеру определяют последние актуальные. Это позволяет если у вас во время изменения настройки померли, иметь рабочий прошлый вариант. Ну или загрузить прошлые настройки если надо
Go to the top of the page
 
+Quote Post
stas00n
сообщение Oct 21 2015, 10:23
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 181
Регистрация: 26-11-10
Пользователь №: 61 198



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

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


Лично я в подобной ситуации поступил весьма тупо в лоб. Потребуется STSW-LINK004STM32 ST-LINK utility
1. Заливаем .hex с кодом (без пользовательских настроек).
2. Настраиваем прибор, сохраняем настройки.
3. Читаем флеш полностью (вместе с настройками).
4. Сохраняем новый .hex
Go to the top of the page
 
+Quote Post

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

 


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


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