Raspberry Pi 2에서 코어 1,2,3을 시작하는 방법


10

나는 베어 메탈 멀티 코어 예제를 작성했습니다.

코드, 회로도는 여기에 있습니다-https: //github.com/jeffreyantony/multipi/tree/master/Example_01

이 예에서는 3 개의 LED가 라즈베리 Pi의 GPIO 핀에 연결되어 있습니다. Raspberry Pi 2에는 총 4 개의 코어가 있습니다. 각 코어에는 해당 LED가 깜박이도록 지정되어 있습니다.

코어 1의 경우 0x4000009C 코어 2의 경우 0x400000AC 코어 3의 경우 0x400000BC 각 코어에서 실행할 코드의 주소를 다음 주소에 썼습니다.

코드를 컴파일 한 후 코어 1에 할당 된 LED 만 깜박입니다 (이 예에 따라 노란색 LED). 다른 사람들은 그렇지 않습니다.

이는 다른 LED가 깜박이지 않기 때문에 코어 2 및 3의 코드가 실행되고 있지 않음을 의미합니다. 또한 모든 코어를 시작한 후 코드가 실행되지 않는 것을 발견했습니다. 즉 core0_submain ()-이 함수는 Raspberry Pi의 ACT LED를 깜박 여야합니다.

누구든지 문제가 무엇인지 알려 주실 수 있습니까? 4 개의 코어가 모두 동일한 GPIO 레지스터에 쓰려고 시도하고 쓰기에서 코어 1 만 승리하기 때문입니까?

" attribute ((naked));"를 추가하려고했습니다 . core0_submain ()의 경우 사용되지 않았습니다.

https://launchpad.net/gcc-arm-embedded 에서 툴체인을 사용하고 있습니다

다시 한번 코드-https: //github.com/jeffreyantony/multipi/blob/master/Example_01/main.c

makefile- https : //github.com/jeffreyantony/multipi/blob/master/Example_01/Makefile

2015 년 10 월 20 일 업데이트 : JTAG에 대한 지원을 추가했습니다. 그러나 디버그 인터페이스를 성공적으로 가져 오지 못했습니다 .
2015 년 10 월 25 일 : 문제가 해결되었습니다. 답을보십시오.

회로도 여기에 이미지 설명을 입력하십시오


정말 멋진 것 같습니다. 내가 살펴볼 게 내 말은, 라즈 비안에는 에너지 나 무언가를 절약하기 위해 다른 소프트웨어가 필요하지 않으면 1 코어만을 사용하는 소프트웨어가있을 수 있습니다.
Kachamenus

답변:


6

2015 년 10 월 25 일 업데이트 :

Raspberry Pi 포럼이 나에게 답을 주었다 .

  1. -nostdlib를 사용할 때 _start의 개념이 없습니다

  2. 먼저 실행될 코드는 링커에 전달되는 첫 번째 파일이어야합니다.

  3. 더 나은 제어가 필요한 경우 코드를 init 섹션에 배치하고 링커에게이 섹션을 복사하도록 요청해야합니다. 0x8000

지원해 주셔서 감사합니다. GNU C 컴파일러에 대해 많이 배웠습니다.

2015 년 10 월 24 일 업데이트 :

Makefile에서 컴파일을 위해 주어진 파일의 순서를 변경했을 때, 최적화를 통해 올바른 순서 (즉 0x8000, _start함수가 있음)를 얻었습니다 -O2. 그러나 여전히 _start기호 에 관한 아래의 스택 오버 플로우 질문 은 아직 해결되지 않았습니다. 새 코드가 체크인되었습니다.

나는 약간의 성공을 거두었 다. 새로운 코드는 github에 체크인 됩니다 .

예제가 완전히 실행되고 있지 않습니다. 컴파일에 문제가 있습니다. 나는 각각을 설명 할 것이다 :

  1. 실제로 나는 _start내 사용자 지정 시작에서 기호가 나타날 것으로 기대했습니다 . 그러나 그렇지 않았습니다. 이로 인해 스택 포인터가 구성되지 않았고 main으로 이동하지 않았습니다.

나는 이것에 대해 이미 질문 했다 . 그러나 나는 많은 진전이 없었습니다. 그래서 메인 함수에 스택 포인터를로드하기 위해 인라인 어셈블리를 추가했습니다.

  1. 그러나 여전히 코드가 실행되지 않았습니다. 어셈블리 목록을 확인했을 때 0x8000Raspberry Pi의 주소 (실행이 시작되는 위치)가 Core 1-코드입니다 void core1_main(void). 필자 0x8000_start(start.S 파일이 컴파일에 사용되지 않은 이후) 또는 적어도 void main (void) 함수 가있을 것이라고 가정했습니다 . 이것은 -O2GCC 최적화로 인해 발생 합니다. GCC에서는 최적화 수준이 높을수록 기능이 재정렬됩니다. 최적화 ( -O0)를 끈 다음 address 0x8000에 주가있었습니다.

여기에서 함수 순서 변경에 대해 읽을 수 있습니다

요약 : 현재 코드는 단지 수정입니다. 해결해야 할 주요 문제-왜 start_S에서 _start가 호출되지 않습니까? 이것이 수정되면 주소 0x8000 _start가 올 것입니다. 이를 통해 우리는 더 높은 최적화 중에 GCC가 수행하는 기능 순서에 신경 쓸 필요가 없습니다.

증거로 내 측면 의 데모 비디오 도 있습니다 . 코드에서 LED 깜박임 속도가 다르고 주기적이지만 모든 코어가 동일한 GPIO 레지스터에 쓰려고 시도하기 때문에 충돌이 발생하여 LED가 임의 간격으로 깜박입니다.


멀티 코어 데이터를 화면에 표시하는 방법에 대한 Htop 소스 코드를 살펴보십시오.
Piotr Kula

3
@ppumkin 그것은 무의미합니다. htop* nix 기반 사용자 랜드 도구입니다. 리눅스에서는 커널을 통해 정보를 얻습니다 /proc. 이것은 베어 메탈 제품입니다. 쿼리 할 커널이 없습니다.
goldilocks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.