tonyk_av 39 Вчера в 03:00 Опубликовано вчера в 03:00 · Жалоба 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, благодарю, ты там всё грамотно человеку разъяснил про линковщик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dOb 10 Вчера в 04:54 Опубликовано вчера в 04:54 · Жалоба Я поступаю так: Структуру с константами выделяю в отдельный файл. Например 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) } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 39 Вчера в 05:57 Опубликовано вчера в 05:57 · Жалоба 58 minutes ago, dOb said: Структуру с константами выделяю в отдельный файл. Как очень кривовато. Сомневаюсь, что Кейл не умеет делать это всё без вынесения в отдельный файл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 59 Вчера в 06:17 Опубликовано вчера в 06:17 · Жалоба 3 часа назад, tonyk_av сказал: то я не умею размещать переменные по нужным адресам. Может, хватит глупости говорить? Это где я говорил что ты не умеешь? Я намекал, что подобное умение от тебя не замечено на этом форуме на практике. От тебя есть много слов "о всем хорошем и против всего плохого", но вот в коде который ты приводил "линковщик сам размещал секцию куда ему вздумается". Единственное что ты продемонстрировал это умение указывать выравнивание. Возможно ты и что-то другое умеешь, но тут это умение за тобой не замечено на практике. 20 минут назад, tonyk_av сказал: Как очень кривовато. Сомневаюсь, что Кейл не умеет делать это всё без вынесения в отдельный файл. Да что ты говоришь... Ежу понятно, что умеет. Вот только по причинам указанным мной выше, а именно, по причине отсутствия вменяемой док и примеров, люди предпочитают ограничиваться слегка отредактированным куцым примером из доки который хоть как-то работает. А все остальное компенсируется средствами отлично описанного компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 39 Вчера в 08:44 Опубликовано вчера в 08:44 (изменено) · Жалоба 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, ладно? Изменено вчера в 08:45 пользователем tonyk_av Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 23 часа назад Опубликовано 23 часа назад · Жалоба 48 минут назад, tonyk_av сказал: массив __PLC_params будет начинаться с адреса 0x08004000. Не факт. Только если нигде в программе больше нет секций ".plc_params". Иначе - как повезёт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 39 22 часа назад Опубликовано 22 часа назад · Жалоба 41 minutes ago, jcxz said: Только если нигде в программе больше нет секций ".plc_params". Конечно, есть. То, что размещается в этой секции, описывается по порядку появления переменных у компилятора. 42 minutes ago, jcxz said: Иначе - как повезёт. Что значит "как повезёт"? Линковщик-то физический адрес знает, поэтому все ссылки в программе на переменные в этой секции установит правильно. Адрес секции я указал, а сколько и где в ней будет размещено узнает линковщик на этапе линковки, заодно и проверит, что нет наложения секций. Если адреса размещения не критичны, то пусть линковщик сам раскидывает, а если нужен точный, то создаётся и позиционируется ещё одна секция или вообще сегмент. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 217 22 часа назад Опубликовано 22 часа назад · Жалоба 47 минут назад, tonyk_av сказал: Что значит "как повезёт"? "Как повезёт" относилось к вашей фразе: 2 часа назад, tonyk_av сказал: массив __PLC_params будет начинаться с адреса 0x08004000 47 минут назад, tonyk_av сказал: Конечно, есть. То, что размещается в этой секции, описывается по порядку появления переменных у компилятора. Вот именно поэтому. Если секции описаны не как оверлейные, то все переменные размещаемые внутри региона SECTOR_1_2 будут иметь разные стартовые адреса. И только одна из этих переменных будет иметь стартовый адрес == 0x08004000. Какая именно - как повезёт. Поэтому и: "будет ли иметь массив __PLC_params адрес == 0x08004000" - как повезёт. PS: Это конечно не относится к оверлейным секциям. В оверлейных все переменные будут иметь одинаковые стартовые адреса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 39 21 час назад Опубликовано 21 час назад · Жалоба 3 minutes ago, jcxz said: Какая именно - как повезёт. Поэтому у меня в программе переменные для для каждого _сектора_ определяются в одном файле и по порядку, а там, где это не критично, то в секциях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intel4004 1 20 часов назад Опубликовано 20 часов назад · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 39 17 часов назад Опубликовано 17 часов назад (изменено) · Жалоба 3 hours ago, Intel4004 said: https://developer.arm.com/documentation/100068/0608/compiler-source-code-compatibility/language-extension-compatibility--attributes Во-от, что и требовалось понять. Только без скаттер-файла толку от этого нет. А теперь открываем доки о концепции размещения информации в памяти и синтаксисе скаттер-файла (нужен VPN). При беглом просмотре синтаксис в компиляторе похож на gcc, а скаттер имеет свой уникальный, хотя после синтаксиса ld всё выглядит довольно просто и понятно. Изменено 17 часов назад пользователем tonyk_av Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 59 11 часов назад Опубликовано 11 часов назад · Жалоба 12 часов назад, tonyk_av сказал: Думаю, людям, читавшим мануал на ld, понятно, что массив __PLC_params будет начинаться с адреса 0x08004000. Чуток не так - __PLC_params будет располагаться в секции .plc_params, а вот с какого в ней адреса это предмет для уточнений. 5 часов назад, tonyk_av сказал: 8 часов назад, Intel4004 сказал: https://developer.arm.com/documentation/100068/0608/compiler-source-code-compatibility/language-extension-compatibility--attributes Во-от, что и требовалось понять. Только без скаттер-файла толку от этого нет. Вообще-то это дока на компилятор и атрибуты компилятора. Кстати, забавно что базовые библиотеки описывающие доступ к железу которое обычно по фиксированным адресам к услугам линковщика тоже не прибегают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intel4004 1 8 часов назад Опубликовано 8 часов назад · Жалоба 7 hours ago, tonyk_av said: Только без скаттер-файла толку от этого нет. Это конечно-же не так. Использование секции .ARM.__AT_address не требует ее определения в скаттер-файле. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 52 3 часа назад Опубликовано 3 часа назад · Жалоба On 7/19/2024 at 12:50 AM, artemkad said: Чуток не так - __PLC_params будет располагаться в секции .plc_params, а вот с какого в ней адреса это предмет для уточнений. Если кроме самой __PLC_params в этой секции ничего не будет, то однозначно располагаться будет с самого начала секции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 59 2 часа назад Опубликовано 2 часа назад · Жалоба 1 час назад, dimka76 сказал: Если кроме самой __PLC_params в этой секции ничего не будет, то однозначно располагаться будет с самого начала секции. А если несколько, да еще и в разных файлах проекта, то порядок размещения начнет зависеть от порядка линковки, который обычно устанавливает среда разработки на свое усмотрение. И тут, внезапно, оказывается, что идея разместить все переменные в отдельном файле оказывается не такой уж и плохой - там порядок будет зависеть только от порядка размещения в файле и все что есть будет видно по месту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться