Нашата група използва персонализиран драйвер за свързване на четири 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())
?