RCray 0 18 ноября, 2005 Опубликовано 18 ноября, 2005 · Жалоба на телесистее спросил, может здесь ответят. извините, что лезу с этим старьём. но... Ситуёвина такая. У меня выполняется прерывание А, ко мне приходит запрос на прерывание Б (прерывание Б имеет приоритет более низкий, чем А). есть ли какая-нибудь возможность всё-таки прервать выполнение прерывания А, потом вернуться из Б к нему нормально? Может к.-н. танцы вокруг регистров IMSK(маски), IFC(очистка прерываний), ICNTL (вложение)? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andk 0 21 ноября, 2005 Опубликовано 21 ноября, 2005 · Жалоба Ситуация не очень хорошая, но вполне разрешимая. Если нет возможности поменять приоритет, обычные танцы с бубном: 1. При необходимости сохраняешь контекст 2. Разрешаешь прерывание В 3. При возврате из прерывания восстанавливаешь контекст Если есть возможность поменять приоритет, тогда можно использовать штатную систему вложенных прерываний. Я так и так делал, работает нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Виктория 0 22 ноября, 2005 Опубликовано 22 ноября, 2005 · Жалоба Не получится ничего с ADSP218x. И манипуляции с IMSK, IFC, ICNTL (хоть и через стек) не помогут. Хотя с удовольствием встречу опровержение (а вдруг <_< ). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edashkin 0 22 ноября, 2005 Опубликовано 22 ноября, 2005 · Жалоба 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 прерывание более низкого уровня, оно должно произойти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Виктория 0 22 ноября, 2005 Опубликовано 22 ноября, 2005 · Жалоба Вот, а я всегда считала, что конкретно у ADSP 21xx вложенность и маскирование не так понимаются (прервать может только запрос с более высоким приоритетом и только, если он не замаскирован). Хотя, проще попробовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Виктория 0 22 ноября, 2005 Опубликовано 22 ноября, 2005 · Жалоба Цитата из перевода "Руководство по сигнальным процессорам 21хх" Программное обеспечение также может определять возможность использования вложенных прерываний. В режиме, не разрешающим использование вложенных прерываний, все запросы на прерывания автоматически маскируются при входе в подпрограмму обслуживания прерываний. В режиме, разрешающим использование, процессор определяет и обслуживает прерывания с высшим приоритетом. То Edashkin - перевод, конечно, не очень, но в оригинале это тоже должно быть, посмотрите чуть выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edashkin 0 23 ноября, 2005 Опубликовано 23 ноября, 2005 · Жалоба Разумеется, прерывания более низкого приоритета маскируются внутри цикла обработки прерывания с более высоким приоритетом. Поэтому я и писал, что их нужно разрешить внутри обработчика. Только что проверил - всё работает. Пример: #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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Виктория 0 23 ноября, 2005 Опубликовано 23 ноября, 2005 · Жалоба Не очень показательный тест. ;) Прерывание по таймеру срабатывает после выхода из обработчика прерывания по приему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edashkin 0 23 ноября, 2005 Опубликовано 23 ноября, 2005 (изменено) · Жалоба 1. Прерывание от таймера разрешено только во время действия прерывания по приёму (IMASK восстанавливается из стека по RTI) 2. В обработчике прерывания по приёму стоит IDLE. Выход из спячки возмоден только по прерыванию. Изменено 23 ноября, 2005 пользователем Edashkin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Виктория 0 23 ноября, 2005 Опубликовано 23 ноября, 2005 · Жалоба Все теперь понятно. :a14: Действительно, все как у всех (маскирование в самом обычном смысле). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться