Связанные сообщения
-
- Тут мне не понятно зачем понадобилось создавать свой сегмент данных
для своих переменных, почему не положить их принудительно в уже
имеющиеся через __attribute__((section(".sdata"))) или .sbss Тогда
не потребуется править скрипт линкера, подойдет стандартный. - AlexBi(30.06.2026 09:57)
- Потому, что одной маленькой секции, может не хватить на все данные,
к которым хотелся быстрый доступ (ко всем!). Поэтому предложено
объединять данные в свои сегменты. - Nikolay_Po(05.07.2026 09:41)
- это сложный ответ, потому что в этой теме мы очень удачно обошли
вопрос управления содержимым $gp по ходу выполнения кода. тут бы я
декларировал бы следующий принцып "в собранном коде - каждой
реальной секции маленьких данных, свое значение $gp ". и тут
рождается новая тема - возможность использовать внешний
подгруженный бинарно-совместистимый код, оверлеи, самомодификацию и
рефлексию(!!!), но это выходит за рамки школьного образования :) - klen(05.07.2026 10:36)
- А как переназначение $gp в принципе совместимо с прерываниями? Его
тогда нужно добавлять в сохраняемый контекст. - =AlexD=(06.07.2026 10:52)
- УГУ. И в переключалку контекста ОСРВ, если используется. - Nikolay_Po(06.07.2026 10:57)
- Главное для меня то, что в таком случае, придётся добавить gp в набор сохраняемых регистров при переключении контекста ОСРВ. - Nikolay_Po(05.07.2026 10:38)
- А как переназначение $gp в принципе совместимо с прерываниями? Его
тогда нужно добавлять в сохраняемый контекст. - =AlexD=(06.07.2026 10:52)
- это сложный ответ, потому что в этой теме мы очень удачно обошли
вопрос управления содержимым $gp по ходу выполнения кода. тут бы я
декларировал бы следующий принцып "в собранном коде - каждой
реальной секции маленьких данных, свое значение $gp ". и тут
рождается новая тема - возможность использовать внешний
подгруженный бинарно-совместистимый код, оверлеи, самомодификацию и
рефлексию(!!!), но это выходит за рамки школьного образования :) - klen(05.07.2026 10:36)
- Данные случайным образом попадают в .sdata .sbss. Чтоб можно было
бы управлять порядком прижатия нужных мне кусочков данных. - klen(05.07.2026 09:38)
- А чем вам не нравится стандартный линк файл от WCH который есть во
всех примерах - там порядок сегментов .data / .sdata / .sbss / .bss
и $gp инициализируется на начало сегмента .sdata + 0x800. И так как
.sbss = .bss то при релаксации (-Wl,--relax включена по умолчанию)
всё .bss доступно сразу по $gp (естественно в пределах +-2K
смещения). А для использования .sdata надо задать как раз параметр
-msmall-data-limit. Сегменты .sdata и .sbss рядом вместе. Zikon(664 знак., 05.07.2026 11:38)
- А вот в известной библиотеке ch32fun очень странный линк файл по поводу $gp. Инициализация $gp - адрес сегмента .data + 0x3fc. И как это понимать? Компилятор/линкер всё равно не будут работать с данными в .data через $gp. А если хотите всё же .data прихватить - задирайте значение -msmall-data-limit, но потом не удивляйтесь что 4К быстро закончились для $gp. Стандартный вариант от WCH - более оптимальный. - Zikon(05.07.2026 11:47)
- А чем вам не нравится стандартный линк файл от WCH который есть во
всех примерах - там порядок сегментов .data / .sdata / .sbss / .bss
и $gp инициализируется на начало сегмента .sdata + 0x800. И так как
.sbss = .bss то при релаксации (-Wl,--relax включена по умолчанию)
всё .bss доступно сразу по $gp (естественно в пределах +-2K
смещения). А для использования .sdata надо задать как раз параметр
-msmall-data-limit. Сегменты .sdata и .sbss рядом вместе. Zikon(664 знак., 05.07.2026 11:38)
- Потому, что одной маленькой секции, может не хватить на все данные,
к которым хотелся быстрый доступ (ко всем!). Поэтому предложено
объединять данные в свои сегменты. - Nikolay_Po(05.07.2026 09:41)
- Что-то я не понял, а почему этим линкер занимается, а не
компилятор? Самая тема использовать его, как на старых интелях, как
регистр сегмента данных (и тасовать в хвост и гриву, переставляя то
туда, то сюда). Нет? - Cкpипaч(29.06.2026 15:52)
- Потому что за относительные адреса отвечает уже сборщик, компилятор
не знает по какому адресу что будет лежать! - Zikon(29.06.2026 16:29)
- Схера вдруг. На х86 - знал. Особенно на 8086. - Cкpипaч(29.06.2026 16:30)
- Сейчас уже много изменилось и на линкер возложены функции не только по сборке, но и оптимизации - Zikon(29.06.2026 17:28)
- вы наверно и про LTO не знаете ? - Zikon(29.06.2026 16:36)
- LTO обычно не сильно меняет распределение ОЗУ - AlexBi(29.06.2026 19:50)
- Не знаю, и пожалуй даже рад этому. Cкpипaч(68 знак., 29.06.2026 16:45)
- LTO даёт 20..30%, бывает до 50% по размеру и по скорости. А работа
с $gp - это штатное использование ABI (двоичного интерфейса
приложений) для архитектуры RISC-V, хотя для косвенной адресации
может быть использован любой другой регистр. Но именно этот
регистр, по соглашению ABI, назначен глобальным указателем - для
ускорения и уменьшения количества инструкций доступа к памяти и
периферии. Nikolay_Po(91 знак., 29.06.2026 16:58)
- у меня lto в среднем 30% дает пожатия. чем больше и сложнее код
- тем больше эффект. - klen(05.07.2026 10:38)
- А я заметил, что по ходу отладки и доводки, чем логичнее код, даже
если количество его функций растёт, тем он меньше после LTO.
Пишешь, добавляешь функционал, попутно делая код более стройным - и
с каждой добавленной функцией, размер падает. Парадокс. - Nikolay_Po(05.07.2026 10:47)
- тут одно из двух на ум приходит - либо ты умеешь пишешь таколй
охуэнный код что оптимазеру жало некуда воткнут, либо ....
настолько хуевый что он моск себе ломает и плачет :) будем считать
что имеем первое :) - klen(06.07.2026 12:26)
- Главное в гитхаб не выкладывать, а то разработчики AI, использующие материалы гитхаб для обучения, негодуют :-) reZident(1 знак., 06.07.2026 16:12, картинка)
- Типа такого: Nikolay_Po(702 знак., 06.07.2026 15:29)
- тут одно из двух на ум приходит - либо ты умеешь пишешь таколй
охуэнный код что оптимазеру жало некуда воткнут, либо ....
настолько хуевый что он моск себе ломает и плачет :) будем считать
что имеем первое :) - klen(06.07.2026 12:26)
- А я заметил, что по ходу отладки и доводки, чем логичнее код, даже
если количество его функций растёт, тем он меньше после LTO.
Пишешь, добавляешь функционал, попутно делая код более стройным - и
с каждой добавленной функцией, размер падает. Парадокс. - Nikolay_Po(05.07.2026 10:47)
- ...а системы автоматики Siemens дают 30...35% экономии
теплоносителя. И то, и другое правда. Но почему-то раньше линкеры
выбрасывали неиспользуемые сегменты кода/данных без LTO, а теперь -
нет. - Cкpипaч(29.06.2026 17:02)
- Вы чего-то путаетесь. И без LTO, неиспользуемые секции
выбрасываются. Удавалось заставить компилятор не выбрасывать только
изменяя дефолтные настройки среды разработки. Уже более 5 лет
использую LTO во всех проектах, где работает GCC или основанные на
нём компиляторы. Не уверен, но, вроде, даже в Arduino IDE, LTE
включено по-умолчанию, хотя в первой версии среды приходилось
включать вручную, правкой файла конфигурации. - Nikolay_Po(29.06.2026 17:07)
- Сейчас - без LTO грусть. Раньше, неиспользуемые секции выбрасывались линкером без LTO. Cкpипaч(1273 знак., 29.06.2026 17:42)
- Сказали же - LTO это не про секции и функции. Это и так без LTO
делается. LTO это когда, код даже выкидывается, например если в
main запускаются 1-2 раза какие-то другие процедуры - то код просто
встраивается и склеивается (нет вызовов этих процедур) (но это
упрощённо). Может вообще System_Init и main склеить и код
соптимизировать сразу. И это только одна из оптимизаций. - Zikon(29.06.2026 20:40)
- Выкидывание пролога/эпилога приносит 30% экономии?! Звездёж. - Cкpипaч(29.06.2026 20:42 - 20:45)
- Это же только одна из оптимизаций (выкидывание пролога/эпилога) после этого он ещё оптимизирует сам код, и многое другое делает ! - Zikon(29.06.2026 20:57)
- в Keil и GCC при ключах -Os или -Oz - LTO уменьшил код на 7-11% в тесте CoreMark, (Cortex-M0+ Cortex-M4), но код там небольшой. - Zikon(29.06.2026 20:53)
- Зачастую дофига приносит. Меня бы 30% не удивило в отдельных
случаях. От кода же зависит, бывают перекосы в разные стороны. - SciFi(29.06.2026 20:45)
- ...и это только межмодульные вызовы, только то что компилятор
постиснялся заинлайнить? Звездёж! - Cкpипaч(29.06.2026 20:48)
- Суть в том, что компилятор как бы видит все исходные файлы
одновременно и может, например, посчитать на этапе компиляции
выражения, содержащие переменные и вызовы функций из разных файлов.
Там много возможностей открывается. Ну и в дизассемблере потом всё
перепутано, отлаживать почти невозможно. - SciFi(29.06.2026 20:56)
- Отлаживать почти невозможно, тихо повторило эхо. - Cкpипaч(29.06.2026 22:16)
- Суть в том, что компилятор как бы видит все исходные файлы
одновременно и может, например, посчитать на этапе компиляции
выражения, содержащие переменные и вызовы функций из разных файлов.
Там много возможностей открывается. Ну и в дизассемблере потом всё
перепутано, отлаживать почти невозможно. - SciFi(29.06.2026 20:56)
- ...и это только межмодульные вызовы, только то что компилятор
постиснялся заинлайнить? Звездёж! - Cкpипaч(29.06.2026 20:48)
- И в режиме LTO вы листнги модулей не получите (нечитаемые). Там всё
закодировано для линкера. - Zikon(29.06.2026 20:44)
- Грусть тоска. Люблю листинги. Особенно на бумаге с перфорированными
полями. Таких уже не делают... - Cкpипaч(29.06.2026 20:46)
- Да какие проблемы? Выбираешь оптимизацию -Og (для отладки) - и листинг вполне нормально читается, дизассемблер вполне себе отлаживается. Nikolay_Po(515 знак., 30.06.2026 00:21)
- Там только итоговый листинг сделать можно уже из elf файла. И там - да - хрен разберёш где какая функция - всё соптимизировано ! - Zikon(29.06.2026 20:59)
- Грусть тоска. Люблю листинги. Особенно на бумаге с перфорированными
полями. Таких уже не делают... - Cкpипaч(29.06.2026 20:46)
- Выкидывание пролога/эпилога приносит 30% экономии?! Звездёж. - Cкpипaч(29.06.2026 20:42 - 20:45)
- Сказали же - LTO это не про секции и функции. Это и так без LTO
делается. LTO это когда, код даже выкидывается, например если в
main запускаются 1-2 раза какие-то другие процедуры - то код просто
встраивается и склеивается (нет вызовов этих процедур) (но это
упрощённо). Может вообще System_Init и main склеить и код
соптимизировать сразу. И это только одна из оптимизаций. - Zikon(29.06.2026 20:40)
- Сейчас - без LTO грусть. Раньше, неиспользуемые секции выбрасывались линкером без LTO. Cкpипaч(1273 знак., 29.06.2026 17:42)
- Вы чего-то путаетесь. И без LTO, неиспользуемые секции
выбрасываются. Удавалось заставить компилятор не выбрасывать только
изменяя дефолтные настройки среды разработки. Уже более 5 лет
использую LTO во всех проектах, где работает GCC или основанные на
нём компиляторы. Не уверен, но, вроде, даже в Arduino IDE, LTE
включено по-умолчанию, хотя в первой версии среды приходилось
включать вручную, правкой файла конфигурации. - Nikolay_Po(29.06.2026 17:07)
- у меня lto в среднем 30% дает пожатия. чем больше и сложнее код
- тем больше эффект. - klen(05.07.2026 10:38)
- LTO даёт 20..30%, бывает до 50% по размеру и по скорости. А работа
с $gp - это штатное использование ABI (двоичного интерфейса
приложений) для архитектуры RISC-V, хотя для косвенной адресации
может быть использован любой другой регистр. Но именно этот
регистр, по соглашению ABI, назначен глобальным указателем - для
ускорения и уменьшения количества инструкций доступа к памяти и
периферии. Nikolay_Po(91 знак., 29.06.2026 16:58)
- Схера вдруг. На х86 - знал. Особенно на 8086. - Cкpипaч(29.06.2026 16:30)
- Потому что за относительные адреса отвечает уже сборщик, компилятор
не знает по какому адресу что будет лежать! - Zikon(29.06.2026 16:29)
- У меня в проекте, когда-то созданном на базе шаблона из MRS2,
релаксация с глобальным указателем включена. Поигрался - оказалось,
для текущего состояния проекта, лучшее значение -
-msmall-data-limit=256. Nikolay_Po(1 знак., 29.06.2026 15:16, картинка)
- выигрыш 4.6% . Это наверно самое оптимальное значение, с учетом
смещения в +-2Кб - Zikon(29.06.2026 15:34)
- Да. Главное, что эти 4.6% в узких местах, например, в циклах могут дать и 20% ускорения. Но это всего лишь вероятность. В любом случае - цена ускорения и сокращения кода - всего одна инструкция инициализации регистра $gp. Всё равно использовать его как РОН стрёмно - не будет соответствовать ABI. - Nikolay_Po(29.06.2026 17:00)
- выигрыш 4.6% . Это наверно самое оптимальное значение, с учетом
смещения в +-2Кб - Zikon(29.06.2026 15:34)
- А есть какая-то опция (или pragma) ассемблера чтобы команда LA генерировала абсолютные адреса ? - Zikon(29.06.2026 09:30)
- MRS2 - стандартные шаблоны уже поддерживают данный момент использования $gp (-Wl,--relax по умолчанию). И .sbss=.bss доступна по $gp. Ключ -msmall-data-limit влияет только на .sdata. В настройках проекта есть этот ключ в MRS2 и по умолчанию =0. Иногда в готовых проектах -msmall-data-limit=8 ( только до 64 бит переменные помещать в .sdata ) в памяти размещение сегментов .data .sdata .sbss .bss и $gp инициализируется как sdata_start + 0x0800 - Zikon(29.06.2026 07:23)
- В самых благоприятных сценариах эта оптимизация может уплотнить код
на 1..5%. В типичных сценариях речь скорее идёт о десятых долях
процента. - SciFi(1 знак., 28.06.2026 23:56, ссылка)
- Мы способны создавать еще более благоприятные условия чем ихние
самые благоприятные :) там 5% сям 5%... глядишь и мильен не нароком
в кармане нарисуетсо! Про курицу старую поговорку помнишь? - klen(29.06.2026 01:05)
- про пять старушек что ли?:) Vit(308 знак., 29.06.2026 11:57, ссылка)
- Мы способны создавать еще более благоприятные условия чем ихние
самые благоприятные :) там 5% сям 5%... глядишь и мильен не нароком
в кармане нарисуетсо! Про курицу старую поговорку помнишь? - klen(29.06.2026 01:05)
- Снимаю шляпу перед компетенциями! И всегда тебя почитываю, чтобы в
тыковке что-то отложилось. Но, будучи полным профаном, скормил
ветку болвану, у него есть сомнения. Болван блажит или не всё так
просто? - POV(1 знак., 28.06.2026 22:56, ссылка)
- дай текстом выдержку че он там ругнулся - я нигде не
зарегистрирован и не собираюсь. скорее всего у меня косяк - писать
правильно уметь не все умеют. даже если тему знают. может ругнутся
на мои пассажи про стековую и регистровую машину - тут контекст
мысли важен. все расписыать - талмуд на 300 страниц получится. Мож
книжку написать? - klen(28.06.2026 23:06)
- нене.. не подумай что я как-то негативно высказался. токмо ради
своего развития... POV(2 знак., 28.06.2026 23:16, картинка, картинка)
- Поясните пожалуйста чайнику (мне :-), почему ИИ пишет, что секции данных могут сдвинуться, так как из-за релаксации размер секций кода может (да и вообще как бы должен) уменьшиться? - pavel2000(29.06.2026 07:09)
- Интересно, как теперь отличть писанину кожанного мешка и
електричейской дуры? Наверно по орфографическим ошибкам. Пргресс ии
впечатляет. Скоро на свалку пойдем, органику доедать. - klen(29.06.2026 01:01)
- Ты смотри, он тебе оценку дал! Nikolay_Po(1 знак., 29.06.2026 09:56, картинка)
- нене.. не подумай что я как-то негативно высказался. токмо ради
своего развития... POV(2 знак., 28.06.2026 23:16, картинка, картинка)
- дай текстом выдержку че он там ругнулся - я нигде не
зарегистрирован и не собираюсь. скорее всего у меня косяк - писать
правильно уметь не все умеют. даже если тему знают. может ругнутся
на мои пассажи про стековую и регистровую машину - тут контекст
мысли важен. все расписыать - талмуд на 300 страниц получится. Мож
книжку написать? - klen(28.06.2026 23:06)
- Тащ Клен! Ты вовремя. Как раз хотел спросить насчёт GP, есть ли
нюансы. Нет ли директивы для GCC, чтобы при входе в блок кода,
указать ему: А тут gp у нас другой! Исполняй! Nikolay_Po(500 знак., 28.06.2026 19:07)
- про s0/fp не скажу - нужно компилять тестовые коды и смотреть асм на выходе. изучать. - klen(28.06.2026 21:45)
- Дык, он-жэ написал, что можно располагать данные в спецсекции, с
помощью аттрибута и менять ГП. - mse homjak(28.06.2026 21:34)
- да! и делать это о-о-о-очень аккуратно! чтоб не потерять $gp
вызывающего кода иначе он рухнет. поэтому ОС и ОС подобные либы,
код с ипользованием longjump/setjump прочей подобной ересью
необходимо собирать ключами -msmall-data-limit=0, -Wl,--no-relax, c обязательным контролем
асма на предмет использования $gp - klen(28.06.2026 21:43)
- Кстате, меня терзанули смутные сомненья нащщот gp в листинге.
Открыл и вотонооно! Это обычный прожэкт в МРС-1, я к этому никаких
усилий не прилагал. Однако-ж: mse homjak(360 знак., 28.06.2026 22:03)
- это не все, скрип линкера важное звено - в нем определяется на
этапе линковки чем будет по жизни фраза "la gp, __global_pointer$", кто то должен был написать в crt код с этой фразой, скрипт линкера
и дать ключ --relax - поэтому неавтоматически, компиллер этого сам
не сделает. Похоже вы взяли готовый шаблон MRS проекта где это
настроено за вас. в посте я расписал как это сделать с нуля. - klen(28.06.2026 22:54)
- Ну да, готовый шаблон для V303. - mse homjak(28.06.2026 23:35)
- это не все, скрип линкера важное звено - в нем определяется на
этапе линковки чем будет по жизни фраза "la gp, __global_pointer$", кто то должен был написать в crt код с этой фразой, скрипт линкера
и дать ключ --relax - поэтому неавтоматически, компиллер этого сам
не сделает. Похоже вы взяли готовый шаблон MRS проекта где это
настроено за вас. в посте я расписал как это сделать с нуля. - klen(28.06.2026 22:54)
- Кстате, меня терзанули смутные сомненья нащщот gp в листинге.
Открыл и вотонооно! Это обычный прожэкт в МРС-1, я к этому никаких
усилий не прилагал. Однако-ж: mse homjak(360 знак., 28.06.2026 22:03)
- да! и делать это о-о-о-очень аккуратно! чтоб не потерять $gp
вызывающего кода иначе он рухнет. поэтому ОС и ОС подобные либы,
код с ипользованием longjump/setjump прочей подобной ересью
необходимо собирать ключами -msmall-data-limit=0, -Wl,--no-relax, c обязательным контролем
асма на предмет использования $gp - klen(28.06.2026 21:43)
- Тут мне не понятно зачем понадобилось создавать свой сегмент данных
для своих переменных, почему не положить их принудительно в уже
имеющиеся через __attribute__((section(".sdata"))) или .sbss Тогда
не потребуется править скрипт линкера, подойдет стандартный. - AlexBi(30.06.2026 09:57)

