INtime Tech

INtime Top


APIC 대응을 위한 코드 변경


처음에 INtime2.23 버젼으로부터 새롭게 APIC*1 하드웨어 플랫폼 환경이 서포트되었습니다.  APIC 하드웨어 플랫폼의 이점은, 종래 IRQ0~IRQ15까지 제한되고 있던 IRQ 번호를 그 이상으로 증설할 수 있는 점에 있습니다.  따라서 INtime의 어플리케이션도 IRQ15차례 이상으로 할당할 수 있고 있는 PCI 디바이스를 취급할 수 있게 되었습니다. 다만 INtime2.23 버젼 이전에 만들어진 어플리케이션은 부분적인 코드의 변경을 수반합니다.
여기에서는 코드 변경이 필요한 이유나 변경 포인트를 해설합니다.

코드 변경이 필요한 이유

INtime2.23 버젼 이전에 만들어진 어플리케이션은, IRQ0~IRQ15만을 고려해 만들어져 있기 위해서, 그 이상의 번호를 가진 IRQ에 대응할 수 없습니다.

 

코드 변경의 포인트 1

■PCI 디바이스의 인터럽트 레벨을 산출하고 있는 부분

PCI 디바이스의 인터럽트를 사용하고 있던 INtime 어플리케이션을 APIC 환경상에서 동작할 수 있도록 하려면 , 약간의 수정이 필요한 점에 주의해 주세요.
종래의 INtime 위저드에 의해서 생성된 함수 GetPciInterruptLevel()는, PCI 디바이스에 할당 되고 있는 IRQ 번호로부터 INtime 인터럽트 레벨치에의 변환을 실시하기 위해서 배열을 참조하고 있었습니다. 그러나 이 점은 APIC 시스템에 대해 수많은 IRQ 번호를 서포트하는 경우의 장해가 됩니다. 따라서 이 인터럽트 레벨치 산출 처리는, 이하와 같은 계산식에서 행하도록 해 주세요.이 계산식에서는 APIC 대응이 아닌 플랫폼에 대해도 종래대로의 올바른 동작을 유지할 수 있습니다.

 
level = (irq < 8) ? (irq*16 + 8) : ((1 + irq/8) * 16 + (irq % 8));

【변경예】

 
WORD GetPciInterruptLevel( WORD wPciVendorId ,WORD wPciDeviceId )
 {
 
     PCIDEV  dev;
     WORD    level;
     BYTE    irq;
 
 
     dev.wVendorId = wPciVendorId;
     dev.wDeviceId = wPciDeviceId;
     dev.wDeviceIndex = 0;          // 처음에 발견된 디바이스
     if (!PciFindDevice(&dev))
         return 0xFFFF;          // 디바이스는 없습니다
 
     if (dev.byIntLine == 0 || dev.byIntLine == 255)
         return 0xFFFF;          // IRQ는 발견되지 않습니다
 
     irq = dev.byIntLine;
     level = (irq < 8) ? (irq*16 + 8) : ((1 + irq/8) * 16 + (irq % 8));
     return level;
 }

 

코드 변경의 포인트 2

■SetRtInterruptHandler() 콜의 사전 처리
INtime2.23 버젼으로부터 프로세스내 최상위priority 설정 룰로 변경이 이루어졌으므로 주의해 주세요. 인터럽트를 사용하는 INtime 어플리케이션에 대해서는, 인터럽트 핸들러 등록이나 인터럽트 스레드의 생성을 실행하기 전에, 생성되는 인터럽트스레드의 priority를 고려해, 프로세스내 최상위priority를 충분히 높게(수치적으로 작게) 설정할 필요가 있는 점은 종래 대로입니다만, 이 때 프로세스내 최상위priority를 4 이하의 값으로 변경할 필요가 있습니다. 실제로는 값제로를 지정하는 것을 추천합니다.

 
SetRtProcessMaxPriority( NULL_RTHANDLE, 0 );
 
이 대책을 하지 않았다고 SetRtInterruptHandler() 콜은 실패해, 파라미터 
에러(E_PARAM:0x8004)를 스테이터스로서 반환합니다.

 

패치 프로그램의 적용

INtime2.23 버젼 출하 후에 발견된 기종 의존의 APIC에 관한 문제를 회피하기 위해서 패치 프로그램INpatch의 적용을 추천합니다.

 

관련 정보

*1 Advanced Programable Interrupt Controller


HOME | INtime