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

Как сделать прерывание внутри прерывания в blackfin?

Нужно сделать прерывание внутри обработчика прерывания в блекфине.

 

Как это сделать?

 

 

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


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

Нужно сделать прерывание внутри обработчика прерывания в блекфине.

 

Как это сделать?

Не вполне ясно, что именно нужно сделать. CEC у фина приоритетный, т.е. более приоритетное прерывание вытесняет менее приоритетное.

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


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

Не вполне ясно, что именно нужно сделать. CEC у фина приоритетный, т.е. более приоритетное прерывание вытесняет менее приоритетное.

 

Если работает обработчик прерывания с приоритетом N, то во время его работы при появлении

прерывания с более высоким приоритетом произойдет переход на новое сразу,

или закончится текущее, а потом переход на новое?

 

Мне нужно использовать 3 таймера.

 

Во время обработки прерывания от 1-го и возникновении прерывания от 2-го будет сразу переход на обработку 2-го, или

закончится обработка 1-го и потом переход?

 

 

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


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

Если работает обработчик прерывания с приоритетом N, то во время его работы при появлении

прерывания с более высоким приоритетом произойдет переход на новое сразу,

или закончится текущее, а потом переход на новое?

 

Мне нужно использовать 3 таймера.

 

Во время обработки прерывания от 1-го и возникновении прерывания от 2-го будет сразу переход на обработку 2-го, или

закончится обработка 1-го и потом переход?

у меня был проект на блекфин, насколько помню высокоприоритетное прерывание

откладывет низкоприоритетное

всего там прерываний от 7 до 15 (периферийные)

7 - самый высокий

14 - приоритет сигналов

15 - приоритет основной программы

у меня на 14 уровне была работа записи на SD карту

когда я писал на SD в основной программе - я блокировал 14 уровень,

чтобы он мне не попортил ничего.

/************************************************************************
* В этом файле описываются обработчики прерываний для каждого приоритета 
* Мы можем использовать приоритеты от 7-го до 13 включительно.
* IVG14 и IVG15 - программные прерывания: на IVG14 работает сигнал
* на IVG15 наша программа 
*********************************************************************/
#include "ads1282.h"
#include "timer1.h"
#include "timer2.h"
#include "timer4.h"
#include "power.h"
#include "ports.h"
#include "uart0.h"
#include "uart1.h"
#include "irq.h"
#include "spi0.h"
#include "rsi.h"



/* Обработчик прерываний для приоритета IVG7: 
* 1 - Таймер 1 - самый высокий приоритет, PRTC! 
* 2 - Подстройка генератора 4 МГц
*/
EX_INTERRUPT_HANDLER(section("L1_code")IVG7_ISR)
{
/* Таймер 1 - секундное прерывание  */
if (*pSIC_ISR1 & IRQ_TIMER1) {
	TIMER1_ISR();
}

}


/* Обработчик прерывания для приоритета IVG8:
* 1 - порт F маска A 
* Больше ничего сюда не ставить!
*/
EX_INTERRUPT_HANDLER(section("L1_code")IVG8_ISR)
{
if (*pSIC_ISR0 & IRQ_PFA_PORTF) {
	ADS1282_ISR();
}
}


/* Обработчик прерываний для приоритета IVG9:
* 1 - UART0 Rx строки  NMEA
* можно во flash
*/
#pragma section("FLASH_code")
EX_INTERRUPT_HANDLER(IVG9_ISR)
{
/* UART0 STATUS Rx interrupt */
if (*pSIC_ISR0 & IRQ_UART0_ERR) {
	UART0_STATUS_ISR();
}
}


/* Обработчик прерываний для приоритета IVG10:
* 1 - UART1
*/
EX_INTERRUPT_HANDLER(IVG10_ISR)
{
/* USART1 STATUS Rx interrupt */
if (*pSIC_ISR0 & IRQ_UART1_ERR) {
	UART1_STATUS_ISR();
}
}


/* Обработчик прерываний для приоритета IVG11:
* 1 - таймер 2 - счет задержек
* можно во flash
*/
#pragma section("FLASH_code")
EX_INTERRUPT_HANDLER(IVG11_ISR)
{
/* Таймер 2 подсчет задержек */
if (*pSIC_ISR1 & IRQ_TIMER2) {
	TIMER2_ISR();
}
}

/* Обработчик прерываний для приоритета IVG12:
* 1 - 1PPS на вход таймера 4 
*/
EX_INTERRUPT_HANDLER(section("L1_code")IVG12_ISR)
{
/* Счетный вход 1PPS от Сильваны */
if (*pSIC_ISR1 & IRQ_TIMER4) {
	TIMER4_ISR();
}
}

/* Обработчик прерываний для приоритета IVG13: выключение
* 1. Включение - выключение, порт G маска А  
* можно во flash
*/
#pragma section("FLASH_code")
EX_INTERRUPT_HANDLER(IVG13_ISR)
{
if (*pSIC_ISR1 & IRQ_PFA_PORTG) {
       	POWER_MAGNET_ISR();
}

if (*pSIC_ISR1 & IRQ_TIMER5) {
	BOUNCE_TIMER_ISR();
}
}


/* Установить вектор */
#pragma section("FLASH_code")
bool IRQ_register_vector(int vec)
{
bool result;
switch (vec) {
case 7:
	register_handler(ik_ivg7, IVG7_ISR);
	result = true;
	break;

case 8:
	register_handler(ik_ivg8, IVG8_ISR);
	result = true;
	break;

case 9:
	register_handler(ik_ivg9, IVG9_ISR);
	result = true;
	break;

case 10:
	register_handler(ik_ivg10, IVG10_ISR);
	result = true;
	break;

case 11:
	register_handler(ik_ivg11, IVG11_ISR);
	result = true;
	break;

case 12:
	register_handler(ik_ivg12, IVG12_ISR);
	result = true;
	break;

case 13:
	register_handler(ik_ivg13, IVG13_ISR);
	result = true;
	break;

default:
	result = false;
	break;
}

return result;
}


/* Убрать вектор  */
#pragma section("FLASH_code")
bool IRQ_unregister_vector(int vec)
{
bool result;
switch (vec) {
case 7:
	interrupt(ik_ivg7, SIG_IGN);
	result = true;
	break;

case 8:
	interrupt(ik_ivg8, SIG_IGN);
	result = true;
	break;

case 9:
	interrupt(ik_ivg9, SIG_IGN);
	result = true;
	break;

case 10:
	interrupt(ik_ivg10, SIG_IGN);
	result = true;
	break;

case 11:
	interrupt(ik_ivg11, SIG_IGN);
	result = true;
	break;

case 12:
	interrupt(ik_ivg12, SIG_IGN);
	result = true;
	break;

case 13:
	interrupt(ik_ivg13, SIG_IGN);
	result = true;
	break;

default:
	result = false;
	break;
}

return result;
}

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


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

Если работает обработчик прерывания с приоритетом N, то во время его работы при появлении

прерывания с более высоким приоритетом произойдет переход на новое сразу,

или закончится текущее, а потом переход на новое

Разумеется, более приоритетное вытеснит (отберёт управление) у низкоприоритетного, я ведь так и написал. Иначе просто нет смысла в этих приоритетах.

 

Во время обработки прерывания от 1-го и возникновении прерывания от 2-го будет сразу переход на обработку 2-го, или

закончится обработка 1-го и потом переход?

Если будет ждать, пока закончится текущее, то это никакая не приоритетная реализация, а обычная одноранговая. Вы Hardware Reference почитайте внимательнее, глава 3 Operating Modes and States, там описан режим работы в без-ОСном окружении, т.е. в прерывании (исключении) на низком приоритете IVG15, при котором процессор находится в Supervisor режиме, и все остальные исключения, тем не менее, прерасно прерывают поток выполнения этого уровня.

 

Другое дело, если обработчики прерывания отмаплены на один тот же уровень в CEC, тогда вытеснения не произойдёт, т.к. в пределах одного уровня исключений обработка ведётся по одноранговой схеме. Т.е., например, если использовать Timer0, Timer1, Timer2 (BF533), то они все "висят" на IVG11, т.е. их обработчики прерываний друг друга вытеснять не могут, будут работать по очереди. А вот если один из таймеров из этого набора, а второй - Core Timer, то обработчик прерывания Core Timer без вопросов отберёт управление у обработчика прерываний TimerN. Таким образом, всё зависит от того, как вы организуете свою программу.

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


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

Другое дело, если обработчики прерывания отмаплены на один тот же уровень в CEC, тогда вытеснения не произойдёт, т.к. в пределах одного уровня исключений обработка ведётся по одноранговой схеме. Т.е., например, если использовать Timer0, Timer1, Timer2 (BF533), то они все "висят" на IVG11, т.е. их обработчики прерываний друг друга вытеснять не могут, будут работать по очереди.

 

воoбще то у этих таймеров можно приоритеты изменить, чтобы они все не висели на IVG11

а на любых значениях от IVG 7 до IVG13

#pragma always_inline
IDEF void TIMER1_enable_irq(void)
{
/* перепрограммируем TIMER1 на на 7 приоритет */
*pSIC_IMASK1 |= IRQ_TIMER1;
*pSIC_IAR4 &= 0xFFFFFF0F;
*pSIC_IAR4 |= 0x00000000;	/* TIMER1 IRQ: IVG7 */
 ssync();
}

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


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

Нужно сделать прерывание внутри обработчика прерывания в блекфине.

 

Как это сделать?

Сразу после входа в обработчик прерываний нужно сохранить в стеке адрес возврата из прерывания:

 

[--SP] = RETI;

 

// Здесь разрешены вложенные прерывания

 

RETI = [sP++];

 

// Выход из прерывания:

 

RTI;

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


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

Пишу на чистом Си,

VDSP5.1.

 

При перескакивании на отработку прерывания с текущего обработчика

на прерывание с более высоким уровнем весь текущий контент будет

сохранен корректно?

 

Ничего дополнительно записывать не нужно в обработчике,

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

 

 

 

 

 

 

 

 

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


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

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

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

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

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

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

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

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

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

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