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

Keil 5.38 Разместить константу по заданному адресу во Flash

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).

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

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

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


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

On 7/19/2024 at 10:01 AM, tonyk_av said:

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

О каком списке идет речь ? Где этот список ? Кто его формирует ?

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


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

57 минут назад, tonyk_av сказал:

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

Если есть, предположим, две переменные указанные для размещения в этой секции, но в разных объектных файлах, которая из них будет первой?

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


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

9 минут назад, dOb сказал:

В порядке как описано в проекте. IMHO

Как ни странно, но Keil передает линковщику объектные файлы в виде *.o, а потому к порядку описанному в проекте это отношения не имеет.

А вот IAR да, сам передает список и потому уже он устанавливает порядок линковки

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


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

Судя по отсутствию реакции от Zuse, он, пройдя по указанным ссылкам, уже разобрался, как позиционировать данные и код в памяти. Может, последуете его примеру и прочитаете? Там ведь всё расписано, и с примерами. Что ещё нужно? Не понимаю.

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


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

11 часов назад, artemkad сказал:

Кстати, забавно что базовые библиотеки описывающие доступ к железу которое обычно по фиксированным адресам к услугам линковщика тоже не прибегают.

"Базовые" - это какие?

Насколько помню - CCS (от TI) как раз прибегает. Фрагмент "Linker command file" для ARM- и DSP-ядер 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-файле.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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