Прерывание с высоким приоритетом не вызывается, в то время как прерывание с низким приоритетом в Aurix TC27x
Я использую плату Aurix Tricore TC27x. Здесь я использую два прерывания, одно прерывание будет происходить на каждые 5us(высокий приоритет), а другое прерывание будет происходить на каждые 100us(низкий приоритет). Время выполнения прерывания 100us(низкий приоритет) составляет 40us, поэтому при выполнении прерывания 100us(низкий приоритет), если наступает прерывание 5us(высокий приоритет), переключение контекста не происходит.
После завершения прерывания с низким приоритетом происходит только переключение на прерывание с высоким приоритетом. Из-за этого я потерял данные.
Почему это не выгружено?
Заранее спасибо.
2 ответа
Попробуйте использовать __bisr(IPRN) при установке обработчика прерываний, это позволит прерываниям с высоким приоритетом прерывать прерывания с более низким приоритетом. Я не уверен, что это включено во все компиляторы, но определенно доступно с компилятором задач.
Как уже упоминал Мартин Джеймс в своем комментарии и Стив Митчелл в своем ответе, вам необходимо повторно включить прерывания в ISR. В TASKING Compiler это делается немного более интуитивно с помощью оператора в определении функции:
void __interrupt(YOUR_INT_PRIO) __vector_table(YOUR_INT_PROVIDER) __enable_ name_of_your_isr (void)
{
/* this ISR may be interrupted */
/* your code here */
}
Если вы не используете
void __interrupt(YOUR_INT_PRIO) __vector_table(YOUR_INT_PROVIDER) name_of_your_isr (void)
{
/* this ISR will NOT be interrupted */
/* your code here */
}
Для других компиляторов прочтите руководство пользователя вашего компилятора или просмотрите «Руководство пользователя базовой архитектуры TriCore TC1.6P и TC1.6E» от Infineon в разделе о системе прерываний.