먼저 디버깅 팁을 찾고 있습니다. 어떤 사람이 코드의 한 줄을 바꾸거나 문제를 해결하기 위해 설정할 주변 장치 설정 비트 하나를 지적 할 수 있다면 그것은 대단 할 것입니다. 그러나 그것은 내가 바라는 바가 아닙니다. 디버깅에 대한 자세한 내용을 찾고 있습니다.ARM 리눅스 커널 (msleep())을 디버깅하는 방법?
Google 검색 "msleep hang linux kernel site : stackoverflow.com"은 13 개의 대답을 내고 있는데 아무 것도 나오지 않으므로 묻는 것이 안전하다고 생각합니다.
임베디드 TI AM1808 ARM 프로세서 (Sitara/DaVinci?) 용 ARM Linux 커널을 재구성합니다. 모든 부트 로그가 login : 프롬프트에 직렬 포트에서 나오지만 로그인을 시도하면 응답이 없으며 입력 한 내용이 표시되지 않습니다.
많은 디버깅 후 커널에 도착하여 828과 830 사이에 디버깅 코드를 추가했습니다 (커널 버전은 2.6.37).
http://lxr.linux.no/linux+v2.6.37/init/main.c#L815
오른쪽 전에 라인 (830) 나는 영원히 루프의 printk를 추가하고 난 결과를 볼 : 'sbin에/초기화'가 호출되기 전에이 커널 모드에서이 지점에있다. 나는 약 2 시간 동안 뛰게하고 약 2 백만 건으로 계산한다. 샘플 라인 :dbg:init/main.c:1202: 2088430
따라서 문제없이 6000 만 바이트가 누출되었습니다.
그러나 루프에 msleep (1000)을 추가하면 msleep()이 반환되지 않고 한 번만 인쇄됩니다.
세부 사항 : 위에서 설명한 영원히 테스트 루프의 시작에서 설정 얻을 플래그에 조건이 응답 할 때 일정() 더 이상이라는 것을 보여줍니다하는 스케줄러에 라인 4073에서 조건부의 printk 추가 :
의 .config에서http://lxr.linux.no/linux+v2.6.37/kernel/sched.c#L4064
유일한 선택은/'장치 드라이버'입니다 차단 장치 I2C 지원 SPI 지원
커널과 램 디스크 loade 있습니다 d uboot/TFTP를 사용합니다. 이더넷을 사용하려고하지 않습니다. 이 모든 것이 '/ sbin/init'이전에 발생 했으므로, 거의 일어나지 않아야합니다.
세부 정보 : 동일한 CPU를 사용하는 보드가 매우 비슷합니다. 나는 같은 uImage와 같은 램 디스크를 실행할 수 있으며 거기서 잘 작동한다. 나는 로그인 할 수 있고 평범한 일을한다.
메모리 테스트를 실행했습니다 (총 64MB, 커널을 32M로 제한하고 다른 32M을 테스트, 단일 칩 DDR2). 아무런 문제가 없습니다. 하나의 보드가 UART0과 다른 UART2를 사용하지만 부팅 로그가 둘 다 나오기 때문에 문제가되지 않습니다.
모든 디버깅 정보를 제공해 주시면 대단히 감사하겠습니다. 적절한 JTAG가 없으므로 사용할 수 없습니다.
스케줄러가 일부 하드웨어 타이머에 의존 할 수 있습니까? 어쩌면 고장 났을까요? 또는 다른 io 주소를 사용합니까? –
내가 아는 한, 모든 것이 칩에 있어야한다. (나는 이중 값 체크를할만한 가치가있다.) 그래서 직렬 포트를 제외하고는 모두 동일한 환경을보아야한다. (모두 3 개가 활성화되어 있어야하며, 어느 것이 활성 상태인지 선택해야한다.) 타임 틱 IRQ를 찾아 거기에 printk를 추가하십시오. (찾을 수 있다면 :) – user1261470