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

ADSP218x

на телесистее спросил, может здесь ответят.

извините, что лезу с этим старьём. но...

 

 

Ситуёвина такая. У меня выполняется прерывание А, ко мне приходит запрос на прерывание Б (прерывание Б имеет приоритет более низкий, чем А). есть ли какая-нибудь возможность всё-таки прервать выполнение прерывания А, потом вернуться из Б к нему нормально?

 

Может к.-н. танцы вокруг регистров IMSK(маски), IFC(очистка прерываний), ICNTL (вложение)?

 

Спасибо.

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


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

Ситуация не очень хорошая, но вполне разрешимая.

Если нет возможности поменять приоритет, обычные танцы с бубном:

1. При необходимости сохраняешь контекст

2. Разрешаешь прерывание В

3. При возврате из прерывания восстанавливаешь контекст

 

Если есть возможность поменять приоритет, тогда можно использовать штатную систему вложенных прерываний.

Я так и так делал, работает нормально.

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


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

Не получится ничего с ADSP218x. И манипуляции с IMSK, IFC, ICNTL (хоть и через стек) не помогут.

Хотя с удовольствием встречу опровержение (а вдруг <_< ).

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


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

Interrupt Control Register
The Interrupt Control (ICNTL) register is a 5-bit register that configures
the external interrupt requests (IRQx) of each processor. All bits in ICNTL
are undefined after a processor reset. The bit definitions for each processor’s
ICNTL register are given in Appendix B, “Control/Status Registers”.
ICNTL contains an IRQx sensitivity bit for each external interrupt. The sensitivity
bits determine whether a given interrupt input is edge- or
level-sensitive (0 = level-sensitive, 1 = edge-sensitive). There are no sensitivity
bits for internally generated interrupts.
The interrupt nesting enable bit (bit 4) in ICNTL determines whether nesting
of interrupt service routines is allowed.
When the value of ICNTL is changed, there is a one cycle latency before the
change in interrupt configuration.

 

Бит 4 ICNTL разрешает вложенные прерывания. Если в обработчике прерывания более высокого уровня разрешить в IMASK прерывание более низкого уровня, оно должно произойти.

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


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

Вот, а я всегда считала, что конкретно у ADSP 21xx вложенность и маскирование не так понимаются (прервать может только запрос с более высоким приоритетом и только, если он не замаскирован). Хотя, проще попробовать.

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


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

Цитата из перевода "Руководство по сигнальным процессорам 21хх"

Программное обеспечение также может определять возможность использования вложенных прерываний. В режиме, не разрешающим использование вложенных прерываний, все запросы на прерывания автоматически маскируются при входе в подпрограмму обслуживания прерываний. В режиме, разрешающим использование, процессор определяет и обслуживает прерывания с высшим приоритетом.

 

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

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


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

Разумеется, прерывания более низкого приоритета маскируются внутри цикла обработки прерывания с более высоким приоритетом. Поэтому я и писал, что их нужно разрешить внутри обработчика. Только что проверил - всё работает.

Пример:

#include    "def2181.h"
.SECTION/DM seg_data;

.VAR rx_data;

.SECTION/PM     seg_code;
        jump init;  nop; nop; nop;              /*00: reset */
        rti;         nop; nop; nop;             /*04: IRQ2 */
        rti;         nop; nop; nop;             /*08: IRQL1 */
        rti;         nop; nop; nop;             /*0c: IRQL0 */
        jump tx_SP0;         nop; nop; nop;        /*10: SPORT0 tx */
        jump rx_SP0;         nop; nop; nop;                /*14: SPORT0 rx */
        rti;         nop; nop; nop;             /*18: IRQE */
        rti;         nop; nop; nop;             /*1c: BDMA */
        rti;    nop; nop; nop;             /* 20: SPORT1 tx or IRQ1 */
        rti;     nop; nop; nop;                 /* 24: SPORT1 rx or IRQ0 */
        jump on_timer;       nop; nop; nop;     /*28: timer */
        rti;         nop; nop; nop;                /* 2c: WathDOG */
        
init:        
        ax1 = b#0000010000000000;   
        dm (Sys_Ctrl_Reg) = ax1;

        ax1 = 0x0010;
        ICNTL = AX1;

        ax1 = 0;   dm (Sport0_Autobuf_Ctrl) = ax1;
        ax1 = 0x0001;    dm (Sport0_Rfsdiv) = ax1;
        ax1 = 0x0007;    dm (Sport0_Sclkdiv) = ax1;
        ax1 = b#0111111000001111;   dm (Sport0_Ctrl_Reg) = ax1;
            
                  ax1 = 99; dm(Tperiod_Reg) = ax1;
                  dm(Tcount_Reg) = ax1;    
                  ax1 = 31; dm(Tscale_Reg) = ax1;
        
        ar = b#0001110000000000;
        dm (Sys_Ctrl_Reg) = ar;   

                  ifc = b#00000011111111;     /* clear any pending interrupt */
                  nop;
                  IMASK = b#0000000000100000; // разрешено только прерывание по приёму SP0
        ena timer;
        
loop0:        
        nop;
        idle;
        jump loop0;

        
rx_SP0:
        DM(rx_data) = RX0;
        IMASK = b#0000000000000001;    // разрешили прерывание по таймеру. Без него зависнем.
        
        idle;
        nop;
        rti;

on_timer:
        TX0 = DM(rx_data);
        rti;

tx_SP0:
        nop;
        rti;

 

 

Здесь прерывание от таймера (низший приоритет) разрешается только в цикле обработки прерявания по приёму SP0. И оно срабатывает :cheers:

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


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

Не очень показательный тест. ;)

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

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


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

1. Прерывание от таймера разрешено только во время действия прерывания по приёму (IMASK восстанавливается из стека по RTI)

2. В обработчике прерывания по приёму стоит IDLE. Выход из спячки возмоден только по прерыванию.

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

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


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

Все теперь понятно. :a14: Действительно, все как у всех (маскирование в самом обычном смысле).

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


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

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

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

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

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

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

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

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

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

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