kutukvpavel
New member
Всем добрый день!
Использую в проекте UART со скоростью 1Мбод, и на такой скорости обработчик прерываний, видимо, уже не успевает отрабатывать, что выражается в пропуске байтов при приёме, если передатчик посылает больше одного за раз и без пауз между байтами.
По опыту работы с ESP32, у которых программа тоже выполняется из SPIFI, знаю, что обработчики прерываний можно поместить в ОЗУ, чтобы уменьшить время их выполнения и убрать ненужные page-fault-ы кеша SPIFI.
Только вот вопрос, как это сделать?
Поскольку просто добавление аттрибута
к функции trap_handler приводит к циклической перезагрузке. Даже с учётом последних изменений crt0.s в официальном репозитории: добавлено копирование кода из секции .ram_text в ОЗУ при старте, то есть обработчик сам должен сущестсовать по нужному адресу в ОЗУ. Мне кажется, что циклическая перезагрузка - следствие того, что безусловынй переход на trap_handler, прописанный в crt0.s, происходит не на тот адрес. Но вот что нужно сделать, чтобы это исправить - пока не знаю.
P.S. Что касается UART, то знаю, что по-хорошему надо использовать DMA при таких скоростях, но всё-таки хочу попробовать ускорить работу прерываний.
Использую в проекте UART со скоростью 1Мбод, и на такой скорости обработчик прерываний, видимо, уже не успевает отрабатывать, что выражается в пропуске байтов при приёме, если передатчик посылает больше одного за раз и без пауз между байтами.
По опыту работы с ESP32, у которых программа тоже выполняется из SPIFI, знаю, что обработчики прерываний можно поместить в ОЗУ, чтобы уменьшить время их выполнения и убрать ненужные page-fault-ы кеша SPIFI.
Только вот вопрос, как это сделать?
Поскольку просто добавление аттрибута
C:
__attribute__((noinline, section(".ram_text")))
P.S. Что касается UART, то знаю, что по-хорошему надо использовать DMA при таких скоростях, но всё-таки хочу попробовать ускорить работу прерываний.