ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
16 июня
1591714 Топик полностью
Nikolay_Po (Сегодня, 16:46, просмотров: 21) ответил klen на Давайте разбирастя, ув. кроты! контекст прерывания ( читай по сути исключения процессора ) и "что то где сохраняется контекст FreeRTOS" - веши перпендикулярные. 0) в FreeRTOS прерываний не существует 1) контекст исключений и контекст задач - ваще не одно и тоже 2) FreeRTOS + исключения(прерывания у меня работают с HPE 3) Где я балбес?
У меня такая переключалка выходит, в части блокировки прерываний приоритетом до RTOS API включительно: 
 csrrci x0, mstatus, 0b01000         /* Clear MIE bit of mstatus to disable machine interrupts */
 addi sp, sp, -portCONTEXT_SIZE      /* Reserve stack place for context storage */
 store_x x5, 3 * portWORD_SIZE( sp ) /* Store general purpose register ASAP to handle PFIC register address */
 store_x x6, 4 * portWORD_SIZE( sp ) /* Store general purpose register ASAP to handle PFIC register value */
 lui     t0,0xe000e                  /* Block RTOS_API interrupts. Set PFIC_ITRHESDR region address. */
 li      t1,128                      /* Set interrupt level to RTOS_API_ISRprio=(4<
 sw      t1,64(t0)                   /* Write RTOS_API ISR priority threshold value to block RTOS-related interrupts */
 csrrsi x0, mstatus, 0b01000         /* Set MIE bit of mstatus back to enable higher priority machine interrupts */


И далее сохранение остального контекста.

А чтобы выйти из прерывания переключателя контекста, в конце на время снимаю MIE, чтобы вложенное прерывание не перехватило взведённый GIHWSTKNEN:


csrrci x0, mstatus, 0b01000		/* Clear MIE bit of mstatus to disable machine interrupts */
li t1, 0x2e				/* Disable HPE context restoration but keeping nested interrupts and hardware stack enabled */
csrw 0x804, t1				/* Write INTSYSCR register with GIHWSTKNEN set */
load_x x1,  2  * portWORD_SIZE( sp )	/* Restore t1 register */
addi sp, sp, portCONTEXT_SIZE		/* Release stack region */
mret					/* Exit the ISR */