내 프로그램 용으로 하나의 프로세서 코어를 가질 수 있습니까?


12

GPIO 핀에서 높음-> 낮음-> 낮음-> 높은 신호 에지 사이의 시간차를 측정해야합니다. 나는 이것을하는 간단한 프로그램을 작성했다. 얼마 동안 실행 한 결과 (0,01의 변형)에 매우 만족했습니다. 그러나 때때로 0.5 초와 같은 오류가있었습니다. 나는 그 당시에 실행중인 다른 시스템 프로세스 때문일 수 있다고 생각했습니다. 그래서 내 질문은 :

프로그램 용으로 하나의 프로세서 코어 만 예약하고 시스템에 다른 3 개의 코어를 허용 할 수 있습니까?

나는 Raspbian Jessie Lite를 사용하고 있으므로 3 개의 코어로 충분하다고 생각합니다.


4
GPIO 핀의 상태에 대해 루프에서 폴링한다고 가정합니다. 이것은 운영 체제가 프로그램을 실행하기로 결정한 방식에 매우 취약합니다. 실제로 유용한 것은 없지만 CPU를 바쁘게 유지하는 데 대부분의 시간이 걸립니다. 주어진 GPIO 핀에서 인터럽트를 설정하는 방법을보고 싶을 수 있습니다. GPIO 핀의 신호 에지 사이에서 프로그램을 휴면 상태로 만들 수 있습니다.
Florian Castellane

4
프로젝트가 무엇인지 확실하지 않지만, 특히 실시간 시스템이 더 필요할 때 마이크로 컨트롤러가 더 적합합니다. Arduino는 많은 옵션을 제공하며 C / C ++로 프로그램을 작성할 수 있습니다.
SnakeDoc 2012

@Florian RPi.GPIO에는 인터럽트와 유사한 기능이 있습니다. 가장자리가 감지 될 때까지 프로그램을 차단합니다 (source : geforge.net/p/raspberry-gpio-python/wiki/Inputs ).
NonStandardModel

@SnakeDoc 마이크로 컨트롤러가 더 낫다는 것을 알고 있습니다. 나는 마이크로 초 정밀도가 필요하지 않기 때문에 그것을 피하기를 바랐습니다. 1/100 초이면 충분합니다. 또한 시간 차이 만 있으면되므로 지연이 있으면 시작 및 중지와 동일 할 것으로 기대했습니다. 이것이 작동하지 않으면 데이터를 저장하기 위해 RPi에 연결된 마이크로 컨트롤러를 사용해야합니다.
NonStandardModel

1
또는 PI에서 실행중인 Realtime OS를 얻습니다. 설정 문제는 OS의 "최선의 노력"에 달려 있다는 것입니다. 프로그램이 GPIO에 대한 특권 액세스를 요청하는 동시에 진행중인 다른 작업에 따라 OS가 해당 순간에 수행중인 다른 작업 뒤에 대기 할 수 있습니다. 사용자 영역 프로그램은 시스템 작업보다 우선 순위가 낮습니다. 또한 선점 (preemption)도 있습니다. 즉, 프로그램 실행 중에 다른 프로세스를 실행하기 위해 OS에 의해 "일시 중지되고"비
켜져 "

답변:


13

핵심을 나타내는 것은 아마도 과잉 일 것입니다.

pigpio 라이브러리 를 사용해보십시오 . 기본적으로 GPIO 레벨이 10µs 이내로 변경됩니다.

빠른 테스트로 GPIO 레벨 전환과 GPIO의 마지막 전환 이후의 시간을 마이크로 초 단위로 인쇄하는 이 Python 예제 를 살펴볼 것을 제안합니다 .

기본적으로 pigpio는 Jessie Lite에 설치되지 않습니다. 연결된 사이트에서 최신 버전을 설치하거나 리포지토리에 이전 버전을 설치하십시오.

sudo apt-get install pigpio python-pigpio python3-pigpio

pigpio - Library for Raspberry Pi GPIO control
python-pigpio - Python module which talks to the pigpio daemon (Python 2)
python3-pigpio - Python module which talks to the pigpio daemon (Python 3)

나는 당신의 pigpio 라이브러리를 시도 할 것입니다. 지금은 다른 프로젝트를 끝내야하지만 이것으로 다시 돌아가겠습니다. 몇 주 후에 다시 신고하겠습니다. 감사합니다!
NonStandardModel

4

이 Cyberciti 기사에schedutils 설명 된대로 프로그램을 하나의 코어에 잠글 수 있습니다 .

sudo apt-get install schedutils
sudo taskset -c 3 -p 13545  # Lock PID 13545 to core 3

그러나 다른 프로세스는 여전히 동일한 코어에서 예약 될 수 있습니다. 따라서 두 번째로해야 할 일은 nice 명령을 사용하여 명령이 가장 높은 우선 순위로 실행되도록하는 것입니다 ( 필요한 경우 다른 프로세스가 선점 되어야 함을 Linux 커널에 알려줍니다 ). 이 방법으로 프로그램을 시작하십시오 :

nice -n -20 your-program

타이밍 문제에 대한 다른 가능한 이유가 있습니다. 이것들은 다음과 같이 쉬운 일이 아닙니다.

  • 파이썬으로 프로그래밍 하는 경우 가비지 수집기가 있어 때로는 사용하지 않는 메모리를 확보하기 위해 프로그램을 일시 중지합니다.
  • 인터럽트는 CPU가 원하는 것 이외의 것을 처리하게합니다. 예를 들어, 네트워크 패킷 또는 기타 입력 / 출력.
  • 프로그램이 많이 잠자기 상태이면 CPU 캐시 (L1 / L2 캐시)를 채우는 다른 프로세스가있을 수 있습니다. 그러면 RAM 액세스를 기다려야합니다.
    • SD 카드가 sloooow이기 때문에 프로세스가 디스크로 스왑되도록 RAM이 가득 찬 경우 더 나빠집니다.

프로세스를 실시간 으로 만드는 방법이 있습니다. 즉, 특정 타이밍 보장으로 실행됩니다. 이것의 문제는 다른 모든 것이 느려질 수 있으며 복잡한 주제입니다. 이 토끼 구멍을 내려 가고 싶다면 리눅스 에서 실시간 프로세스를 읽는 것이 좋습니다 .


2
비 실시간 프로세스보다 우선적으로 실행되도록 프로세스 우선 순위를 부여하는 것이 좋을 것보다는 좋은 것입니다.
joan

좋은 지적은, 그것에 대해 메모를 추가하겠습니다.
Emil Vikström

1
"gc.disable ()"가비지 수집기를 비활성화하면 어떻게됩니까?
Keine

@Keine 메모리 누수가 발생할 수 있습니다. B를 가리키는 변수가있는 객체 A가 있다고 가정 해보십시오. Python 은이 참조를 숫자로 추적합니다 .B는 객체를 가리키는 하나의 객체가 있음을 알고 있습니다. 더 이상 필요하지 않으면 A를 제거하십시오. B의 참조 횟수가 줄어들고 0에 도달하면 Python도 B를 해제 할 수 있습니다. 이것을 참조 횟수라고합니다. 하지만 지금 그 B가 기준이 있다고 다시 이제 서로를 가리키는 객체의 클러스터가 A로합니다. 그들 중 어느 것도 0을 치고 해제되지 않습니다. GC는 이러한 클러스터를 찾아 주 프로그램이 클러스터를 "지점"으로 가리 키지 않을 때 제거 할 수 있습니다.
Emil Vikström

1
프로젝트에 제안한 내용을 추가하겠습니다. 그러나 나는 너무 복잡한 주제를 피하기를 희망합니다. 이 경우 데이터를 저장하기 위해 마이크로 컨트롤러 인터럽트 감지를 만들고 RPi에 연결하는 것이 좋습니다. 감사합니다!
NonStandardModel

2

타이밍 요구 사항이 있으므로 Raspberry Pi는 더 이상 적합한 플랫폼이 아닙니다. 실시간 플랫폼이 아니며 많은 다른 간섭 원에 의해 타이밍이 중단 될 수 있습니다.

대신 마이크로 컨트롤러를 사용하여이 시간을 측정하고, 바람직하게는 인터럽트를 사용하여 나중에 Pi에 정보를 전달해야합니다.


1
그래도 Raspberry Pi의 GPIO 핀에서 인터럽트를받을 수 없습니까?
Florian Castellane

확실히 이것은 리눅스보다 머신을 MCU보다 더 적합하게 만드는 디자인 요구 사항의 다른 부분이 있는지에 달려 있습니다. RPi는 10MHz로 클럭 된 MCU와 마찬가지로이 작업을 잘 처리 할 수 ​​있습니다.
Sean Houlihane 2012

1

귀하의 요구 사항에 따라 단일 코어 프로세서를 사용해야한다고 생각하지 않습니다. 필요한 것은 프로그램이 항상 실행되도록하는 것입니다. 이를 달성하기 위해 프로그램의 우선 순위를 매우 높게 설정하여 다른 프로세스에 의해 방해받지 않도록 할 수 있습니다.

내가 사용하는 OS (범용 OS)를 알고있는 한 실시간 시스템에서 사용하도록 설계되지 않았으므로 프로세스를 실시간으로 실행하여 다른 프로세스가 방해하지 않도록하려면 이동해야합니다 실시간 OS (RTOS) 용. 아마도 그들은 핵심 선택을 할 것입니다. :)


1
무료 RTOS가 있습니까?
Keine

RTLinux와 Vxworks는 RTOS의 예이며 또한 좋습니다. 그러나 설치하기 전에 OS (생성에 중점을 두었던 것)에 대해 연구하여 요구 사항을 충족시킬 수 있어야합니다.
Vishwajeet Vishu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.