Zynq ARM에서 소프트웨어 인터럽트를 전송하는 방법(레지스터 사용)

Zynq-7000을 사용할 때 소프트웨어 인터럽트를 적용하고 싶습니다. 하지만 그를 위한 라이브러리를 왠지 사용할 수 없다. 그렇다면 레지스터를 직접 두어야합니다.

그래서 레지스터를 조사했을 때의 메모

소프트웨어 생성 인터럽트용 레지스터 설명(원문)









내용 메모



본 느낌, 쉘상에서 devmem을 치는 것만으로 소프트웨어 인터럽트를 할 수 있을 것 같다

(※devmem<물리 주소(원문으로 말하는 Absolute Address)><사이즈>[쓰고 싶은 값])

레지스터에 기입하는 값은 이하를 참고로.
  • Reserved[31:26]
    의미는 없다. 나중에 사용할 수있는 장소
  • TargetListFilter[25:24]
    인터럽트 신호를 출력할 대상을 결정하는 영역.
    0b00 : CPUTargetList로 지정된 대상에 인터럽트 신호를 발행합니다.
    0b01 : 모든 CPU에 인터럽트 신호를 출력합니다.
    0b10 : 인터럽트 신호를 발행하는 CPU에만 발행
    0b11: 예약값. 의미가 없습니다
  • CPUTargetList[23:16]
    TargetListFilter로 0b00을 입력했을 때에 이용.
    예를 들어, CPUtargetList[0]은 CPU0을 의미한다. CPUTargetList[0]=1로 하면, CPU0에 인터럽트를 걸게 된다.
  • SATT[15]
    보안 관련 항목.
  • SBZ[14:4]
    SBZ가 누군지 모르겠다. 다른 자료를 읽으면 Reserve로 취급되므로 사용하지 않아도 괜찮습니까?
  • SGIINTID(INTID)[3:0]
    소프트웨어 인터럽트 ID 번호. 0~15로 선택.
    예 : 0b0011이면 인터럽트 ID는 3입니다

  • devmem으로 인터럽트를 보자.



    devmem 물리적 주소 크기 값
    예:

    devmem 0xF8F01F00 32 0x10000
    CPU0에 인터럽트 ID No.0의 인터럽트 송신(보안 없음)
    (이것은 아직 실제 기계로 시도하지 않았습니다. 시도하면 추가합니다)
    ※ 잘 작동했습니다. 인터럽트 신호가 위에서 전송할 수 있음을 확인했습니다.

    레지스터는 32bit에서 0b000000|00|00000001|00|00000000|0000

    매번, 그냥 메모 쓰기였습니다.

    참고문헌



    Zynq-7000 All Programmable SoC 기술 참조 매뉴얼

    ARM Generic Interrupt Controller Architecture Specification

    좋은 웹페이지 즐겨찾기