Комментарии 11
В PFIC всего 3 бита приоритетов прививаний (кроме QingKeV4A, где их 4, но семейств CH32V это не касается).
Кстати, либо я что то не понимаю, либо все проекты из MountRiver для CH32V3xx по умолчанию не используют при компиляции FPU
Речь идет о примерах от WCH? Так-то никто не запрещает указать архитектуру -march=rv32imafc_zicsr
и пользоваться FPU в свое удовольствие.
__attribute__((interrupt("WCH-Interrupt-fast")))
Здесь стоило уточнить, что это нестандартное расширение от wch, обычный gcc его не поддерживает. Есть несколько костылей вроде вот такого:
void TIM3_IRQHandler(void) __attribute__((naked)); //Это чтобы не компилятор не сохранял контекста и не делал обычного возврата
void TIM3_IRQHandler( void ) //Это чтобы сохранить регистры s0 и s1, если они используются в вызываемом коде и чтобы сделать подходящий возврат mret вместо ret
{
__asm volatile ("call TIM3_IRQHandler_Real; mret"); //Вызов naked-кода для обработки и возврат из прерывания
}
void TIM3_IRQHandler_Real( void )
{
/* Interrupt handler that works with upstream GCC */
}
Но тоже не идеально. Скажем, с FPU это вообще не работает.
Контроллер прерываний PFIC
Стоило указать еще одну забавную особенность местного контроллера прерываний. Он может работать аж в трех режимах: общий обработчик на все прерывания, таблица адресов и таблица переходов. В первом варианте программист вручную должен проверять mcause
чтобы узнать какое именно прерывание возникло. Во втором используется таблица, заполненная адресами обработчиков. И в третьем - таблица, заполненная командами переходов.
Зачем это сделано - без понятия.
Речь идет о примерах от WCH? Так-то никто не запрещает указать архитектуру
-march=rv32imafc_zicsr
и пользоваться FPU в свое удовольствие
Я пишу про работу из под IDE. Обычно, если производитель дает примеры под тот же чистый Eclipse, не говоры уже про IAR и Keil, в настройках проекта делается вся конфигурация. Тут, для CH32V3XX даже в примере с названием FPU, собственно FPU не настроен. Из встроенного в MoutRiver генератора проектов под CH32V3 тоже не включается FPU. Так что я исключительно про экосистему WCH.
Не знаю как там у вас в IDE, но флаги-то компилятора где-то задать можно. Возможно, сложнее, чем руками в makefile, но мало ли, в настройках проекта...
даже в примере с названием FPU, собственно FPU не настроен.
А чего его настраивать? В смысле что в нем вообще поддается настройке? Единственное, что вспоминается - настройки округления. Которые почти никогда не нужны.
Если интересно, про дробные числа в v303 я когда-то писал.
Так что я исключительно про экосистему WCH.
"экосистема wch" это в первую очередь сами контроллеры. В вашем случае v307. Он прекрасно поддерживает FPU. И все, что требуется от программиста - указать компилятору архитектуру IMAFC. Не удивлюсь, если в примерах от производителя она и так указана.
У нас разные представления об экосистемах:)
rv32imafc_zicsr
в ide она выбирается в выпадающем списке, так что надо будет как то исхитрятся.
а еще эту штуку надо указывать для внешних компиляторов xpack

В IDE это выглядит в духе конструктора "собери сам". Не очень понятно кто такой RVXW.
Кстати, либо я что то не понимаю, либо все проекты из MounRiver для CH32V3xx по умолчанию не используют при компиляции FPU. В стартапе, для CH32V3xx FPU всегда включается, а в настройках TragetProcessor проекта по умолчанию - нет...
Это же вроде норма. Например в IAR в подавляющем большинстве примеров для чипов на Cortex M4 тоже FPU по умолчанию отключен.
Еще незнаю, особенность это IDE для WCH или чего то еще, то если в проект для CH32V2 притянуть библиотеку math.h, то в проект линкуется вся библиотека целиком, а не только используемые функции. С ходу плюс примерно 15 кб флеша. Со string так же.
Ну да, сам дурак, слишком долго жил в мире розовых пони и CubeIDE:) Счас проверил как перетаскивал проект на Geehy F405, таки да, в примерах под Eclipse у них FPU выключен. Просто раз WCH запилили свой IDE на Eclipse, то логично хотя бы в примере, который называется FPU, врубить этот самый FPU в настройках проекта:)
Еще незнаю, особенность это IDE для WCH или чего то еще, то если в проект для CH32V2 притянуть библиотеку math.h, то в проект линкуется вся библиотека целиком, а не только используемые функции. С ходу плюс примерно 15 кб флеша. Со string так же.
Рискну предположить что это про GCC. Я все проекты MoutRiver собираю на оптимизации -Оs. Начинал с портирования рабочего проекта с ST32F103R. Без оптимизации вообще не лезет в CH32V203R (FreeRTOS + CanOpenNode). Прям катастрофический. C оптимизацией примерно тоже самое по размеру что и STM-й код (собранный на -O2) и разница где-то 15-20КБ. Глянул на текущие .lst файлы, вроде как ничего лишнего из библиотек нет ни на V203, ни на V307.
СH32V307 и о переходе на QingKeV4 от WCH. Контроллер прерываний PFIC