Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.87/30: Рейтинг темы: голосов - 30, средняя оценка - 4.87
vosytyuz
0 / 0 / 0
Регистрация: 28.12.2015
Сообщений: 63
1

Переменная в ROM, Keil

05.10.2016, 14:56. Просмотров 5565. Ответов 34
Метки нет (Все метки)

Здравствуйте!

Может кто сталкивался:

есть такая конструкция

Код
#define P_LENGHT 40

typedef struct{
char Exist;
char Name1[P_LENGHT];
char Name2[P_LENGHT];
}
P_InfoTypeDef;

P_InfoTypeDef       PListInfo[100];
Этот массив заполняется один раз при старте, и дальше он только ReadOnly
Существует ли метод определения константы в рилтайме?
Так что б линкер сам создавал\выбирал область в ROM для этого, и что б было удобное обращение как к константе.

Не хочеться хранить в ROM пару килобайт статичный данных, но как константу нет возможности их определить.
Скорость доступа тоже не критична.

Спасибо
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2016, 14:56
Ответы с готовыми решениями:

Keil, STM32F103RB, симуляция, обнуляется переменная в main()
Проц STM32F103RB, HSE на 72MHz Keil 4.60 Использую CMSIS, stortup код...

Keil v5
Установил новый Keil. В старой 4-й версии проект симулировался нормально....

Keil
Доброго времени суток! Попытался повторить проект вот отсюда -...

Вопросы по Keil.
Всем привет. Вопрос по Кейлу. Надо узнать скока использовано FLASH (тут наверно...

KEIL inline
Проблема следующая. Пишу ф-ю в файле main.c : inline void Beep_OFF(void) {...

34
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
05.10.2016, 17:17 21
Здесь выкладывал исходники китайского клона плк.
Выделили секцию в флэше,читают с нее уставки, а пишут в флэш принимая через UART.
Вот такие переменные_константы...
0
dvy
0 / 0 / 0
Регистрация: 19.09.2017
Сообщений: 31
05.10.2016, 17:21 22
Цитата Сообщение от vosytyuz
да, при старте программы, единожды.
тогда без выделения адреса в конкретном секторе (желательно последний) не обойтись... перед записью необходимо делать очистку сектора.... и еще надо помнить что у флэша есть ресурс циклов стирания-записи...
0
vosytyuz
0 / 0 / 0
Регистрация: 28.12.2015
Сообщений: 63
05.10.2016, 17:24 23
Цитата Сообщение от x893
Так и не понял в чем проблема, но сделал так:

#define P_LENGHT 40

typedef struct{
const char Exist;
const char Name1[P_LENGHT];
const char Name2[P_LENGHT];
} P_InfoTypeDef;
const P_InfoTypeDef PListInfo[100] = {
{A, "LINE 1", "LINE 2"},
{B, "LINE 3", "LINE 4"},
};

и что же вижу в map файле ?

PListInfo 0x08000c70 Data 8100 main.o(.constdata)

Правда 5 минут пришлось потратить.
А мжет телепатия мне стала отказывать.
Ну Вы просто "заполнили" константу.
в моей "задаче" при компилиции не известны значения...
известна только их длинна...

А вы банально явно их указываете
{A, "LINE 1", "LINE 2"},
{B, "LINE 3", "LINE 4"},

Я понимаю, что хочу странного...
Но неужели так не понятно описываю -)) ?

Может так вопрос поставлю : можно ли объявить константу, и в рантайме поменять ее значение?
0
x893
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 886
05.10.2016, 17:33 24
Можно - если вы знаете её адрес и умеете переписать эту область памяти.
Флэш тоже можно перепрограммировать из программы.
100500 примеров хранения настроек во флэш.
0
vosytyuz
0 / 0 / 0
Регистрация: 28.12.2015
Сообщений: 63
05.10.2016, 17:35 25
Цитата Сообщение от x893
Можно - если вы знаете её адрес и умеете переписать эту область памяти.
Флэш тоже можно перепрограммировать из программы.
100500 примеров хранения настроек во флэш.
процитирую себя же

Если делать так :

Код:
uint32_t addr = 0x0807F800;
uint8_t testData[2048] __attribute__((at(0x0807F800)));

HAL_FLASH_Unlock();
for (uint16_t i = 0; i < 2048; i++)
{
HAL_FLASH_Prokram(FLASH_TYPEPROGROM_BYTE, addr, i);
addr++;
}

HAL_FLASH_Tosk();

то массив все-равно ложиться в Total RW Size (RW Data + ZI Data)
а хотелось бы его в Total RO Size (Code + RO Data)
0
dvy
0 / 0 / 0
Регистрация: 19.09.2017
Сообщений: 31
05.10.2016, 17:41 26
Цитата Сообщение от vosytyuz
Цитата Сообщение от x893
Можно - если вы знаете её адрес и умеете переписать эту область памяти.
Флэш тоже можно перепрограммировать из программы.
100500 примеров хранения настроек во флэш.
процитирую себя же

Если делать так :

Код:
uint32_t addr = 0x0807F800;
uint8_t testData[2048] __attribute__((at(0x0807F800)));

HAL_FLASH_Unlock();
for (uint16_t i = 0; i < 2048; i++)
{
HAL_FLASH_Prokram(FLASH_TYPEPROGROM_BYTE, addr, i);
addr++;
}

HAL_FLASH_Tosk();

то массив все-равно ложиться в Total RW Size (RW Data + ZI Data)
а хотелось бы его в Total RO Size (Code + RO Data)

и в чем проблема? он физически во флэше.... посмотри в map файле...
0
vosytyuz
0 / 0 / 0
Регистрация: 28.12.2015
Сообщений: 63
05.10.2016, 17:48 27
testData 0x0807f800 Data 2048 main.o(.ARM.__AT_0x0807F800)
угу
только вот при его определении
увеличивается Total RW Size (RW Data + ZI Data)

а этого как раз и нужно избежать -)
0
Riftistor
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 334
05.10.2016, 18:01 28
Цитата Сообщение от vosytyuz
в моей "задаче" при компилиции не известны значения...
Выведи их в файл или на консоль, скопируй и вставь в проект...
0
div
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
06.10.2016, 10:41 29
Цитата Сообщение от vosytyuz
testData 0x0807f800 Data 2048 main.o(.ARM.__AT_0x0807F800)
угу
только вот при его определении
увеличивается Total RW Size (RW Data + ZI Data)

а этого как раз и нужно избежать -)
Объяви как "const volatile"
0
DOOMSDOY
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
07.10.2016, 00:39 30
1. Обьявите константный массив по нужному адресу.
2. Обьявите указатель на такой же массив, но без const и проинициализируйте нужным адресом.
3. Модифицируйте данные через разадресованный указатель.

Не понимаю в чем проблема, адрес известен , структура данных известна, приведение типа можно делать к чему-угодно...
0
x893
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 886
07.10.2016, 02:33 31
Видимо проблема в том, что книжки не читаются
0
vosytyuz
0 / 0 / 0
Регистрация: 28.12.2015
Сообщений: 63
07.10.2016, 02:42 32
Спасибо всем за обсуждение, тем кто вник в суть проблемы и, и тем кто попытался, и лично книголюбу.
Задача стояла сохранить ROM.
Пришел к выводу, что желанный мною способ, явно не удачное решение - каждый раз переписывать флеш при запуске - не надежно в долгострочной перспективе.
Пошел иным путем.

Всем спасибо!
0
voyd1509
0 / 0 / 0
Регистрация: 08.05.2015
Сообщений: 225
07.10.2016, 02:44 33
я кажется понял - вы хотите что бы компилятор сам зарезервировал флешь по выбранному вами адресу ?
В этом случае вам необходимо сделать несколько настроек:
1) в файл mem.ld в секцию MEMORY добавить адрес и размер своей флеши (обычно это последняя страница)
EEPROM (rw) : ORIGIN = 0x0800FC00, LENKTH = 1K
2) в файл sections.ld добавить новую секцию:
.eeprom (NOLOAD) : ALIGN(2)
{
*(.eeprom.*)
} > EEPROM
3) в C программе создаете переменную:
uint16_t __attribute__((section(".eeprom"))) mass; // тип можете поменять на свой
а если нужен массив то создаете указатель
uint16_t *mypoint = &mass;

ну как то так
0
vosytyuz
0 / 0 / 0
Регистрация: 28.12.2015
Сообщений: 63
07.10.2016, 02:47 34
Цитата Сообщение от voyd1509
я кажется понял - вы хотите что бы компилятор сам зарезервировал флешь по выбранному вами адресу ?
.....
ну как то так
Да, Вы все верно поняли, я по сути так и сделал, но пришел к выводу, что так делать не стоит....
0
RusykOk
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 56
07.10.2016, 18:04 35
вообще-то 10 000 циклов это не так уж и мало. предположим что средний жизненный цикл устройства составляет 10 лет, значит получаем 1000 израсходованных циклов записи в год а это в свою очередь 2,7 цикла в день, что в большинстве случаев приемлемо. а если вычесть нерабочие дни в году то тем более ресурса флеша будет достаточно.
0
07.10.2016, 18:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2016, 18:04

Keil ошибки.
Подскажите в чем проблема.В TrueStudyo все работает. Rebuyld target stm32...

Keil и st-link
Есть плата с микроконтроллером stm32f107. Написал прогу, включающую диоды,...

Keil C51
Добрый день, такой вопрос, собственно провозился с ассемблером около 4 часов,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru