one_eight_seven 6 12 августа, 2021 Опубликовано 12 августа, 2021 (изменено) · Жалоба Здравствуйте. Для RISC-V доступны несколько вариантов таблицы векторов. Одна из них - это Core Local Interrupter (CLINT) vected mode. Где в таблице не просто вектор, по которому нужно перейти, а инструкция перехода на адрес, по которому расположена ISR. На ассемблере это выглядит вот так: .global __vector_table __vector_table: IRQ_0: j default_exception_handler IRQ_1: j default_vector_handler IRQ_2: j default_vector_handler IRQ_3: j software_handler ... Буду очень благодарен, если кто-нибудь подскажет способ сделать эту таблицу на C. Изменено 12 августа, 2021 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Immortal_Buka 0 13 августа, 2021 Опубликовано 13 августа, 2021 · Жалоба __attribute__ ((section(".__vector_table"),naked,noreturn)) void isr_jumps(void) { asm("j default_exception_handler"); asm("j default_vector_handler"); asm("j default_vector_handler"); asm("j software_handler"); } Я для GCC делаю так, LLVM вроде тоже собирает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 13 августа, 2021 Опубликовано 13 августа, 2021 · Жалоба Да, спасибо большое. Я недостаточно точно задал вопрос. Мне не для работы с уже готовым чипом, мне для его разработки, точнее, проверок. Где вектора и т.п. могут меняться. И невнимательность приводит к слишком долгому поиску ошибок. Поэтому, хотелось что-то вроде,: typedef void (*isr_f)(void); volatile isr_f vector_table[128] __attribute__((used, section(".vectors"))) = { [0] = default_exception_handler, [1] = default_vector_handler, [2] = default_vector_handler, [3] = software_handler, ... }; Т.е. чтобы код сам следил за их расположением. Понятно, что в ассемблерной вставке можно поставить метки, чтобы было удобно искать смещение, но за порядком всё-равно надо следить вручную. Без дополнительной проверки компилятором. Спасибо ещё раз. P.S. Есть ещё и такой вариант: __attribute__ ((section(".__vector_table"),naked,noreturn)) void isr_jumps(void) { default_exception_handler(); default_vector_handler(); default_vector_handler(); assoftware_handler(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 13 августа, 2021 Опубликовано 13 августа, 2021 · Жалоба 35 минут назад, one_eight_seven сказал: P.S. Есть ещё и такой вариант: __attribute__ ((section(".__vector_table"),naked,noreturn)) void isr_jumps(void) { default_exception_handler(); default_vector_handler(); default_vector_handler(); assoftware_handler(); } Нет никакой гарантии, что какой-то си-компилятор создаст именно только нужную цепочку команд, не добавив в неё ничего от себя (эпилог/пролог функции и т.п.). Какие бы атрибуты не указывали для этой функции. Да и какой смысл пытаться костылить на си то, для чего предназначем ассемблер? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Immortal_Buka 0 13 августа, 2021 Опубликовано 13 августа, 2021 · Жалоба 44 minutes ago, one_eight_seven said: Где вектора и т.п. могут меняться Может быть, лучше сначала отладиться в direct режиме? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 13 августа, 2021 Опубликовано 13 августа, 2021 · Жалоба 1 hour ago, Immortal_Buka said: Может быть, лучше сначала отладиться в direct режиме? Изменяются внешние соединения, не ядро. Но этот вопрос я даже не поднимал. Спасибо. 1 hour ago, jcxz said: Да и какой смысл пытаться костылить на си то, для чего предназначем ассемблер? Смысл не в том, чтобы костылить. А в том, чтобы сделать на C. Понятно, что после naked ничего кроме ассемблера не ожидается. И пока документация атрибута naked не поменялась, это спекуляция недокументированными возможностями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 9 ноября, 2022 Опубликовано 9 ноября, 2022 · Жалоба On 8/13/2021 at 9:36 AM, one_eight_seven said: P.S. Есть ещё и такой вариант: Не вариант - будут call's вместо jmp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 9 ноября, 2022 Опубликовано 9 ноября, 2022 (изменено) · Жалоба Кстати, вот серия постингов про то как скрестить прерывания и плюсы... Вообще без .S файлов. http://five-embeddev.com/baremetal/intro/ И вот сюда загляните: https://www.shincbm.com/embedded/2021/06/24/riscv-and-modern-c++-part1-7.html Начните чтение с конца. Изменено 9 ноября, 2022 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 9 ноября, 2022 Опубликовано 9 ноября, 2022 · Жалоба On 8/13/2021 at 2:15 AM, one_eight_seven said: Буду очень благодарен, если кто-нибудь подскажет способ сделать эту таблицу на C. извиняюсь конечно, за офтоп - но зачем? тут же дело не в красоте, а в том, что таблица этих векторов должна быть до запуска main. опять же если хочется переложить базовый вектор, то тоже лучше через ассемблер, по-моему (там и выравнивание, и четко все :) ----------- в С можно иметь наблицу с указателями на функции, но все равно понадобится какой-то обработчик с сохранением tmp регистра (ну если возврат нужен) и через него jump ----------- я тоже восновном чипы проверяю, а не софт пишу - но меня такая идея не посещала... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 9 ноября, 2022 Опубликовано 9 ноября, 2022 (изменено) · Жалоба On 11/9/2022 at 1:17 PM, xvr said: Не вариант - будут call's вместо jmp Откуда такая уверенность? Нормально компилируетсяв в jal. On 11/9/2022 at 8:47 PM, yes said: извиняюсь конечно, за офтоп - но зачем? Было написано выше. On 8/13/2021 at 12:36 PM, one_eight_seven said: чтобы код сам следил за их расположением Но работа уже сделана без того, чтобы полагаться на недокументированные особенности GCC, т.е. на ассемблере, а точнее - на ассемблерных вставках. Как только устаканили вектора, то нужда в этом (следить компилятором за расположением) пропала. On 11/9/2022 at 5:24 PM, GenaSPB said: Кстати, вот серия постингов про то как скрестить прерывания и плюсы... Вообще без .S файлов. http://five-embeddev.com/baremetal/intro/ И вот сюда загляните: https://www.shincbm.com/embedded/2021/06/24/riscv-and-modern-c++-part1-7.html Начните чтение с конца. Спасибо. Но там сделано на ассемблере. идентично тому. что приведено в самом первом посте схемы. Изменено 9 ноября, 2022 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 10 ноября, 2022 Опубликовано 10 ноября, 2022 · Жалоба 20 hours ago, one_eight_seven said: Откуда такая уверенность? Нормально компилируетсяв в jal. Было написано выше. судя по ответам, не я один не понял... ---------------------- в RV (да как и в большинстве подобных) jal это и call и jump одновременно, зависит от аргумента ---------------------- как (по-моему) можно сделать без ассемблера : например, в линкере указать что линковать функции-обработчики по константным адресам (например, каждой функции отдельную секцию) или передать символы из линкера в код https://mcuoneclipse.com/2016/11/01/getting-the-memory-range-of-sections-with-gnu-linker-files/ сформировать табличку (global/static) из кодов jal zero, addr (и таки да - это тоже символ линкера, и положить желательно в .text, а не .data) и ее адрес в mtvec (в принципе можно и без этого - в uint64/32 преобразуем указатели (фукций и таблицы) - в С получится некая формула, которая будет считаться рантайм - но что делать если разность больше imm[20:1] - хз) напоминаю формат (спасибо креативщикам из riscv) JAL : imm[20][10:1][11][19:12] rd opcode J-type младшие 12 бит 0x06F imm это собственно разница (signed) между адресом функции и адресом jal в табличке Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 10 ноября, 2022 Опубликовано 10 ноября, 2022 · Жалоба @yes, спасибо, но это ещё хуже, чем писать на ассемблере. Приучить инженеров не лезть в вопросы, в которых они ничего не понимают оказалось проще. Но если бы пришлось делать это второй раз. я бы просто сделал кодогенератор. На всякий случай обращу внимание, что тема поднималась почти полтора года назад. С тех времён уже пару чипов испекли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться