vov4ick 35 9 июля, 2023 Опубликовано 9 июля, 2023 (изменено) · Жалоба Вроде не совсем так. Вот выдержка из 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 адреса в байтах, нужное значение получится само, останется поправить младшие два бита. Изменено 9 июля, 2023 пользователем vov4ick Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dpavlov 3 10 июля, 2023 Опубликовано 10 июля, 2023 · Жалоба 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 используется кастомизация. Дмитрий Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Canis Dirus 0 17 июля, 2023 Опубликовано 17 июля, 2023 · Жалоба Чтобы два раза не вставать и не плодить лишние темы. У кого-нибудь есть идея, как понимать «It should be noted that the vector table base address needs to be 1KB aligned in the QingKe V2 microprocessor» (похожее требование есть и в документации на V3, а вот в V4 — нет)? Потому что в прилагаемом коде (например этом) на это выравнивание по границе килобайта благополучно положили. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 17 июля, 2023 Опубликовано 17 июля, 2023 · Жалоба 16 минут назад, Canis Dirus сказал: на это выравнивание по границе килобайта благополучно положили. Так может там по-умолчанию выровнено, вот и не трогается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 17 июля, 2023 Опубликовано 17 июля, 2023 · Жалоба 25 минут назад, Canis Dirus сказал: Потому что в прилагаемом коде (например этом) на это выравнивание по границе килобайта благополучно положили. Из чего сделано такое заключение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Canis Dirus 0 17 июля, 2023 Опубликовано 17 июля, 2023 (изменено) · Жалоба В 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) стоит скромный прочерк. Изменено 17 июля, 2023 пользователем Canis Dirus Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 17 июля, 2023 Опубликовано 17 июля, 2023 · Жалоба То что там в скрипте линкера еще ни о чем не говорит - как никак, VTOR устанавливается записью в регистр. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Canis Dirus 0 17 июля, 2023 Опубликовано 17 июля, 2023 · Жалоба В 17.07.2023 в 18:14, Arlleex сказал: То что там в скрипте линкера еще ни о чем не говорит - как никак, VTOR устанавливается записью в регистр. И выглядит эта запись вот так: la t0, _start ori t0, t0, 3 csrw mtvec, t0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 17 июля, 2023 Опубликовано 17 июля, 2023 · Жалоба 1 час назад, Canis Dirus сказал: И выглядит эта запись вот так: la t0, _start ori t0, t0, 3 csrw mtvec, t0 А, ок. Значит, положились на то, что в _start будет нечто кратное 1 кБ << 2 (2 бита в mtvec это какие-то биты режимов, я хз). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Canis Dirus 0 17 июля, 2023 Опубликовано 17 июля, 2023 (изменено) · Жалоба В 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 Изменено 17 июля, 2023 пользователем Canis Dirus Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 17 июля, 2023 Опубликовано 17 июля, 2023 · Жалоба Так это же заглушки. Все эти 0x13 будут таблицей по границе 1 кБ (по идее). Глядя на Цитата .vector : { *(.vector); . = ALIGN(64); } >FLASH AT>FLASH ровняют они на 64 (это в чем? в словах или байтах?). Ну, промахнулись немного с цифрами... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Canis Dirus 0 17 июля, 2023 Опубликовано 17 июля, 2023 · Жалоба В 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 (это в чем? в словах или байтах?). Ну, промахнулись немного с цифрами... Это другое, выравнивают код уже после таблицы векторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба 12 часов назад, Arlleex сказал: ровняют они на 64 (это в чем? в словах или байтах?). Ну, промахнулись немного с цифрами... Имхо - это больше похоже не на выравнивание, а на резервирование области под таблицу векторов размером до 64 (чего-то - байт/слов/...). А начало самой таблицы они подразумевают априори выровненным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dpavlov 3 19 июля, 2023 Опубликовано 19 июля, 2023 · Жалоба 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 ? Дмитрий Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 192 19 июля, 2023 Опубликовано 19 июля, 2023 · Жалоба 4 часа назад, dpavlov сказал: Попробуйте в MTVEC записать FF....FF(все единицы) и прочитать обратно. Прочитаются тоже все 1 ? Не факт, что это будет о чем-то говорить, т.к. одно дело регистр, а другое его интерпретация. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться