tonyk_av 45 19 июля Опубликовано 19 июля · Жалоба 6 hours ago, Intel4004 said: Это конечно-же не так Значит, вы не поняли сути. 6 hours ago, Intel4004 said: Использование секции .ARM.__AT_address не требует ее определения в скаттер-файле. Ага, только если ты не определил секцию, значит, это сделал кто-то другой и куда он её поместил- вопрос. Вероятно, это сделано как оверлей, чтобы можно было куда ни попадя и без контроля со стороны линковщика размещать данные в памяти. 1 hour ago, dimka76 said: Если кроме самой __PLC_params в этой секции ничего не будет, то однозначно располагаться будет с самого начала секции. Если __PLC_params будет первой в списке переменных, размещаемой в секции, то она будет размещаться с самого начала. Остальные переменные будут размещаться за ней в порядке их появления в поле зрения линковщика. 11 minutes ago, artemkad said: И тут, внезапно, оказывается, что идея разместить все переменные в отдельном файле оказывается не такой уж и плохой - там порядок будет зависеть только от порядка размещения в файле и все что есть будет видно по месту. Это, повторю, плохая идея. 11 minutes ago, artemkad said: А если несколько, да еще и в разных файлах проекта, то порядок размещения начнет зависеть от порядка линковки, который обычно устанавливает среда разработки на свое усмотрение. Во-первых, порядок размещения устанавливает линковщик, а не среда программирования. И этот порядок описан в доках на линковщик. Во-вторых, для однозначного размещения существую сегменты, внутри которых помещаются секции, которые тоже можно позиционировать внутри сегмента (терминология ld). При размещении переменных во флэш важно знать, что они находятся в нужной странице, которую рано или поздно придётся стирать для перепрограммирования. Не забывайте, что кроме флэша может быть ещё и память с батарейной поддержкой, в которой тоже могут размещаться переменные, конкретные адреса которых никому не интересны, но всем важно, что они попали в нужный диапазон адресов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 19 июля Опубликовано 19 июля · Жалоба On 7/19/2024 at 10:01 AM, tonyk_av said: Если __PLC_params будет первой в списке переменных, размещаемой в секции, то она будет размещаться с самого начала. О каком списке идет речь ? Где этот список ? Кто его формирует ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 92 19 июля Опубликовано 19 июля · Жалоба 57 минут назад, tonyk_av сказал: Если __PLC_params будет первой в списке переменных, размещаемой в секции, то она будет размещаться с самого начала. Если есть, предположим, две переменные указанные для размещения в этой секции, но в разных объектных файлах, которая из них будет первой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dOb 8 19 июля Опубликовано 19 июля · Жалоба 1 час назад, dimka76 сказал: Где этот список ? В порядке как описано в проекте. IMHO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 92 19 июля Опубликовано 19 июля · Жалоба 9 минут назад, dOb сказал: В порядке как описано в проекте. IMHO Как ни странно, но Keil передает линковщику объектные файлы в виде *.o, а потому к порядку описанному в проекте это отношения не имеет. А вот IAR да, сам передает список и потому уже он устанавливает порядок линковки Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 19 июля Опубликовано 19 июля · Жалоба Судя по отсутствию реакции от Zuse, он, пройдя по указанным ссылкам, уже разобрался, как позиционировать данные и код в памяти. Может, последуете его примеру и прочитаете? Там ведь всё расписано, и с примерами. Что ещё нужно? Не понимаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 19 июля Опубликовано 19 июля · Жалоба 12 часов назад, artemkad сказал: Кстати, забавно что базовые библиотеки описывающие доступ к железу которое обычно по фиксированным адресам к услугам линковщика тоже не прибегают. "Базовые" - это какие? Насколько помню - CCS ("Code Composer Studio" от TI) как раз прибегает. Фрагмент "Linker command file" для ARM- и DSP-ядер OMAP L-137, описывающий регистры периферии: MEMORY { ... PAGE 2: //!<peripheral memory MMR_INTCD (RWI): o = 0x01800000 l = 0x0200 MMR_PDC (RWI): o = 0x01810000 l = 0x0200 MMR_IDMA (RWI): o = 0x01820000 l = 0x0200 MMR_CACHE (RWI): o = 0x01840000 l = 0x8400 //!<only DSP-accessable MMR_EDMA3CC (RWI): o = 0x01C00000 l = 0x5000 MMR_EDMA3TC (RWI): o = 0x01C08000 l = 0x0800 MMR_PSC0 (RWI): o = 0x01C10000 l = 0x1000 MMR_PLL (RWI): o = 0x01C11000 l = 0x0200 MMR_SYSCFG (RWI): o = 0x01C14000 l = 0x0200 MMR_TMR (RWI): o = 0x01C20000 l = 0x2000 MMR_I2C0 (RWI): o = 0x01C22000 l = 0x1000 MMR_RTC (RWI): o = 0x01C23000 l = 0x1000 MMR_PRU (RWI): o = 0x01C37000 l = 0x1000 MMR_SPI0 (RWI): o = 0x01C41000 l = 0x1000 MMR_UART0 (RWI): o = 0x01C42000 l = 0x1000 MMR_MCASP (RWI): o = 0x01D00000 l = 0xC000 MMR_UART1 (RWI): o = 0x01D0C000 l = 0x1000 MMR_UART2 (RWI): o = 0x01D0D000 l = 0x1000 MMR_USB0 (RWI): o = 0x01E00000 l = 0x7000 MMR_SPI1 (RWI): o = 0x01E12000 l = 0x1000 MMR_MPU1 (RWI): o = 0x01E14000 l = 0x1000 MMR_MPU2 (RWI): o = 0x01E15000 l = 0x1000 MMR_GPIO (RWI): o = 0x01E26000 l = 0x1000 MMR_PSC1 (RWI): o = 0x01E27000 l = 0x1000 MMR_I2C1 (RWI): o = 0x01E28000 l = 0x1000 MMR_EMIFB (RWI): o = 0xB0000000 l = 0x8000 MMR_INTCA (RWI): o = 0xFFFEE000 l = 0x2000 } //!Maps the shared memory and peripherals memory to the memory areas. SECTIONS { ... .mmrSyscfgRegs > MMR_SYSCFG, PAGE 2 .mmrPsc0Regs > MMR_PSC0, PAGE 2 .mmrPsc1Regs > MMR_PSC1, PAGE 2 .mmrPllcRegs > MMR_PLL, PAGE 2 .mmrPrussRegs > MMR_PRU, PAGE 2 .mmrDintcRegs > MMR_INTCD, PAGE 2 .mmrAintcRegs > MMR_INTCA, PAGE 2 .mmrIdmaRegs > MMR_IDMA, PAGE 2 .mmrEdma3ccRegs > MMR_EDMA3CC, PAGE 2 .mmrEdma3tcRegs > MMR_EDMA3TC, PAGE 2 .mmrGpioRegs > MMR_GPIO, PAGE 2 .mmrTmrRegs > MMR_TMR, PAGE 2 .mmrRtcRegs > MMR_RTC, PAGE 2 .mmrMcaspRegs > MMR_MCASP, PAGE 2 .mmrSpi0Regs > MMR_SPI0, PAGE 2 .mmrSpi1Regs > MMR_SPI1, PAGE 2 .mmrI2c0Regs > MMR_I2C0, PAGE 2 .mmrI2c1Regs > MMR_I2C1, PAGE 2 .mmrUart0Regs > MMR_UART0, PAGE 2 .mmrUart1Regs > MMR_UART1, PAGE 2 .mmrUart2Regs > MMR_UART2, PAGE 2 .mmrUsb0Regs > MMR_USB0, PAGE 2 .mmrMpu1Regs > MMR_MPU1, PAGE 2 .mmrMpu2Regs > MMR_MPU2, PAGE 2 .mmrEmifbRegs > MMR_EMIFB, PAGE 2 .mmrCacheRegs > MMR_CACHE, PAGE 2 //!<only DSP-accessable .mmrPdcRegs > MMR_PDC, PAGE 2 } Как видно - привязка каждого блока периферии к его базовому абсолютному адресу производится именно в командном файле компоновщика. Распределение регистров внутри каждого из этих блоков - описывается си-структурой в .h-файле. PS: Я бы не стал говорить за все инструменты в мире, основываясь на опыте только с одним.... 1 час назад, artemkad сказал: Если есть, предположим, две переменные указанные для размещения в этой секции, но в разных объектных файлах, которая из них будет первой? Как решит компоновщик в соответствии с действующими у него в данный момент правилами. 1 час назад, dOb сказал: В порядке как описано в проекте. IMHO Это не так. К тому же - плохой способ. Чаще всего компоновщики компонуют секции в порядке уменьшения их размера. Потому так - меньше вероятность проблем. Сами подумайте почему. Например: Если компоновка идёт в два региона памяти размерами: 64КБ + 32КБ, и в программе есть множество переменных (общим размером ==20КБ), кроме которых также имеется массив размером ==50КБ. Подумайте - что будет если следовать вашему правилу? В этом случае компоновка по уменьшению размера секций более безопасна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 19 июля Опубликовано 19 июля · Жалоба On 7/19/2024 at 12:50 AM, artemkad said: Кстати, забавно что базовые библиотеки описывающие доступ к железу которое обычно по фиксированным адресам к услугам линковщика тоже не прибегают. Потому что эти библиотеке в памяти никакие переменные не размещают, а просто обращаются к нужным ячейкам памяти Если развернуть все эти библиотечные макросы, то получится так *((volatile uint32_t*)0x4000001A) = 256437; А тут в теме вопрос стоит именно о размещении некоторой переменной по некоторому адресу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intel4004 1 19 июля Опубликовано 19 июля (изменено) · Жалоба 10 hours ago, tonyk_av said: 16 hours ago, Intel4004 said: Это конечно-же не так Значит, вы не поняли сути. 16 hours ago, Intel4004 said: Использование секции .ARM.__AT_address не требует ее определения в скаттер-файле. Ага, только если ты не определил секцию, значит, это сделал кто-то другой и куда он её поместил- вопрос. Вам два раза сказали, что "Использование секции .ARM.__AT_address не требует ее определения в скаттер-файле.", но вы продолжаете талдычить свои фантазии. А ведь казалось бы, открыл любой проект, добавил в любой исходник строчку unsigned const int IWasMistaken __attribute__((section(".ARM.__AT_0x08080A00"))) = 123; , скомпилял, не трогая scatter, заглянул в map-файл и убедился, что переменная IWasMistaken лежит именно по адресу 0x08080A00. Делов на 5 минут. Но нет, некогда проверять, надо срочно нести бред в массы. Изменено 19 июля пользователем Intel4004 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 19 июля Опубликовано 19 июля (изменено) · Жалоба 1 hour ago, Intel4004 said: Вам два раза сказали, что "Использование секции .ARM.__AT_address не требует ее определения в скаттер-файле." А я разве где-то настаивал, что требует? Читаем внимательно, что я говорил: 11 hours ago, tonyk_av said: если ты не определил секцию, значит, это сделал кто-то другой Никто ведь не запрещает линковщику самому создавать секции по умолчанию. Почитайте доки на линковщик, там должен быть описан этот механизм для секций типа __AT. 1 hour ago, Intel4004 said: но вы продолжаете талдычить свои фантазии. Какие фантазии, кому и что я талдычу? Воспользуйтесь рекомендацией: 8 hours ago, tonyk_av said: Судя по отсутствию реакции от Zuse, он, пройдя по указанным ссылкам, уже разобрался, как позиционировать данные и код в памяти. Может, последуете его примеру и прочитаете? Там ведь всё расписано, и с примерами. Что ещё нужно? Не понимаю Изменено 19 июля пользователем tonyk_av Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 92 19 июля Опубликовано 19 июля · Жалоба 2 часа назад, tonyk_av сказал: Никто ведь не запрещает линковщику самому создавать секции по умолчанию. Нет там никаких секций. Переменные указанные для размещения в какой-то секции маркируются в объектном файле, а потом линковщиком эти маркеры заменяются на реальные адреса в секции времени исполнения. А в данном случае речь об абсолютных адресах в линейном адресном пространстве ARM-а которые от перемещений объектного кода не меняются и внимания линковщика не требуют. 11 часов назад, jcxz сказал: Как решит компоновщик в соответствии с действующими у него в данный момент правилами. Где конкретно указаны эти правила для тех двух пользовательских переменных? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 20 июля Опубликовано 20 июля (изменено) · Жалоба 19 hours ago, artemkad said: Нет там никаких секций. Тогда читаем: Quote The name of the section is only significant if you are trying to match the section by name in a scatter file. Without overlays, the linker automatically assigns __at sections when you use the --autoat command-line option. This option is the default. If you are using overlays, then you cannot use --autoat to place __at sections. Так что всё ожидаемо и логично. Я Кейлом не пользуюсь уже лет 20, но удивляет, что те, кто, пользуются On 7/17/2024 at 11:01 PM, artemkad said: упрощают себе жизнь прямой адресацией из основного кода. Документация у Кейла вполне вменяемая, есть примеры. Синтаксис компилятора повторяет gcc, синтаксис и структура файла конфигуратора линковщика проще, чем у ld. Изменено 20 июля пользователем tonyk_av Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 28 августа Опубликовано 28 августа · Жалоба Похожий вопрос, но расширенный: А можно заставить размещенную константу занять больше места, чем её sizeof()? Без СМС и регистрации! Без секции в линкере! То есть хочу чтобы оно занимало, например полную страницу флеша. Как разместить в начало страницы- понятно: const MyConsts_t MyConst __ALIGNED(CPU_INTFLASH_PAGELENGTH) = {FACTORY_CONSTS}; Но вот как сказать Кейлу, чтобы он зарезервировал всю область адресов, от конца размещения MyConst до конца страницы? Или: как создать фейковый массив FOO нужного размера и положить его сразу после MyConsts ? Пробовал: static const uint8_t foo1 [FOO_LENGTH] __attribute__((at(FOO_ADDR))); // Compiler v5 Это работает только если FOO_LENGTH и FOO_ADDR константы (0x...). А вот если там вычислизм, содержащий, например, &MyConst или sizeof(MyConsts_t) - то компилятор ругается на использование не-константы в "at()": error: #60: this operator is not allowed in an integral constant expression Пока что просто докидываю этот FOO прямо внутрь MyConsts_t, так конечно работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 30 августа Опубликовано 30 августа · Жалоба Самое простое вставить в конце вашей структуры массив нужного размера. Или некий хедер хранилища данных и зарезервированное место под нужное количество записей. И лучше всего средствами strict ANSI, без узкозаточенных примочек кейла, иара и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 45 30 августа Опубликовано 30 августа · Жалоба On 8/28/2024 at 4:50 PM, Ruslan1 said: __ALIGNED Вот же, сами пишите как: используйте для переменной выравнивание размером в страницу памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться