Перейти к содержанию
    

RISC-V CLINT IVT in C

Здравствуйте. Для 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.

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__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 вроде тоже собирает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, спасибо большое.

Я недостаточно точно задал вопрос.
Мне не для работы с уже готовым чипом, мне для его разработки, точнее, проверок. Где вектора и т.п. могут меняться. И невнимательность приводит к слишком долгому поиску ошибок.

Поэтому, хотелось что-то вроде,:

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();
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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();
}

 

Нет никакой гарантии, что какой-то си-компилятор создаст именно только нужную цепочку команд, не добавив в неё ничего от себя (эпилог/пролог функции и т.п.). Какие бы атрибуты не указывали для этой функции.

Да и какой смысл пытаться костылить на си то, для чего предназначем ассемблер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

44 minutes ago, one_eight_seven said:

Где вектора и т.п. могут меняться

Может быть, лучше сначала отладиться в direct режиме?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Immortal_Buka said:

Может быть, лучше сначала отладиться в direct режиме?

Изменяются внешние соединения, не ядро. Но этот вопрос я даже не поднимал. Спасибо.

1 hour ago, jcxz said:

Да и какой смысл пытаться костылить на си то, для чего предназначем ассемблер?

Смысл не в том, чтобы костылить. А в том, чтобы сделать на C. Понятно, что после naked ничего кроме ассемблера не ожидается. И пока документация атрибута naked не поменялась, это спекуляция недокументированными возможностями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/13/2021 at 9:36 AM, one_eight_seven said:

P.S. Есть ещё и такой вариант:

Не вариант - будут call's вместо jmp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, вот серия постингов про то как скрестить прерывания и плюсы... Вообще без .S файлов.

http://five-embeddev.com/baremetal/intro/

 

 

И вот сюда загляните:
https://www.shincbm.com/embedded/2021/06/24/riscv-and-modern-c++-part1-7.html

Начните чтение с конца.

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/13/2021 at 2:15 AM, one_eight_seven said:

Буду очень благодарен, если кто-нибудь подскажет способ сделать эту таблицу на C.

 

извиняюсь конечно, за офтоп - но зачем?

тут же дело не в красоте, а в том, что таблица этих векторов должна быть до запуска main.

опять же если хочется переложить базовый вектор, то тоже лучше через ассемблер, по-моему (там и выравнивание, и четко все :)

-----------

в С можно иметь наблицу с указателями на функции, но все равно понадобится какой-то обработчик с сохранением tmp регистра (ну если возврат нужен) и через него jump 

-----------

я тоже восновном чипы проверяю, а не софт пишу - но меня такая идея не посещала...

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Начните чтение с конца.

 

Спасибо. Но там сделано на ассемблере. идентично тому. что приведено в самом первом посте схемы.

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 в табличке

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@yes, спасибо, но это ещё хуже, чем писать на ассемблере. Приучить инженеров не лезть в вопросы, в которых они ничего не понимают оказалось проще. Но если бы пришлось делать это второй раз. я бы просто сделал кодогенератор. На всякий случай обращу внимание, что тема поднималась почти полтора года назад. С тех времён уже пару чипов испекли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...