jcxz 241 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба 4 часа назад, V_G сказал: Если хочется иметь константу во флеше, и ее изредка модифицировать (настроечные операции), лучше знать адрес. Как ни странно, но в runtime адрес переменной легко получить: (int)&var. ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 11 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба 17 минут назад, jcxz сказал: Как ни странно, но в runtime адрес переменной легко получить: (int)&var. ;) Я все-таки предпочитаю жестко задавать адреса настроечных параметров. Чтобы при страничном перепрограммировании не затирать кусков программы и других переменных из других страниц. Хотя, возможно, есть разные способы достижения одной и той же цели... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба 4 часа назад, V_G сказал: Чтобы при страничном перепрограммировании не затирать кусков программы и других переменных из других страниц. Хотя, возможно, есть разные способы достижения одной и той же цели... А что мешает в runtime определить в какой именно странице находится данный объект? "Жёстко задавать" там где без этого можно обойтись - это то же самое что брать на себя функции компоновщика при размещении переменных в ОЗУ. И если "жёстко задавать" адрес - это значит ещё и вручную следить за размерами этих объектов с настройками, чтобы они не вылезли за границы страницы. А это уже - конкретный геморрой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GeorgK 1 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба Может я неправильно понял изначальное требование, но почему бы не определить указатель, указывающий на нужный физический адрес и не работать с ним? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба 5 hours ago, GeorgK said: Может я неправильно понял изначальное требование, но почему бы не определить указатель, указывающий на нужный физический адрес и не работать с ним? Изначальная задача (у меня) - инициализировать объект, разместив его по точному, заданному мной, адресу. Объект - структура с кучей полей - настроечных параметров. Указатель на объект сделать можно. Присвоить ему нужный адрес тоже. Разместить объект в памяти по этому указателю также можно. Но инициализировать такой объект одновременно с его объявлением через указатель нельзя. Далее, уже в самой программе, в функции main() или любой другой функции, можно присвоить значения его полям. По-отдельности каждому. Но мне надо не присвоить по-отдельности, а именно инициализировать все разом через список инициализации. В конечном итоге я должен получить, чтобы вместе с кодом программы в прошивке присутствовало значение этого объекта, которое будет зашито в область флеш-памяти по заданному адресу. Ещё один распространенный пример из этой серии - размещение таблицы символов знакогенератора для матричного индикатора в области флеш-памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 15 октября, 2018 Опубликовано 15 октября, 2018 · Жалоба 3 часа назад, Darth Vader сказал: Ещё один распространенный пример из этой серии - размещение таблицы символов знакогенератора для матричного индикатора в области флеш-памяти. char const znakogenerator[] = {...}; спасёт отца русской демократии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GeorgK 1 16 октября, 2018 Опубликовано 16 октября, 2018 · Жалоба Тогда я что-то не понимаю. В чём должна выражаться разовость инициализации? После компилятора всё равно получатся несколько опкодов, возможно перемешанных с результатом компиляции предыдущих и последующих строк. На Си - можно завернуть объявление и инициализацию в макрос, аргументом которого будет список инициализации. Одним оператором Си... можно конечно попробовать налепить что-то вроде *((type const *)0x123456) = { field1, field2, ...}; Но придётся продублировать объявление указателя для последующей работы с ним. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 16 октября, 2018 Опубликовано 16 октября, 2018 · Жалоба 18 hours ago, Darth Vader said: Указатель на объект сделать можно. Присвоить ему нужный адрес тоже. Разместить объект в памяти по этому указателю также можно. Но инициализировать такой объект одновременно с его объявлением через указатель нельзя. И если вы такой объект расположите любой директивой компилятора по заданному адресу его так же нельзя будет инициализировать. 18 hours ago, Darth Vader said: Но мне надо не присвоить по-отдельности, а именно инициализировать все разом через список инициализации. Вы можете инициализировать локальную структуру, а потом присвоить её вашей, расположенной по указателю. 18 hours ago, Darth Vader said: В конечном итоге я должен получить, чтобы вместе с кодом программы в прошивке присутствовало значение этого объекта, которое будет зашито в область флеш-памяти по заданному адресу. Вы вроде хотели переменную в ОЗУ? При чём тут флешь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 16 октября, 2018 Опубликовано 16 октября, 2018 · Жалоба 3 hours ago, xvr said: Вы вроде хотели переменную в ОЗУ? Нет. Я об этом не говорил. Автор темы - да, возможно. Моя же задача - разместить константную структуру в области флеш-памяти, одновременно инициализировав её при этом нужными мне значениями. Чтобы была возможность изменять некоторые параметры не затрагивая основную прошивку и не перекомпилируя и перезаливая программу. Пример со знакогенератором для матричного индикатора тоже очень подходящий. Там стоит та же задача, только размещать надо массив с начертанием символов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 17 октября, 2018 Опубликовано 17 октября, 2018 · Жалоба 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}}; как-то так... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 17 октября, 2018 Опубликовано 17 октября, 2018 · Жалоба 5 hours ago, toweroff said: как-то так... В итоге к этому и пришел. Без директив никак. Стандартными средствами языка такое не получить, чтобы создать и одновременно инициализировать константный объект в области флеш-памяти по указателю на него. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 17 октября, 2018 Опубликовано 17 октября, 2018 · Жалоба 1 час назад, Darth Vader сказал: Без директив никак. Стандартными средствами языка такое не получить, чтобы создать и одновременно инициализировать константный объект в области флеш-памяти по указателю на него. А чем не устраивает?: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=143031&do=findComment&comment=1588002 Размещать объекты по абсолютным адресам - признак дурного тона. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость ЕвгенийДмитриев 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 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}}; как-то так... Попробовал и все отлично Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 20 hours ago, jcxz said: А чем не устраивает?: Тем, что адрес размещения этого массива в памяти назначит линкер, а не я. 20 hours ago, jcxz said: Размещать объекты по абсолютным адресам - признак дурного тона. Не всегда и не везде. Это общее правило, из которого есть исключения-частности, где ручное назначение адресов размещения оправдано. Например, я хочу, чтобы код программы и параметры конфигурации прибора не лежали в пределах одной страницы флеш-памяти, а были разнесены по разным. Или я хочу, чтобы код программы и параметры находились в двух разных микросхемах памяти, подключенных к конроллеру по внешней шине. Или программа в контроллере, а настройки/символы знакогенератора во внешней памяти. Вобщем, есть много разных ситуаций, когда ручное размещение константных объектов в адресном пространстве оправданно и целесообразно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 4 минуты назад, Darth Vader сказал: Тем, что адрес размещения этого массива в памяти назначит линкер, а не я. А линкёр у Вас сам по себе решает куда что размещать? Или всё-таки им руководите Вы? 4 минуты назад, Darth Vader сказал: Например, я хочу, чтобы код программы и параметры конфигурации прибора не лежали в пределах одной страницы флеш-памяти, а были разнесены по разным. Или я хочу, чтобы код программы и параметры находились в двух разных микросхемах памяти, подключенных к конроллеру по внешней шине. Или программа в контроллере, а настройки/символы знакогенератора во внешней памяти. Всё это элементарно решается заданием линкёру карты размещения секций в памяти. Ни в одном из этих случаев задание абсолютного адреса размещения не нужно. Вы же переменным в программе не задаёте абсолютных адресов, надеюсь? ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться