Трябва ли моят манипулатор на прекъсвания да деактивира прекъсванията или ARM процесорът го прави автоматично?

Нашата група използва персонализиран драйвер за свързване на четири MAX3107 UART на споделена I2C шина. Прекъсванията на четирите MAX3107 са свързани (т.е. споделено прекъсване чрез logic or'ing)) към GPIO щифт на процесора ARM9 (модул LPC3180). Когато едно или повече от тези устройства прекъсват, те изтеглят GPIO линията, която е конфигурирана като прекъсване, чувствително към ниво, ниско. Въпросът ми се отнася до необходимостта или не да деактивирам конкретната линия за прекъсване в кода на манипулатора. (Трябва да добавя, че работим с Linux 2.6.10).

Въз основа на моето четене на няколко бележки за прекъсвания, специфични за ARM приложения, изглежда, че когато ARM процесорът получи прекъсване, той автоматично деактивира (маскира?) Съответния ред за прекъсване (в нашия случай това изглежда е редът, съответстващ на GPIO щифт, който избрахме). Ако това е вярно, тогава изглежда, че не трябва да деактивираме прекъсванията за този GPIO щифт в нашия код за обработка на прекъсвания, тъй като това би изглеждало излишно (въпреки че изглежда, че работи добре). Казано по различен начин, струва ми се, че ако ARM процесорът автоматично деактивира прекъсването на GPIO при възникване на прекъсване, тогава ако не друго, нашият код за обработка на прекъсвания трябва да активира отново прекъсването само след като устройството бъде обслужено.

Кодът на манипулатора на прекъсване, който използваме, включва disable_irq_nosync(irqno); в самото начало на манипулатора и съответния enable_irq() в края на манипулатора. Ако ARM процесорът вече е деактивирал линията за прекъсване (в хардуера), какъв е ефектът от тези повиквания (т.е. повикване към disable_irq_nosync(), последвано от повикване към enable(irq())?


person Jim Luby    schedule 12.01.2013    source източник
comment
Никога не съм откривал, че изрично повторно активирам прекъсвания на GPIO източник в миналото, когато съм ги използвал - основният манипулатор на прекъсвания на ядрото трябва да се грижи за изчистването и повторното активиране на източника на контролера за прекъсване, така че да няма опасност от получаване на прекъсване, докато все още обработвате първия. Единственото нещо, за което се сещам, е, че манипулаторът е написан да бъде прикрепен към няколко реда наведнъж. Не мисля, че трябва да имаш нужда от тези обаждания.   -  person marko    schedule 12.01.2013


Отговори (1)


От документацията на Arm Information Center:

При влизане в изключение (прекъсване):

  • заявките за прекъсване (IRQ) са деактивирани за всички изключения

  • заявките за бързо прекъсване (FIQ) са деактивирани за изключения FIQ и Reset.

След това се казва:

Боравенето с FIQ води до дезактивиране на IRQ и последващи FIQ, предотвратявайки тяхното обработване, докато манипулаторът на FIQ не ги активира. Това обикновено се прави чрез възстановяване на CPSR от SPSR в края на манипулатора.

Така че не е нужно да се притеснявате за деактивирането им, но трябва да се притеснявате за повторното им активиране.

Ще трябва да включите enable_irq() в края на вашата рутина, но не трябва да деактивирате нищо в началото. Не бих си помислил, че извикването на disable_irq_nosync(irqno) в софтуера, след като е било извикано в хардуера, ще повлияе на нещо. Тъй като хардуерното повикване определено се извиква, преди софтуерното повикване да има шанс да поеме. Но вероятно е по-добре да го премахнете от кода, за да следвате конвенцията и да не объркате следващия програмист, който го погледне.

Повече информация тук:

Информационен център за Arm

person Jimmy Johnson    schedule 12.01.2013
comment
OPs ISR се извиква от основния ISR на ядрото на Linux; не забравяйте, че има една линия за прекъсване. - person marko; 12.01.2013
comment
Други опции са да използвате дебъгер и да прегледате регистрите, за да видите какво всъщност се случва. Погледнете изходния код за изпълнението на вашите повиквания (ако използвате linux, той трябва да е достъпен от хранилището). Когато се занимавате с абстракция от C с такова ниско ниво, където имплементациите могат да бъдат много фини от чип до чип, понякога е по-добре да се поразровите малко в основния асемблерен код и да видите сами. - person Jimmy Johnson; 12.01.2013
comment
Здравей Марко – Когато в документацията на ARM се казва, че процесорът автоматично деактивира единичното прекъсване на нормалния IRQ, дали всички прекъсвания, нанесени (чрез контролера на прекъсване на ARM) към единичния IRQ, се деактивират, или само едно прекъсване, което е свързано с GPIO щифта? - Благодаря - Джим - person Jim Luby; 12.01.2013
comment
Благодаря за съвета, Marko и BeenCoding2Long. - Джим - person Jim Luby; 13.01.2013
comment
Ако процесорът на ARM автоматично деактивира локалните прекъсвания при обработка на прекъсвания, как да внедрите влагане на прекъсвания? - person Jams.Liu; 11.06.2019