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

Таблица векторов прерываний

Вроде не совсем так. Вот выдержка из QingKeV4:

Цитата

2.2 Entering exception
When the program is in the process of normal operation, if for some reason, triggered into an exception or interrupt. The hardware behavior of the microprocessor at this point can be summarized as follows.

(1) Suspend the current program flow and move to the execution of exception or interrupt handling functions.
The entry base address and addressing mode of the exception or interrupt function are defined by the exception entry base address register mtvec.

mtvec[31:2] defines the base address of the exception or interrupt function.

mtvec[1:0] defines the addressing mode of the handler function, where mtvec[0] defines the entry mode of the exception and interrupt.

When mtvec[0]=0, all exceptions and interrupts use a unified entry, i.e., when an exception or interrupt occurs, it turns to the base address defined by mtvec[31:2] for execution.

When mtvec[0]=1, exceptions and interrupts use vector table mode, i.e., each exception and interrupt is numbered, and the address is shifted according to interrupt number*4, and when an exception or interrupt occurs, it is shifted to the base address defined by mtvec[31:2] + interrupt number*4 for execution.

The vector mode mtvec[1] defines the identification mode of the vector table.

When mtvec[1]=0, the instruction stored at the vector table is an instruction to jump to the exception or interrupt handling function, or it can be another instruction; when mtvec[1]=1, the absolute address of the exception handling function is stored at the vector table.

То есть нулевой бит регистра включает табличный режим обработки прерываний, если ноль - один большой обработчик.

Первый бит регистра задаёт тип таблицы. Либо это таблица адресов обработчиков (как на писюках), либо исполняемый код - множество команд перехода на обработчики (как на 8-битных МК).

Остальные 30 бит - адрес единого обработчика, либо адрес таблицы (адресов либо инструкций).

Так я понял, но пока не проверял.

Адрес, как я понял, в машинных словах (4 байта). Поэтому при записи в mtvec адреса в байтах, нужное значение получится само, останется поправить младшие два бита.

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

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


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

10 hours ago, vov4ick said:

Вроде не совсем так. Вот выдержка из QingKeV4:

То есть нулевой бит регистра включает табличный режим обработки прерываний, если ноль - один большой обработчик.

Первый бит регистра задаёт тип таблицы. Либо это таблица адресов обработчиков (как на писюках), либо исполняемый код - множество команд перехода на обработчики (как на 8-битных МК).

Остальные 30 бит - адрес единого обработчика, либо адрес таблицы (адресов либо инструкций).

Так я понял, но пока не проверял.

Адрес, как я понял, в машинных словах (4 байта). Поэтому при записи в mtvec адреса в байтах, нужное значение получится само, останется поправить младшие два бита.

 

Добрый день,

Согласно официальной версии (file:///C:/Users/dmitr/Downloads/riscv-privileged-20211203.pdf, раздел 3.1.7, стр. 29) для битов MTVEC[1:0] значения "10" и "11" являются зарезервированными. Возможно в QingKeV4 используется кастомизация. 

Дмитрий  

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


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

Чтобы два раза не вставать и не плодить лишние темы. У кого-нибудь есть идея, как понимать «It should be noted that the vector table base address needs to be 1KB aligned in the QingKe V2 microprocessor» (похожее требование есть и в документации на V3, а вот в V4 — нет)? Потому что в прилагаемом коде (например  этом) на это выравнивание по границе килобайта благополучно положили.

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


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

16 минут назад, Canis Dirus сказал:

на это выравнивание по границе килобайта благополучно положили.

Так может там по-умолчанию выровнено, вот и не трогается.

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


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

25 минут назад, Canis Dirus сказал:

Потому что в прилагаемом коде (например  этом) на это выравнивание по границе килобайта благополучно положили.

Из чего сделано такое заключение?

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


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

В 17.07.2023 в 17:45, jcxz сказал:

Из чего сделано такое заключение?

А из того самого startup_ch32v00x.S и скрипта для линкера

        .section  .init, "ax", @progbits
        .globl  _start
        .align  2
_start:
        .option   norvc;
    j       handle_reset
    .word   0
    .word   NMI_Handler                  /* NMI Handler */
    .word   HardFault_Handler            /* Hard Fault Handler */
    .word   0
    .word   0
    .word   0
    .word   0
    .word   0
    .word   0
    .word   0
    .word   0
    .word   SysTick_Handler             /* SysTick Handler */
    .word   0
    .word   SW_Handler                  /* SW Handler */
    .word   0
ENTRY( _start )

SECTIONS
{
    .init :
    {
      _sinit = .;
      . = ALIGN(4);
      KEEP(*(SORT_NONE(.init)))
      . = ALIGN(4);
      _einit = .;
    } >FLASH AT>FLASH

Нет, формально это самое выравнивание и получается, но выглядит как грязный хак: в документации (что на ядро, что на CH32V003) то на этом месте (Entrance address 0x00000000) стоит скромный прочерк.

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

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


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

То что там в скрипте линкера еще ни о чем не говорит - как никак, VTOR устанавливается записью в регистр.

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


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

В 17.07.2023 в 18:14, Arlleex сказал:

То что там в скрипте линкера еще ни о чем не говорит - как никак, VTOR устанавливается записью в регистр.

И выглядит эта запись вот так:


    la t0, _start
    ori t0, t0, 3
    csrw mtvec, t0

 

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


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

1 час назад, Canis Dirus сказал:

И выглядит эта запись вот так:


    la t0, _start
    ori t0, t0, 3
    csrw mtvec, t0

А, ок. Значит, положились на то, что в _start будет нечто кратное 1 кБ << 2 (2 бита в mtvec это какие-то биты режимов, я хз).

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


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

В 17.07.2023 в 20:11, Arlleex сказал:

А, ок. Значит, положились на то, что в _start будет нечто кратное 1 кБ << 2

Да нет, там просто, получается, прибили эту таблицу гвоздями к нулевому адресу, в расчёте на то что никаких новых прерываний в начало таблицы не засунут.

 

P.S. Продолжение банкета. У CH32V103 оно ещё смешнее. В документации на ядро (V3) написано «The interrupt vector table base address, which needs to be 1KB aligned», линкер выравнивает таблицу по границе машинного слова, а код так вообще красота неописуемая:

	.section	.init,"ax",@progbits
	.global	_start
	.align	1
_start:
	j	handle_reset
	.word 0x00000013
	.word 0x00000013
	.word 0x00000013
	.word 0x00000013
	.word 0x00000013
	.word 0x00000013
	.word 0x00000013
	.word 0x00000013
	.word 0x00000013
	.word 0x00000013
	.word 0x00000013
	.word 0x00000013
	.word 0x00100073
    .section    .vector,"ax",@progbits
    .align  1
_vector_base:
    .option norvc;
        j   _start
Изменено пользователем Canis Dirus

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


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

Так это же заглушки. Все эти 0x13 будут таблицей по границе 1 кБ (по идее). Глядя на

Цитата
.vector :
  {
      *(.vector);
	  . = ALIGN(64);
  } >FLASH AT>FLASH

ровняют они на 64 (это в чем? в словах или байтах?). Ну, промахнулись немного с цифрами...

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


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

В 17.07.2023 в 20:40, Arlleex сказал:

Так это же заглушки. Все эти 0x13 будут таблицей по границе 1 кБ (по идее).

Так в том то всё и дело, что нет:

                0x0000000000000800                __stack_size = 0x800
                [!provide]                        PROVIDE (_stack_size = __stack_size)

.init           0x0000000000000000       0x38
                0x0000000000000000                _sinit = .
                0x0000000000000000                . = ALIGN (0x4)
 *(SORT_NONE(.init))
 .init          0x0000000000000000       0x38 ./Build/startup/startup_ch32v10x.o
                0x0000000000000000                _start
                0x0000000000000038                . = ALIGN (0x4)
                0x0000000000000038                _einit = .

.vector         0x0000000000000038      0x108
 *(.vector)
 .vector        0x0000000000000038       0xf0 ./Build/startup/startup_ch32v10x.o
                0x0000000000000140                . = ALIGN (0x40)
 *fill*         0x0000000000000128       0x18

 

В 17.07.2023 в 20:40, Arlleex сказал:

ровняют они на 64 (это в чем? в словах или байтах?). Ну, промахнулись немного с цифрами...

Это другое, выравнивают код уже после таблицы векторов.

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


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

12 часов назад, Arlleex сказал:

ровняют они на 64 (это в чем? в словах или байтах?). Ну, промахнулись немного с цифрами...

Имхо - это больше похоже не на выравнивание, а на резервирование области под таблицу векторов размером до 64 (чего-то - байт/слов/...). А начало самой таблицы они подразумевают априори выровненным.

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


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

On 7/17/2023 at 8:14 PM, Canis Dirus said:

Чтобы два раза не вставать и не плодить лишние темы. У кого-нибудь есть идея, как понимать «It should be noted that the vector table base address needs to be 1KB aligned in the QingKe V2 microprocessor» (похожее требование есть и в документации на V3, а вот в V4 — нет)? Потому что в прилагаемом коде (например  этом) на это выравнивание по границе килобайта благополучно положили.

Добрый день,

Возможно, младшие биты не реализованы.

Попробуйте в MTVEC записать FF....FF(все единицы)  и прочитать обратно. Прочитаются тоже все 1 ?

Дмитрий

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


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

4 часа назад, dpavlov сказал:

Попробуйте в MTVEC записать FF....FF(все единицы)  и прочитать обратно. Прочитаются тоже все 1 ?

Не факт, что это будет о чем-то говорить, т.к. одно дело регистр, а другое его интерпретация.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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