Jump to content

    
Sign in to follow this  

Recommended Posts

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

Edited by one_eight_seven

Share this post


Link to post
Share on other sites
__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 вроде тоже собирает

Share this post


Link to post
Share on other sites

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

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

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

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

 

Share this post


Link to post
Share on other sites
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();
}

 

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

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

Share this post


Link to post
Share on other sites
1 hour ago, Immortal_Buka said:

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

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

1 hour ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this