-
- насчет включения тактирования встречал, кажись где-то в HAL, перечитывание. я вместо того барьер __DSB(); ставил. там вроде как и кэширование, и проклокивание по шинам, а при обращении до фактического включения тактирования можно глупостей словить. как-то так. возможно оно. - Vit(21.01.2025 10:13)
- Статья для подобных извращенцев, правда по RISK-V Andreas(1 знак., 21.01.2025 09:51, ссылка)
- Вероятно, выравнивание кода играет рояль. Изменение сдвигает код,
выравнивание меняется. - SciFi(20.01.2025 23:01)
- А как выровнять? Пробую #pragma pack(push,2/*4,8,16*/) не помогает - IBAH(20.01.2025 23:21)
- А смысл? Медленность флеша где-нибудь вылезет так или иначе. Если
хочется стабильности, то можно прибить гвоздями, накодив на асме и
прописав фиксированные адреса. - SciFi(21.01.2025 08:23)
- Как оказалось "прибить гвоздями" в Си не так просто. По
фиксированному адресу просто, директива #pragma location или @. А
прибить по относительному адресу - заморочка. Нужно создать новый
сегмент прописать ему нужное размещение, а в атрибутах функции
указать что пихать в этот сегмент. В асме проще там сразу готовая
директива. Решил проще, каждая функция в отдельном файле. - IBAH(21.01.2025 15:39)
- Самый интересный вопрос - зачем прибивать? - SciFi(21.01.2025 15:44)
- Перфекционизьм..., а точнее "надо делать хорошо, гавно получится
само". - IBAH(21.01.2025 15:54)
- Лайфхак: снижайте тактовую частоту, включайте zero wait states.
Будет прибито гвоздями! - SciFi(21.01.2025 15:58)
- Может __ramfunc поможет, никаких zero wait states? - Chum_A(21.01.2025 19:15)
- Поможет медитация и просветление, ибо проблема не в технике, а в
голове :-) - SciFi(21.01.2025 21:17)
- Голова — предмет тёмный и исследованию не подлежит... - mse homjak(21.01.2025 23:09)
- Пробовал, но это не наш метод - IBAH(21.01.2025 19:31)
- Поможет медитация и просветление, ибо проблема не в технике, а в
голове :-) - SciFi(21.01.2025 21:17)
- Может __ramfunc поможет, никаких zero wait states? - Chum_A(21.01.2025 19:15)
- Лайфхак: снижайте тактовую частоту, включайте zero wait states.
Будет прибито гвоздями! - SciFi(21.01.2025 15:58)
- Перфекционизьм..., а точнее "надо делать хорошо, гавно получится
само". - IBAH(21.01.2025 15:54)
- Самый интересный вопрос - зачем прибивать? - SciFi(21.01.2025 15:44)
- Как оказалось "прибить гвоздями" в Си не так просто. По
фиксированному адресу просто, директива #pragma location или @. А
прибить по относительному адресу - заморочка. Нужно создать новый
сегмент прописать ему нужное размещение, а в атрибутах функции
указать что пихать в этот сегмент. В асме проще там сразу готовая
директива. Решил проще, каждая функция в отдельном файле. - IBAH(21.01.2025 15:39)
- Эта прагма не для кода. "Specifies the packing alignment for
structure, union, and class members." reZident(1 знак., 20.01.2025 23:29, ссылка)
- Это я уже понял... Как код выровнять? - IBAH(20.01.2025 23:38)
- Я не программист и не понимаю, как вообще код (не данные!) может быть невыровненным для исполнения его АЛУ микроконтроллера? По-моему вы не
там копаете. - reZident(20.01.2025 23:42)
- Всё там. Вы забываете, что код не исполняется напрямую из FLASH, а
читается в кэш из более широкой шины памяти. Флеш медленнее
процессора. И, чтобы не тормозить выполнение кода, за раз читается
кратно больше бит, чем занимает одна команда процессора. Таким
образом, скорость линейной подачи команд достаточна для выполнения
процессором на полной скорости. Nikolay_Po(63 знак., 20.01.2025 23:52)
- В корневом сообщении написано Cortex-M0 и тактовая 32МГц. Какой еще
кэш при таких условиях? - reZident(21.01.2025 01:42)
- Флеш до 24МГц, обычно. И 128 или 256 бит шириной. В любом случае,
пусть хоть и одна строка, но кэш (как его ни называй) есть. И
ожидание после смены адреса из-за латентности флеш есть. И одно
дело, когда ногодрыг помещается в одну строку "кэша", другое -
когда не помещается. И постоянно требуется переход на другую строку
флеш с ожиданием данных. - Nikolay_Po(21.01.2025 09:48)
- Ну ОК. Я почему-то думал, что при частотах для которых разработано
ядро Cortex-M0 при любой флеш-памяти будет 0_wait_state и кеш там в
лучшем (или худшем?) случае одноуровневый на ширину одной
"слово-команды". В конце концов это же не какой-нибудь Cortex-A53 с
частотой 1ГГц. - reZident(21.01.2025 11:10)
- Для примера, LPC4370 сделали в 2012 году (вроде бы). Там два
вспомогательных CM0 с рабочей частотой 204 МГц. Правда, там флеша
нет совсем. - SciFi(21.01.2025 11:20)
- Дык я не спорю. Когда-то отложилось в голове, что M0 это малопотребляющее "медленное" ядро и дальше я не углублялся. - reZident(21.01.2025 11:27)
- А RP2040 у меня вчера завелся на 300 МГц. - Гyдвин(21.01.2025 11:23)
- Разгон? По пачпорту вот что обещают: SciFi(1 знак., 21.01.2025 11:30, картинка)
- Ой там разгон - 7%. - Kpoк(21.01.2025 17:12)
- Просто в дурине ткнул вот сюда, оно и завелось в двух ядрах ;) Гyдвин(1 знак., 21.01.2025 11:41, картинка)
- Разгон? По пачпорту вот что обещают: SciFi(1 знак., 21.01.2025 11:30, картинка)
- Для примера, LPC4370 сделали в 2012 году (вроде бы). Там два
вспомогательных CM0 с рабочей частотой 204 МГц. Правда, там флеша
нет совсем. - SciFi(21.01.2025 11:20)
- Там в мануале на несколько страниц расписано. Ширина 32 разряда, есть предвыборка, которая может на несколько процентов улучшить дристоны. SciFi(1 знак., 21.01.2025 10:11, картинка)
- Ну ОК. Я почему-то думал, что при частотах для которых разработано
ядро Cortex-M0 при любой флеш-памяти будет 0_wait_state и кеш там в
лучшем (или худшем?) случае одноуровневый на ширину одной
"слово-команды". В конце концов это же не какой-нибудь Cortex-A53 с
частотой 1ГГц. - reZident(21.01.2025 11:10)
- В даташыте сказано, что там 32-разрядные слова. А многие инструкции процессора 16-разрядные. Так что вот так вот, эффекты от выравнивания возможны, коли есть wait states. - SciFi(21.01.2025 08:12)
- Флеш до 24МГц, обычно. И 128 или 256 бит шириной. В любом случае,
пусть хоть и одна строка, но кэш (как его ни называй) есть. И
ожидание после смены адреса из-за латентности флеш есть. И одно
дело, когда ногодрыг помещается в одну строку "кэша", другое -
когда не помещается. И постоянно требуется переход на другую строку
флеш с ожиданием данных. - Nikolay_Po(21.01.2025 09:48)
- В корневом сообщении написано Cortex-M0 и тактовая 32МГц. Какой еще
кэш при таких условиях? - reZident(21.01.2025 01:42)
- Всё там. Вы забываете, что код не исполняется напрямую из FLASH, а
читается в кэш из более широкой шины памяти. Флеш медленнее
процессора. И, чтобы не тормозить выполнение кода, за раз читается
кратно больше бит, чем занимает одна команда процессора. Таким
образом, скорость линейной подачи команд достаточна для выполнения
процессором на полной скорости. Nikolay_Po(63 знак., 20.01.2025 23:52)
- Я не программист и не понимаю, как вообще код (не данные!) может быть невыровненным для исполнения его АЛУ микроконтроллера? По-моему вы не
там копаете. - reZident(20.01.2025 23:42)
- Это я уже понял... Как код выровнять? - IBAH(20.01.2025 23:38)
- А смысл? Медленность флеша где-нибудь вылезет так или иначе. Если
хочется стабильности, то можно прибить гвоздями, накодив на асме и
прописав фиксированные адреса. - SciFi(21.01.2025 08:23)
- Спасибо, от сердца отлегло.. попробовал начать функцию с __NOP(). Эффект стал предсказуемым. - IBAH(20.01.2025 23:12)
- 100% - Nikolay_Po(20.01.2025 23:05)
- IAR не способен автоматом выравнивать с предупреждением как это
делают иные компиляторы? - enc(20.01.2025 23:29)
- Не знаю. Данные все компиляторы выравнивают. А код - какое им дело, если это не ломает работу программы. Да, влияет на скорость чтения при ветвлении, но это слишком тонкий эффект, чтобы ожидать его учёта от компилятора. Посмотрите, нет ли у вашего компилятора возможности применить к функции атрибут типа ((__aligned__)) как в GCC? - Nikolay_Po(20.01.2025 23:48)
- IAR не способен автоматом выравнивать с предупреждением как это
делают иные компиляторы? - enc(20.01.2025 23:29)
- А как выровнять? Пробую #pragma pack(push,2/*4,8,16*/) не помогает - IBAH(20.01.2025 23:21)