Перейти к содержанию
    

Размещение переменой по заданному адресу и ее значение после ресета

4 часа назад, V_G сказал:

Если хочется иметь константу во флеше, и ее изредка модифицировать (настроечные операции), лучше знать адрес.

Как ни странно, но в runtime адрес переменной легко получить: (int)&var.  ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 минут назад, jcxz сказал:

Как ни странно, но в runtime адрес переменной легко получить: (int)&var.  ;)

Я все-таки предпочитаю жестко задавать адреса настроечных параметров.

Чтобы при страничном перепрограммировании не затирать кусков программы и других переменных из других страниц. Хотя, возможно, есть разные способы достижения одной и той же цели...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, V_G сказал:

Чтобы при страничном перепрограммировании не затирать кусков программы и других переменных из других страниц. Хотя, возможно, есть разные способы достижения одной и той же цели...

А что мешает в runtime определить в какой именно странице находится данный объект?

"Жёстко задавать" там где без этого можно обойтись - это то же самое что брать на себя функции компоновщика при размещении переменных в ОЗУ.

И если "жёстко задавать" адрес - это значит ещё и вручную следить за размерами этих объектов с настройками, чтобы они не вылезли за границы страницы. А это уже - конкретный геморрой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может я неправильно понял изначальное требование, но почему бы не определить указатель, указывающий на нужный физический адрес и не работать с ним?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, GeorgK said:

Может я неправильно понял изначальное требование, но почему бы не определить указатель, указывающий на нужный физический адрес и не работать с ним?

Изначальная задача (у меня) - инициализировать объект, разместив его по точному, заданному мной, адресу. Объект - структура с кучей полей - настроечных параметров.

Указатель на объект сделать можно. Присвоить ему нужный адрес тоже. Разместить объект в памяти по этому указателю также можно. Но инициализировать такой объект одновременно с его объявлением через указатель нельзя. Далее, уже в самой программе, в функции main() или любой другой функции, можно присвоить значения его полям. По-отдельности каждому. Но мне надо не присвоить по-отдельности, а именно инициализировать все разом через список инициализации. В конечном итоге я должен получить, чтобы вместе с кодом программы в прошивке присутствовало значение этого объекта, которое будет зашито в область флеш-памяти по заданному адресу.

Ещё один распространенный пример из этой серии - размещение таблицы символов знакогенератора для матричного индикатора в области флеш-памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Darth Vader сказал:

Ещё один распространенный пример из этой серии - размещение таблицы символов знакогенератора для матричного индикатора в области флеш-памяти.

char const znakogenerator[] = {...}; спасёт отца русской демократии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда я что-то не понимаю. В чём должна выражаться разовость инициализации? После компилятора всё равно получатся несколько опкодов, возможно перемешанных с результатом компиляции предыдущих и последующих строк. На Си - можно завернуть объявление и инициализацию в макрос, аргументом которого будет список инициализации. Одним оператором Си... можно конечно попробовать налепить что-то вроде *((type const *)0x123456) = { field1, field2, ...}; Но придётся продублировать объявление указателя для последующей работы с ним.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 hours ago, Darth Vader said:

Указатель на объект сделать можно. Присвоить ему нужный адрес тоже. Разместить объект в памяти по этому указателю также можно. Но инициализировать такой объект одновременно с его объявлением через указатель нельзя.

И если вы такой объект расположите любой директивой компилятора по заданному адресу его так же нельзя будет инициализировать.

18 hours ago, Darth Vader said:

Но мне надо не присвоить по-отдельности, а именно инициализировать все разом через список инициализации.

Вы можете инициализировать локальную структуру, а потом присвоить её вашей, расположенной по указателю.

18 hours ago, Darth Vader said:

В конечном итоге я должен получить, чтобы вместе с кодом программы в прошивке присутствовало значение этого объекта, которое будет зашито в область флеш-памяти по заданному адресу. 

Вы вроде хотели переменную в ОЗУ? При чём тут флешь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, xvr said:

Вы вроде хотели переменную в ОЗУ?

Нет. Я об этом не говорил. Автор темы - да, возможно. Моя же задача - разместить константную структуру в области флеш-памяти,  одновременно инициализировав её при этом нужными мне значениями. Чтобы была возможность изменять некоторые параметры не затрагивая основную прошивку и не перекомпилируя и перезаливая программу.

Пример со знакогенератором для матричного индикатора тоже очень подходящий. Там стоит та же задача, только размещать надо массив с начертанием символов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

typedef struct {
	uint32_t	field1;
	uint8_t		field2;
	uint8_t		field3[8];
} struct_t;

const struct_t mystruct __attribute__((__at(0x80000000))) = {0x11223344, 0xA2, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}};

как-то так...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, toweroff said:

как-то так...

В итоге к этому и пришел.

Без директив никак. Стандартными средствами языка такое не получить, чтобы создать и одновременно инициализировать константный объект в области флеш-памяти по указателю на него.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Darth Vader сказал:

Без директив никак. Стандартными средствами языка такое не получить, чтобы создать и одновременно инициализировать константный объект в области флеш-памяти по указателю на него.

А чем не устраивает?:

https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=143031&do=findComment&comment=1588002

Размещать объекты по абсолютным адресам - признак дурного тона.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость ЕвгенийДмитриев
22 часа назад, toweroff сказал:

typedef struct {
	uint32_t	field1;
	uint8_t		field2;
	uint8_t		field3[8];
} struct_t;

const struct_t mystruct __attribute__((__at(0x80000000))) = {0x11223344, 0xA2, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}};

как-то так...

Попробовал и все отлично

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 hours ago, jcxz said:

А чем не устраивает?:

Тем, что адрес размещения этого массива в памяти назначит линкер, а не я.

20 hours ago, jcxz said:

Размещать объекты по абсолютным адресам - признак дурного тона.

Не всегда и не везде. Это общее правило, из которого есть исключения-частности, где ручное назначение адресов размещения оправдано.

Например, я хочу, чтобы код программы и параметры конфигурации прибора не лежали в пределах одной страницы флеш-памяти, а были разнесены по разным.

Или я хочу, чтобы код программы и параметры находились в двух разных микросхемах памяти, подключенных к конроллеру по внешней шине. Или программа в контроллере, а настройки/символы  знакогенератора во внешней памяти.

Вобщем, есть много разных ситуаций, когда ручное размещение константных объектов в адресном пространстве оправданно и целесообразно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, Darth Vader сказал:

Тем, что адрес размещения этого массива в памяти назначит линкер, а не я.

А линкёр у Вас сам по себе решает куда что размещать? Или всё-таки им руководите Вы?

 

4 минуты назад, Darth Vader сказал:

Например, я хочу, чтобы код программы и параметры конфигурации прибора не лежали в пределах одной страницы флеш-памяти, а были разнесены по разным.

Или я хочу, чтобы код программы и параметры находились в двух разных микросхемах памяти, подключенных к конроллеру по внешней шине. Или программа в контроллере, а настройки/символы  знакогенератора во внешней памяти.

Всё это элементарно решается заданием линкёру карты размещения секций в памяти. Ни в одном из этих случаев задание абсолютного адреса размещения не нужно. Вы же переменным в программе не задаёте абсолютных адресов, надеюсь?  ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...