2012-01-06 4 views
4

내 개발을 위해 at91sam9260을 사용하고 있습니다. 리눅스 커널이 실행 중이고 그 위에 나 자신의 소프트웨어를 시작합니다.JTAG를 사용하여 임베디드 Linux에서 내 프로그램을 디버깅 할 수 있습니까?

Linux 커널에서 진행되는 작업을 많이 보지 않고 JTAG 디버거를 사용하여 소프트웨어를 디버깅 할 수 있는지 궁금합니다.

전체 Linux 실행을 보면서 소프트웨어를 디버깅하는 것이 매우 복잡해지기 때문에 나는 그것을 묻습니다.

다른 말로하면 JTAG 프로브로 디버깅 할 때 추상화 레이어가있을 수 있는지 알고 싶습니다.

답변

2

일반적으로 디버거는 프로세서에서 실행되는 소프트웨어와 아무 관련이 없습니다. 어디서 문제가 생길 수있는 곳은 캐시입니다. 예를 들어, 프로세서를 멈추고 램의 일부 명령어를 변경하고 다시 시작하려는 경우, 램의 명령어 변경은 명령어 캐시를 거치지 않고 데이터를 액세스하지만 데이터 캐시에 별도의 명령어 및 데이터 캐시가있는 경우 활성화되어 있고 수정 한 명령어 중 일부는 명령어 캐시에있는 주소에 있기 때문에 새롭고 오래된 명령어를 프로세서에 공급하면 상당히 엉망이 될 수 있습니다 . 리눅스는 캐시를 사용하기를 원한다.

두 번째는 mmu입니다. 프로세서/jtag는 실제 주소가 아닌 mmu 프로세서 쪽의 가상 주소에서 작동 할 가능성이 높습니다. 예를 들어 주소로 중단 점을 설정하면 하드웨어가 작동하는 방식에 따라 프로세서/프로세서의 디버그 장치와 운영 체제 작업이 같은 주소 공간에있는 다른 프로그램/스레드로 전환하면 올바른 주소의 잘못된 프로그램에서 중단 점이 발생합니다. 디버거/프로세서가 RAM의 명령어를 수정하여 중단 점을 설정하면 위의 캐시 문제로 실행되고, 캐시되지 않은 경우 올바른 스레드의 올바른 명령어가 중단되지만 캐시 문제가 발생합니다.

절대적으로 프로세서가 해당 프로세서에서 실행하기로 선택한 소프트웨어에 기반하여 변경되지 않는 JTAG 기반 디버깅을 지원하는 경우.

+0

답장을 보내 주셔서 감사합니다. 리눅스 커널의 최상위에서 실행하기 위해 더 적절한 다른 디버거를 사용하라고 권할지도 모른다. 사실, 현재 gdb를 사용하여 uart를 통해 내 프로그램을 디버깅하려고합니다. 그것은 내가 생각했던 것보다 조금 더 복잡합니다. 어쨌든 다시 고마워. – nomoney29

+0

동의하지 않음 : 멀티 태스킹 커널에서 실행되는 디버깅 응용 프로그램 코드는 가상 메모리와 별개로도 디버거를 구동하는 소프트웨어가 커널을 인식하지 못하는 경우 (또는 바람직하게는 커널과의 협력이 바람직하지 않은 경우) 상당히 추악 할 수 있습니다. 일반적으로 이러한 프로그램은 커널의 디버그 기능 (예 : ptrace)과 대상에서 실행되고 데이터 인터페이스를 통해 통신하는 디버그 스텁을 사용하여 디버깅됩니다.하드웨어 디버거는 커널 자체의 디버깅, 특히 초기 시작시 유용합니다. –

2

JTAG 장치 및 드라이버에 따라 다릅니다. 개인적으로, 나는 그 일을 할 수있는 장치를 하나만 알고 있습니다 : XDS560 + 코드 작곡가 스튜디오 (CCS). 그러나 다른 사람들도있을 수 있습니다.

장치 제조업체에 문의하는 것이 좋습니다.

3

아마도 내가 아는 한 대부분의 JTAG 디버거는 프로세서에서 중단 점을 설정할 수 있다고 가정합니다. 멀티 태스킹 OS에서는 OS 커널도 중지됩니다.

QNX와 같은 임베디드 OS에는 OS 커널 위에서 작동하고 이더넷을 통해 통신하는 디버거가 있습니다.

0

ARM의 경우 Asset Arium 제품군은 claimed이므로 응용 프로그램 코드를 디버깅 할 수 있습니다. 나는 그것을 시도하지 않았다.