Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: STM32 новичку в ARM что к чему

Вт янв 17, 2023 19:13:08

VladislavS писал(а):Как бы вы не пытались переврать
Никак не пытаюсь переврать, разумеется. Или для вас перевирать слова собеседника - норма, которой вы ожидаете и от других?
VladislavS писал(а):Отлаживать через WCH-Link совершенно нормально. Прошивать через WCH-Link, USB или UART - более чем нормально. Все ваши нечеловеческие страдания по этому поводу это какая-то нездоровая фобия.
А через все остальные программаторы, видимо, не норма. Интересные у вас представления...
Еще и какие-то нечеловеческие страдания нафантазировали.
VladislavS писал(а):Скачать на официальном сайте и запустить даблкликом не судьба? Это выше ваших способностей?

Это у вас, виндузятников, принято скачивать все подряд, запускать под админскими правами, а потом лечиться от вирусов.
VladislavS писал(а):Работает как автомат калашникова

Вам видео снять как он три раза подряд падает с ошибкой, а потом показывает кнопки поверх окна?
VladislavS писал(а):Опять таки, я не виноват, что вы не можете уследить за контекстом беседы. Могу, разве что, посоветовать перечитывать по несколько раз.
Не перекладывайте свои проблемы на меня. Сколько бы раз я не прочитал написанное или нарисованное, мне неоткуда узнать что же вы при этом подразумевали.
Типичный сценарий: человек выкладывает картинку или цитату, якобы относящуюся к теме. Оппонент, исходя из своего контекста, что-то по ней отвечает. Первый возмущается, что его неправильно поняли, и он имел в виду вовсе не то, что написал, а что-то другое. И, если бы залезть к нему в голову, воспроизвести его логику, оно может и будет похоже. А если воспользоваться другой начальной информацией - будет похоже на что-то другое.
Именно поэтому, глядя на рандомную картинку, я отказываюсь как-то ее комментировать. Мне неизвестно, что вы хотели ей сказать.
VladislavS писал(а):Зашибись, просто не вызовется прерывание. Это называется "всё работает"? А теперь усложним задачу - не прерывание, а немаскируемое исключение. Вызовется и таки все сломает.

Вы бы хоть проверили сначала, прежде чем чушь нести.
Его, видите ли, удивляет, что если у прерываний не настроена вложенность, то они не будут прерывать друг друга. Вот ведь неожиданность, правда, VladislavS?
VladislavS писал(а):Интересно получается. Я показал код, который как раз эти "некие манипуляции" делает. У вас он вызвал вопрос "какой-то странный код".

А теперь вспоминаем контекст, в котором этот код был приведен: вы пытались показать насколько в ch32 прерывания реализованы лучше, чем в gd32. Ни о какой вложенности речи не шло.
Да и сам ваш код, со всеми этими шаблонами, отнюдь не образец читаемости. Собственно, если уж хочется использовать вложенные прерывания, то работу с CSR'ами было бы логично вынести в функцию. Одну в начале прерывания, вторую в конце.
VladislavS писал(а):И после этого именно я не читал документацию? Ну совесть то поимейте.

Можно подумать, это я не знаю, что чтобы срабатывали вложенные прерывания, надо как минимум выставить MIE. Иначе говоря, в моем примере все будет работать именно так, как и должно: во время выполнения одного прерывания все остальные ждут.
А если вы хотели сказать, что в моем примере не поддерживаются вложенные прерывания, так это и надо было сказать, а не кидаться рандомными картинками в надежде что я угадаю что же вам показалось неправильным. Как видите, правильно сделал, что не стал гадать.
VladislavS писал(а):1. Стек сломается при вложенных прерываниях.

Знаете, мне уже надоело это пустословие. То одно у вас сломается, то другое. Почему у меня-то не ломается?!
VladislavS писал(а):2. Для быстрого сохранения контекста в ядре есть регистры pushmcause, pushmepc и pushmsubm.

Напоминаю: это тестовый код. Если бы я хотел использовать его в рабочем режиме, то наверное воспользовался бы упомянутыми вами регистрами, да и вообще причесал все это и оформил в виде отдельных функций. Но такой задачи у меня не стояло.
VladislavS писал(а):3. Зачем целых три регистра временных задействовано? Можно одним обойтись - меньше в стек лазить.

Это в любом случае сохраняемые регистры, их так и так на стек класть. А читать три CSR и по очереди класть их на стек через общий регистр было бы дольше.
VladislavS писал(а):4. Зачем по несколько раз регистры в стек кочуют? В начале сохранил, в конце восстановил.

Где? Сначала сохранил t0, t1, a0, ra, потом mepc, mcause и msubm. Выполнил код обработчика. Восстановил в обратном порядке. Можно было, конечно, за один push сохранить 7 регистров, половину рабочих, половину под CSR'ы, но на стек как-то надежнее.
Или вы на pushmcause намекаете?
VladislavS писал(а):Ну надо, же как интересно :) В других контроллерах приоритетных прерываний не бывает?

А в других бывает другой механизм. Те же ARM'ы сами сохраняют регистры на стек. И мне такой подход нравится больше: обработчик прерывания ничем не отличается от обычной функции.
VladislavS писал(а):При вызове обработчика глобальные прерывания автоматически запрещаются. После того как сохранён контекст прерывания разрешаются либо руками в векторном режиме, либо автоматически в момент перехода на реальный обработчик по команде "csrrw ra, CSR_JALMNXTI, ra".
Ну ок. Правда, не уверен зачем вы это здесь написали: для полноценной реализации приоритетного обработчика этого недостаточно, так и так придется лезть в документацию.
В любом случае ни приоритетные прерывания, ни не-векторный режим меня сейчас не интересуют.

Re: STM32 новичку в ARM что к чему

Вт янв 17, 2023 19:33:17

Это у вас, виндузятников
Уууу, да вы обычное хамло? А я тут обучаю, кодревью провожу забесплатно...

Re: STM32 новичку в ARM что к чему

Вт янв 17, 2023 19:45:21

Ох и зафлудили тему не по теме, а.. Вычистить тут надо весь мусор...
Создайте отдельную тему и обсуждайте там всё, что отличается от названия ЭТОЙ темы.

Re: STM32 новичку в ARM что к чему

Вт янв 17, 2023 21:35:24

Это у вас, виндузятников
Уууу, да вы обычное хамло? А я тут обучаю, кодревью провожу забесплатно...

Какой еще кодревью?! Не льстите себе, фразы "код сломается", "стек сломается" ничего общего с ревью не имеет.
Впрочем, все все понимают: вы осознали, что все обвинения в мой адрес оказались оказались неверными, и вы пытаетесь сохранить лицо.

Re: STM32 новичку в ARM что к чему

Вт янв 17, 2023 23:18:08

СпойлерНу вот, в добавок к хамству ещё и переход на личности. И отучайтесь говорить за других и тем более за всех.


Пожалуй, позволю себе прокомментировать ещё один опус, только потому что он плюcов касается.
А теперь вспоминаем контекст, в котором этот код был приведен: вы пытались показать насколько в ch32 прерывания реализованы лучше, чем в gd32. Ни о какой вложенности речи не шло.
Мои примеры для обоих контроллеров поддерживают вложенные прерывания. Контрпример, где всё с виду так же просто, как раз таки их не поддерживал и аналогом не являлся. А тот что поддерживал, неожиданно, такой же сложный оказался...
Да и сам ваш код, со всеми этими шаблонами, отнюдь не образец читаемости. Собственно, если уж хочется использовать вложенные прерывания, то работу с CSR'ами было бы логично вынести в функцию. Одну в начале прерывания, вторую в конце.
Ну и собственно причём тут плюсы. Обсуждаемый тут контроллер не сохраняет аппаратно контекст при входе в прерывание. Это значит, что при работе в векторном режиме в каждом прерывании надо выполнить один и тот же код по сохранению контекста, выполнению полезного кода и восстановлению контекста. И так столько раз, сколько прерываний. Каждый раз один и тот же код, за исключением полезного действия. В плюсах для таких случаев есть шаблоны. Пишем всё это один раз в шаблонную функцию, параметром которой будет обычная функция. Теперь, обработчик прерывания пишется почти так же как на Cortex-M. Компилятор сам обернёт её всем необходимым, мы ничего не забудем и нигде не ошибёмся. Что там кому плохо читается меня вообще не волнует. Я понимаю, компилятор понимает, код эффективный. Совет "вынести работу с CSR'ами в функции" совершенно безграмотный. Во-первых, код шаблонной функции пишется один раз. Нет никакого смысла выделять фрагменты кода в функции, так как они больше нигде не используются. Во-вторых, оформлять в функцию код сохранения контекста в прерывании, где каждый такт на учёте? И молиться что она заинлайнится? Извините, без меня.

Re: STM32 новичку в ARM что к чему

Вт янв 17, 2023 23:26:50

Вы бы правда завели себе отдельную тему, а то все-таки ваши risc-v тут вообще не в тему…
Что до заданного мною недавно вопроса, прошерстил я документацию на сайте st, но ничего так и не нашел. Нет, к сожалению, руководства по миграции с F0 на F3. А еще, поверхностно почитав о миграции между F303 и F302, я так и не понял, на кой черт нужно было F302 выделять в отдельную линейку, если они по сути ничем от F303 не отличаются, кроме незначительных вещей. У тех же F103 намного больше различий между моделями с разной density.

Re: STM32 новичку в ARM что к чему

Ср янв 18, 2023 09:00:45

Нет, к сожалению, руководства по миграции с F0 на F3.
Не совмем понятно что тебе нужно. Создаёшь новый проект, пишешь заново инициализацию, перетаскиваешь код. Благо много железа одинакового, а остальное похоже. Что конкретно трудности вызвало?

Re: STM32 новичку в ARM что к чему

Ср янв 18, 2023 11:03:23

Мои примеры для обоих контроллеров поддерживают вложенные прерывания. Контрпример, где всё с виду так же просто, как раз таки их не поддерживал и аналогом не являлся. А тот что поддерживал, неожиданно, такой же сложный оказался...

Ну разумеется, пример простейшего обработчика не поддерживает вложенной обработки. На то он и простейший.
Nuclei::push_mcause(0);
Nuclei::push_mepc(1);
Nuclei::push_msubm(2);

Кстати, если эти функции в вашем коде выполняются за 2 такта, то разница в скорости по сравнению с моим - получается что-то вроде
Код:
addi sp, sp, -4
csrrwi zero, PUSHMCAUSE, 1
addi sp, sp, -4
csrrwi zero, PUSHMEPC, 1
addi sp, sp, -4
csrrwi zero, PUSHMSUBM, 1
addi sp, sp, -(4*4)
sw t0, 12(sp)
sw t1, 8(sp)
sw a0, 4(sp)
sw ra, 0(sp)

против моего
Код:
addi sp, sp, -(4*4)
sw t0, 12(sp)
sw t1, 8(sp)
sw a0, 4(sp)
sw ra, 0(sp)
csrr t0, mepc
csrr t1, mcause
csrr a0, msubm
addi sp, sp, -(4*3)
sw t0, 12(sp)
sw t1, 8(sp)
sw a0, 4(sp)

11 тактов вместо 12. Ыкономия!
Что еще забавнее, у вас на С++ код получился длиннее, чем на ассемблере. Но это так, вкусовщина.
А теперь усложним задачу - не прерывание, а немаскируемое исключение. Вызовется и таки все сломает.

Чуть не забыл. Может, кто-то знает, как вообще немаскируемое прерывание вызвать? Я нашел только, что должно вызываться по сбою кварца, но не проверял.
VladislavS писал(а):Совет "вынести работу с CSR'ами в функции" совершенно безграмотный.

Можете предложить вариант лучше? На Си или ассемблере, естественно.
VladislavS писал(а): Во-вторых, оформлять в функцию код сохранения контекста в прерывании, где каждый такт на учёте? И молиться что она заинлайнится?

С макрофункциями месье не знаком?
VladislavS писал(а):Уууу, да вы обычное хамло? Ну вот, в добавок к хамству ещё и переход на личности.

И да, хамло как раз вы. Голословно обвиняете меня в неумении читать документацию, что код сломается и фиг знает в чем еще. Да-да, переход на личности это тоже про вас, а не про меня.

Re: STM32 новичку в ARM что к чему

Ср янв 18, 2023 11:29:00

Кстати, если эти функции в вашем коде выполняются за 2 такта, то разница в скорости по сравнению с моим - получается что-то вроде
Код:
addi sp, sp, -4
csrrwi zero, PUSHMCAUSE, 1
addi sp, sp, -4
csrrwi zero, PUSHMEPC, 1
addi sp, sp, -4
csrrwi zero, PUSHMSUBM, 1
Какой ужас! :cry:

Код:
riscv::StackMove(-12);
Nuclei::push_mcause(0);
Nuclei::push_mepc(1);
Nuclei::push_msubm(2);

addi sp,sp,-12
csrwi pushmcause,0
csrwi pushmepc,1
csrwi pushmsubm,2
Последний раз редактировалось VladislavS Ср янв 18, 2023 12:07:10, всего редактировалось 1 раз.

Re: STM32 новичку в ARM что к чему

Ср янв 18, 2023 11:29:47

VladislavS, пока еще ничего трудности не вызывает, просто хотел по-диагонали на различия глянуть (т.к. по тому же I2C в migration guide с F1 на F3 было сказано, что у F303 I2C вообще супер-пупер и чуть ли не сам все делает). Ну, да ладно, буду читать в мануале.

Re: STM32 новичку в ARM что к чему

Ср янв 18, 2023 11:39:59

просто хотел по-диагонали на различия глянуть
Да в принципе, контроллеры одного поколения, периферия очень похожа. Разное тактирование, но это при инициализации один раз настраивается.

Re: STM32 новичку в ARM что к чему

Ср янв 18, 2023 12:00:25

VladislavS, значит, обдурили, сволочи…
Потому что в F0 I2C сильно говнистый: до того, как отправить данные по DMA (или считать их), нужно с бубном поплясать с отсылкой адреса и количества байт данных, да выставить ACK… Надеялся, что в F303 ничего этого делать не нужно будет (установил адрес и длину, да запустил передачу по DMA).
Хотя, если в самых свежих G0 такая же портянка, чего ждать? Не хотят они красивый I2C сделать.
Кстати, судя по документации, с буфером для CAN и USB у 303 все зависит от количества ног: у "младшеньких" все похоже на F0x2 (где 256Б буфера для CAN лежат в конце USB'шного буфера), а у "старшеньких" под CAN выделен отдельный буфер аж в 512Б. То бишь для написания универсальных модулей работы с USB/CAN придется условную компиляцию на макросах втыкать - в зависимости от модели.
Вот и возмущаюсь: если уж в пределах одной линейки F303 такие различия, то на кой черт выделяли еще отдельно F302?

Re: STM32 новичку в ARM что к чему

Ср янв 18, 2023 12:35:48

У F302, как минимум, CCM-RAM нет. А это уже серьёзное отличие.

Re: STM32 новичку в ARM что к чему

Ср янв 18, 2023 12:41:28

VladislavS, для меня это - не отличие, я ею не пользуюсь.

Re: STM32 новичку в ARM что к чему

Ср янв 18, 2023 12:43:36

Боюсь спросить, разработчика из STM сколько раз вам звонили с вопросом что вам нужно в чипе? :)))

Re: STM32 новичку в ARM что к чему

Пт янв 20, 2023 11:00:24

Помнится, я сетовал, что не могу найти сводную таблицу по USB на чипах STM32. Сейчас тащил документацию по F303 и наткнулся в толпе апноутов на AN4879: "USB hardware and PCB guidelines using STM32 MCUs". Здесь собрано все нужное: и размеры буферов, и делятся они с CAN или нет, и встроенная подтяжка DP (оказывается, ST - те еще сволочи, подтяжка мало где есть), да и, как оказалось, без кварца USB есть лишь на F0x2 и некоторых H7 — вот такой маразм.
А для любителей OTG HS, оказывается, лишь в F7x3 есть встроенный PHY.
Не дружит ST c USB…

Re: STM32 новичку в ARM что к чему

Пт янв 20, 2023 11:27:44

Помнится, я сетовал, что не могу найти сводную таблицу по USB на чипах STM32. Сейчас тащил документацию по F303 и наткнулся в толпе апноутов на AN4879: "USB hardware and PCB guidelines using STM32 MCUs". Здесь собрано все нужное: и размеры буферов, и делятся они с CAN или нет, и встроенная подтяжка DP

Спасибо, полезный документ
(оказывается, ST - те еще сволочи, подтяжка мало где есть),

То ли я как-то неправильно читаю, то ли еще что, но по таблице проще перечислить камни, в которых подтяжки НЕТ: F102, F103 и все F3. Даже в F105/107 подтяжка встроена.
А с другой стороны - даже если, как в F103 подтяжки нет, можно подумать, такая проблема запаять лишний резистор. Под него даже ногу выделять не надо.
да и, как оказалось, без кварца USB есть лишь на F0x2 и некоторых H7 — вот такой маразм.

Что значит "USB без кварца"? Разве не в любых камнях его можно от HSI->PLL запустить? В F103 и L151 точно можно...
Или вы про host-mode, HS и тому подобное?

Re: STM32 новичку в ARM что к чему

Пт янв 20, 2023 11:54:32

Я про обычное устройство, зачем может понадобиться хост на микроконтроллере?
Везде пишут, что при работе от HSI (кроме F0x2, где по SOF возможна синхронизация), не гарантируется нормальное функционирование USB... Сам не проверял, можно будет глянуть, что там на F303 будет, если от HSI PLL запитать.
А подтяжку на постоянку нельзя: при отладке придется вечно туда-сюда провод тыкать. Я даже на "синих таблетках" впаиваю управляемую подтяжку (благо, это легко), писал об этом у себя в ЖЖ. На "таблетках" у меня подтяжка тупо от ноги GPIO питается, а вот в устройства я уже транзистор леплю на всякий пожарный.

Re: STM32 новичку в ARM что к чему

Пт янв 20, 2023 12:02:03

То ли я как-то неправильно читаю, то ли еще что, но по таблице проще перечислить камни, в которых подтяжки НЕТ: F102, F103 и все F3. Даже в F105/107 подтяжка встроена.

Там ещё и не все серии указаны, нет G0/G4/L5/U5 где подтяжка естественно есть.

Добавлено after 6 minutes 57 seconds:
Я про обычное устройство, зачем может понадобиться хост на микроконтроллере?

В G0 регистры USB как у F0, но добавлен десяток полей для хоста, так что даже ты свою либу наверное переделать бы смог ). Можно будет клаву подключить, например.

Re: STM32 новичку в ARM что к чему

Пт янв 20, 2023 12:09:08

G0, которые с USB, стоят как F303, а то и F407.
Ну и на кой черт они нужны? За ту же цену можно получить более мощный МК, ещё и с флоатами...
Ответить