2014-11-18 10 views
0

끝에서 시작하겠습니다.안드로이드 Native C++와 함께 응용 프로그램 주소 공간 외부에 R/W 등록

최종 목표는 프리 스케일 i.MX 6Solo 프로세서의 레지스터에 직접 액세스 할 수있는 Android NDK로 C/C++ 라이브러리를 구축하여 하드웨어 GPIO, SPI, I2C 및 I/O를 제어 할 수있는 방법을 구현할 수 있도록하는 것입니다. Java의 PWM. 일단 네이티브 라이브러리의 메소드를 빌드하고 컴파일하면 나머지 프로젝트 동안 안드로이드 프로그래머에게 제공 될 것입니다. 내 배경은 주로 C/C++ 마이크로 컨트롤러 개발이지만 자바로 지향되고있다.

내 질문 :

내가 성공적으로 기록하고 네이티브 C++ 코드를 컴파일 및 Java에서 호출하는 데 성공했다. 테스트 프로그램도 대상 프로세서에서 실행되지만 원하는 CPU 레지스터에 직접 쓰는 원시 메서드를 호출하면 시스템이 멈추고 LogCat에서 오류가 발생합니다.

0x20E015C의 치명적인 신호 11 (SIGSEGV) 코드 = 1), 스레드 3699 (xamp의 le.nativecall)

신호 (11)과 분할 결함 (SIGSEGV는) 내 응용 프로그램이 난 것을 정확히입니다 주소 공간의 외부 메모리 에 액세스하려고한다는 것을 의미 레지스터 0x020E015C에 쓰기를 시도합니다.

제 질문은 다음과 같습니다. 어떻게 성공적으로 응용 프로그램 주소 공간 외부의 레지스터에 쓸 수 있습니까?

내가 this site under "Variable Base Addresses"에 포함 된 가상 ADRESS 공간이있어 상황의 유망 기술을 발견,하지만 몇 가지 문제의 이해를 가지고 그가 제안하는 솔루션을 구현 해요 : 내가 지금까지 노력이 무엇

. 기록을 위해, 내가 레지스터를 수정하려고하는 라인이다 : 나는 이전에 GPIO4_16MUX을 정의한

*(volatile uint32_t *)GPIO4_16MUX = 0x00000005; 

는 0x20E015C합니다.

소프트웨어 및 하드웨어 :

안드로이드 ADK 이클립스, 코어 텍스 A9 i.MX 6Solo와 NDK의 RC10와 안드로이드 4.3, 폭동 보드 건물입니다.

+0

응용 프로그램 샌드 박스를 우회하려고합니다 (NDK도 샌드 박스에 있음). Java 코드에 액세스 할 수있는 자체 하드웨어 드라이버/서비스를 작성하거나 작성할 수있는 Android의 사용자 정의 빌드가 필요합니다.또는 Android 용 USB 액세서리를 만드는 것을 고려해보십시오. –

+0

다행스럽게도 보드가 잠긴 부트 로더가있는 플랫폼처럼 보이지 않으므로 다른 임베디드 리눅스와 마찬가지로 사용자 정의를 할 수 있습니다. –

답변

0

안드로이드와 같은 정상적인 보호 메모리 환경에서 한 프로세스는 임의의 절대 메모리 주소에 액세스 할 수 없습니다. 어쨌든 응용 프로그램 내에서 가상 메모리 주소 공간 만 볼 수 있습니다. 매핑은 커널에 의해 설정됩니다. 0x20E015C 주소가 프로세스 내에서 읽기/쓰기 가능하다고해도 하드웨어 수준에서 0x20E015C로 매핑된다는 것을 의미하지는 않습니다.

이 메모리를 프로세스 (또는 모든 프로세스)에 구체적으로 매핑하려면 커널을 수정하거나 레지스터를 유닉스 char/block 디바이스로 노출시키는 커널 드라이버를 생성해야합니다. 그런 다음 일반 유닉스 권한을 통해 장치에 액세스 할 수있는 권한을 관리 할 수 ​​있으며 장치에 액세스 할 수있는 모든 사용자 수준 프로세스가이를 제어 할 수 있습니다.