Вт янв 17, 2023 19:13:08
Никак не пытаюсь переврать, разумеется. Или для вас перевирать слова собеседника - норма, которой вы ожидаете и от других?VladislavS писал(а):Как бы вы не пытались переврать
А через все остальные программаторы, видимо, не норма. Интересные у вас представления...VladislavS писал(а):Отлаживать через WCH-Link совершенно нормально. Прошивать через WCH-Link, USB или UART - более чем нормально. Все ваши нечеловеческие страдания по этому поводу это какая-то нездоровая фобия.
VladislavS писал(а):Скачать на официальном сайте и запустить даблкликом не судьба? Это выше ваших способностей?
VladislavS писал(а):Работает как автомат калашникова
Не перекладывайте свои проблемы на меня. Сколько бы раз я не прочитал написанное или нарисованное, мне неоткуда узнать что же вы при этом подразумевали.VladislavS писал(а):Опять таки, я не виноват, что вы не можете уследить за контекстом беседы. Могу, разве что, посоветовать перечитывать по несколько раз.
VladislavS писал(а):Зашибись, просто не вызовется прерывание. Это называется "всё работает"? А теперь усложним задачу - не прерывание, а немаскируемое исключение. Вызовется и таки все сломает.
VladislavS писал(а):Интересно получается. Я показал код, который как раз эти "некие манипуляции" делает. У вас он вызвал вопрос "какой-то странный код".
VladislavS писал(а):И после этого именно я не читал документацию? Ну совесть то поимейте.
VladislavS писал(а):1. Стек сломается при вложенных прерываниях.
VladislavS писал(а):2. Для быстрого сохранения контекста в ядре есть регистры pushmcause, pushmepc и pushmsubm.
VladislavS писал(а):3. Зачем целых три регистра временных задействовано? Можно одним обойтись - меньше в стек лазить.
VladislavS писал(а):4. Зачем по несколько раз регистры в стек кочуют? В начале сохранил, в конце восстановил.
VladislavS писал(а):Ну надо, же как интересно В других контроллерах приоритетных прерываний не бывает?
Ну ок. Правда, не уверен зачем вы это здесь написали: для полноценной реализации приоритетного обработчика этого недостаточно, так и так придется лезть в документацию.VladislavS писал(а):При вызове обработчика глобальные прерывания автоматически запрещаются. После того как сохранён контекст прерывания разрешаются либо руками в векторном режиме, либо автоматически в момент перехода на реальный обработчик по команде "csrrw ra, CSR_JALMNXTI, ra".
Вт янв 17, 2023 19:33:17
Вт янв 17, 2023 19:45:21
Вт янв 17, 2023 21:35:24
Вт янв 17, 2023 23:18:08
Мои примеры для обоих контроллеров поддерживают вложенные прерывания. Контрпример, где всё с виду так же просто, как раз таки их не поддерживал и аналогом не являлся. А тот что поддерживал, неожиданно, такой же сложный оказался...А теперь вспоминаем контекст, в котором этот код был приведен: вы пытались показать насколько в ch32 прерывания реализованы лучше, чем в gd32. Ни о какой вложенности речи не шло.
Ну и собственно причём тут плюсы. Обсуждаемый тут контроллер не сохраняет аппаратно контекст при входе в прерывание. Это значит, что при работе в векторном режиме в каждом прерывании надо выполнить один и тот же код по сохранению контекста, выполнению полезного кода и восстановлению контекста. И так столько раз, сколько прерываний. Каждый раз один и тот же код, за исключением полезного действия. В плюсах для таких случаев есть шаблоны. Пишем всё это один раз в шаблонную функцию, параметром которой будет обычная функция. Теперь, обработчик прерывания пишется почти так же как на Cortex-M. Компилятор сам обернёт её всем необходимым, мы ничего не забудем и нигде не ошибёмся. Что там кому плохо читается меня вообще не волнует. Я понимаю, компилятор понимает, код эффективный. Совет "вынести работу с CSR'ами в функции" совершенно безграмотный. Во-первых, код шаблонной функции пишется один раз. Нет никакого смысла выделять фрагменты кода в функции, так как они больше нигде не используются. Во-вторых, оформлять в функцию код сохранения контекста в прерывании, где каждый такт на учёте? И молиться что она заинлайнится? Извините, без меня.Да и сам ваш код, со всеми этими шаблонами, отнюдь не образец читаемости. Собственно, если уж хочется использовать вложенные прерывания, то работу с CSR'ами было бы логично вынести в функцию. Одну в начале прерывания, вторую в конце.
Вт янв 17, 2023 23:26:50
Ср янв 18, 2023 09:00:45
Ср янв 18, 2023 11:03:23
Nuclei::push_mcause(0);
Nuclei::push_mepc(1);
Nuclei::push_msubm(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)
VladislavS писал(а):Совет "вынести работу с CSR'ами в функции" совершенно безграмотный.
VladislavS писал(а): Во-вторых, оформлять в функцию код сохранения контекста в прерывании, где каждый такт на учёте? И молиться что она заинлайнится?
VladislavS писал(а):Уууу, да вы обычное хамло? Ну вот, в добавок к хамству ещё и переход на личности.
Ср янв 18, 2023 11:29:00
addi sp, sp, -4
csrrwi zero, PUSHMCAUSE, 1
addi sp, sp, -4
csrrwi zero, PUSHMEPC, 1
addi sp, sp, -4
csrrwi zero, PUSHMSUBM, 1
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
Ср янв 18, 2023 11:29:47
Ср янв 18, 2023 11:39:59
Ср янв 18, 2023 12:00:25
Ср янв 18, 2023 12:35:48
Ср янв 18, 2023 12:41:28
Ср янв 18, 2023 12:43:36
Пт янв 20, 2023 11:00:24
Пт янв 20, 2023 11:27:44
Пт янв 20, 2023 11:54:32
Пт янв 20, 2023 12:02:03
Пт янв 20, 2023 12:09:08