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

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

9 hours ago, artemkad said:

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

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

8 hours ago, artemkad said:

изучать ради одного момента по-иди отски описанную доку на компоновщик без возможности найти адекватные примеры и с перспективой наделать еще и кучу маловразумительных ошибок

Доки вполне нормальные, и примеры там же есть.

 

9 hours ago, artemkad said:

Ну а когда понадобилось разместить данные в конкретном месте из-за архитектуры памяти конкретного МК ты предложил ... поставить W25Q с FatFS

Опять враньё: то линковщик размещает переменные по каким ему вздумается адресам, то я не умею размещать переменные по нужным адресам. Может, хватит глупости говорить?

W25Q установлена из-за особенностей организации флэша в STM32F4 с его страницами большого размера и особенностями протокола обмена среды программирования с ПЛК. В оригинальных ПЛК вся память с конфигурацией ПЛК и программой пользователя представляет собой ОЗУ с батарейкой, поэтому IDE может сначала записать разом 32К, а потом по несколько байт дописывать. Плюс реализация FTP-сервера получается намного проще при наличии файловой системы, чем в памяти STM32F4. И это не считая на два порядка большего ресурса W25Q. Вот поэтому логичней оказалось применить W25Q, а не из-за моего неумения размещать переменные по нужным мне адресам. jcxz, благодарю, ты там всё грамотно человеку разъяснил про линковщик.

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


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

Я поступаю так:

Структуру с константами выделяю в отдельный файл. Например KalKoeff.c

В вкладке "Linker"

Снимаю галочку "Use Memory Layout from Target Dialog"

Выбираю путь к Scatter file

редактирую и добавляю например:

LR_IROM2 0x08008000 0x00008000  {
  ER_IROM2 0x08008000 0x00008000  {  ; load address = execution address
    KalKoeff.o (+RO)
   }
}
 

 

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


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

58 minutes ago, dOb said:

Структуру с константами выделяю в отдельный файл.

Как очень кривовато. Сомневаюсь, что Кейл не умеет делать это всё без вынесения в отдельный файл.

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


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

3 часа назад, tonyk_av сказал:

то я не умею размещать переменные по нужным адресам. Может, хватит глупости говорить?

Это где я говорил что ты не умеешь? Я намекал, что подобное умение от тебя не замечено на этом форуме на практике. От тебя есть много слов "о всем хорошем и против всего плохого", но вот в коде который ты приводил  "линковщик сам размещал секцию куда ему вздумается". Единственное что ты продемонстрировал это умение указывать выравнивание. Возможно ты и что-то другое умеешь, но тут это умение за тобой не замечено на практике.

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

Как очень кривовато. Сомневаюсь, что Кейл не умеет делать это всё без вынесения в отдельный файл.

Да что ты говоришь... Ежу понятно, что умеет. Вот только по причинам указанным мной выше, а именно, по причине отсутствия вменяемой док и примеров, люди предпочитают ограничиваться слегка отредактированным куцым примером из доки который хоть как-то работает. А все остальное компенсируется средствами отлично описанного компилятора.

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


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

2 hours ago, artemkad said:

но вот в коде который ты приводил  "линковщик сам размещал секцию куда ему вздумается".

Приплыли. Смотри ещё раз, коли с первого раза не понял.

Скрипт линковщика:

Spoiler
/* Memories definition */
MEMORY
{
	...
    SECTOR_1_2          (rx)    : ORIGIN = 0x08004000, LENGTH = 32K
	...
}

/* Sections */
SECTIONS
{
	...
  .plc_params :
  {
    . = ALIGN(2);
    
    KEEP (*(.plc_params))

  } >SECTOR_1_2
...

 

Переменная в программе:

const uint8 __PLC_params[ SIZE_BYTE_PARAMS ] \
    __attribute__ ( (section( ".plc_params" ), used ) ) =
{
    MAX_STEP / 1000, 0x00,  // 00 0x0000 -- SIZE IN STEP 16000
    0x00, 0x00,             // 02        --

.....

Думаю, людям, читавшим мануал на ld, понятно, что массив __PLC_params будет начинаться с адреса 0x08004000. Так что не неси больше бред, artemkad, ладно?

Изменено пользователем tonyk_av

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


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

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

массив __PLC_params будет начинаться с адреса 0x08004000.

Не факт. Только если нигде в программе больше нет секций ".plc_params". Иначе - как повезёт.

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


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

41 minutes ago, jcxz said:

Только если нигде в программе больше нет секций ".plc_params".

Конечно, есть. То, что размещается в этой секции, описывается по порядку появления переменных у компилятора.

42 minutes ago, jcxz said:

Иначе - как повезёт.

Что значит "как повезёт"? Линковщик-то физический адрес знает, поэтому все ссылки в программе на переменные в этой секции установит правильно. Адрес секции я указал, а сколько и где в ней будет размещено узнает линковщик на этапе линковки, заодно и проверит, что нет наложения секций. Если адреса размещения не критичны, то пусть линковщик сам раскидывает, а если нужен точный, то создаётся и позиционируется ещё одна секция или вообще сегмент.

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


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

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

Что значит "как повезёт"?

"Как повезёт" относилось к вашей фразе:

2 часа назад, tonyk_av сказал:

массив __PLC_params будет начинаться с адреса 0x08004000

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

Конечно, есть. То, что размещается в этой секции, описывается по порядку появления переменных у компилятора.

Вот именно поэтому. Если секции описаны не как оверлейные, то все переменные размещаемые внутри региона SECTOR_1_2 будут иметь разные стартовые адреса. И только одна из этих переменных будет иметь стартовый адрес == 0x08004000. Какая именно - как повезёт. Поэтому и: "будет ли иметь массив __PLC_params адрес == 0x08004000" - как повезёт.

PS: Это конечно не относится к оверлейным секциям. В оверлейных все переменные будут иметь одинаковые стартовые адреса.

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


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

3 minutes ago, jcxz said:

Какая именно - как повезёт.

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

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


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

On 3/2/2023 at 2:36 PM, MiklPolikov said:

Вопрос, как разместить константу по заданному адресу во Flash ?
В Keil 4 работало так 
unsigned const int CONST123 __attribute__ ( (at(0x08080A00)) ) = 123; 
Keil 5.38 перестал понимать директиву "at". Как теперь сделать то же самое?

А секция .ARM.__AT_address тоже не работает?

unsigned const int CONST123 __attribute__((section(".ARM.__AT_0x08080A00"))) = 123; 

https://developer.arm.com/documentation/100068/0608/compiler-source-code-compatibility/language-extension-compatibility--attributes

Table 4-4 Migrating __attribute__((at(address))) and zero-initialized __attribute__((section("name")))

ARM Compiler 5 attribute: __attribute__((at(address)))

ARM Compiler 6 attribute: __attribute__((section(".ARM.__at_address")))

Description: armlink in ARM Compiler 6 still supports the placement of sections in the form of .ARM.__at_address

 

 

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


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

3 hours ago, Intel4004 said:

Во-от, что и требовалось понять. Только без скаттер-файла толку от этого нет.

А  теперь открываем доки о концепции размещения информации в памяти и синтаксисе скаттер-файла (нужен VPN). При беглом просмотре синтаксис в компиляторе похож на gcc, а скаттер имеет свой уникальный, хотя после синтаксиса ld всё выглядит довольно просто и понятно.

 

Изменено пользователем tonyk_av

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


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

12 часов назад, tonyk_av сказал:

Думаю, людям, читавшим мануал на ld, понятно, что массив __PLC_params будет начинаться с адреса 0x08004000.

Чуток не так - __PLC_params  будет располагаться в секции .plc_params, а вот с какого в ней адреса  это предмет для уточнений.

5 часов назад, tonyk_av сказал:
8 часов назад, Intel4004 сказал:

Во-от, что и требовалось понять. Только без скаттер-файла толку от этого нет.

Вообще-то это дока на компилятор и атрибуты компилятора.

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

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


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

7 hours ago, tonyk_av said:

Только без скаттер-файла толку от этого нет.

Это конечно-же не так. Использование секции .ARM.__AT_address не требует ее определения в скаттер-файле.

 

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


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

On 7/19/2024 at 12:50 AM, artemkad said:

Чуток не так - __PLC_params  будет располагаться в секции .plc_params, а вот с какого в ней адреса  это предмет для уточнений.

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

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


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

1 час назад, dimka76 сказал:

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

А если несколько, да еще и в разных файлах проекта, то порядок размещения начнет зависеть от порядка линковки, который обычно устанавливает среда разработки на свое усмотрение. И тут, внезапно, оказывается, что идея разместить все переменные в отдельном файле оказывается не такой уж и плохой - там порядок будет зависеть только от порядка размещения в файле и все что есть будет видно по месту.

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


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

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

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

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

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

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

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

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

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

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