ฉันสามารถมีแกนประมวลผล 1 ตัวสำหรับโปรแกรมของฉันได้หรือไม่


12

ฉันต้องใช้เวลากับความแตกต่างของเวลาระหว่าง high -> low และ low -> edge high edge edge บน GPIO ฉันได้เขียนโปรแกรมง่ายๆที่ทำสิ่งนี้ หลังจากใช้ไประยะหนึ่งแล้วฉันก็พอใจกับผลลัพธ์ที่ได้ (0.01 s รุ่น) แต่บางครั้งก็มีข้อผิดพลาดเหมือน 0,5 วินาที ฉันคิดว่าอาจเป็นเพราะกระบวนการของระบบอื่นกำลังทำงานอยู่ในขณะนั้น ดังนั้นคำถามของฉันคือ:

ฉันสามารถจองคอร์โปรเซสเซอร์หนึ่งแกนสำหรับโปรแกรมของฉันและปล่อยให้ 3 คอร์อื่น ๆ สำหรับระบบได้หรือไม่

ฉันใช้ Raspbian Jessie Lite ดังนั้นฉันคิดว่า 3 คอร์จะเพียงพอที่จะรันได้


4
ฉันคิดว่าคุณกำลังสำรวจในสถานะของพิน GPIO สิ่งนี้มีความอ่อนไหวอย่างมากต่อวิธีที่ระบบปฏิบัติการตัดสินใจใช้งานโปรแกรมของคุณซึ่งจะใช้เวลาส่วนใหญ่ในการทำให้ CPU ไม่ว่างขณะที่ไม่ได้ทำอะไรที่เป็นประโยชน์จริง ๆ คุณอาจต้องการดูวิธีตั้งค่าการขัดจังหวะบนพิน GPIO ที่กำหนดซึ่งคุณสามารถใช้เพื่อให้โปรแกรมของคุณพักระหว่างขอบสัญญาณบนพิน GPIO
Florian Castellane

4
ไม่แน่ใจว่าโครงการของคุณเป็นอย่างไร แต่บางครั้ง Microcontroller ก็เหมาะสมกว่าโดยเฉพาะเมื่อคุณต้องการระบบที่เหมือนเรียลไทม์มากขึ้น Arduino มีตัวเลือกมากมายและคุณสามารถเขียนโปรแกรมของคุณใน C / C ++
SnakeDoc

@ Florian มีฟังก์ชั่นใน RPi.GPIO ที่คล้ายกับการขัดจังหวะ มันจะบล็อกโปรแกรมจนกว่าตรวจพบขอบ (แหล่งที่มา: sourceforge.net/p/raspberry-gpio-python/wiki/Inputs )
NonStandardModel

@SnakeDoc ฉันรู้ว่าไมโครคอนโทรลเลอร์ดีกว่า ฉันหวังว่าจะหลีกเลี่ยงเพราะฉันไม่ต้องการความแม่นยำระดับไมโครวินาที 1/100 วินาทีนั้นมากเกินพอ นอกจากนี้ฉันต้องการเวลาที่แตกต่างกันดังนั้นหากมีความล่าช้าฉันหวังว่าจะเหมือนกันสำหรับการเริ่มต้นและหยุด หากไม่สามารถใช้งานได้ฉันต้องใช้ไมโครคอนโทรลเลอร์ที่เชื่อมต่อกับ RPi เพื่อจัดเก็บข้อมูล
NonStandardModel

1
หรือทำให้ระบบปฏิบัติการเรียลไทม์ทำงานบน PI ปัญหาเกี่ยวกับการตั้งค่าของคุณนั้นขึ้นอยู่กับ "ความพยายามอย่างดีที่สุด" ของระบบปฏิบัติการ ขึ้นอยู่กับสิ่งที่เกิดขึ้นในเวลาเดียวกันกับที่โปรแกรมของคุณร้องขอการเข้าถึง GPIO ที่มีสิทธิพิเศษมันอาจถูกจัดคิวไว้หลังงานอื่น ๆ ที่ระบบปฏิบัติการกำลังทำงานในทันทีนั้น คุณเป็นโปรแกรมที่ผู้ใช้จะได้รับความสำคัญต่ำกว่างานระบบ นอกจากนี้ยังมีใบจองซึ่งหมายความว่าในระหว่างรันไทม์ของโปรแกรมของคุณมันอาจ "หยุดชั่วคราว" โดย "ระบบปฏิบัติการ" สำหรับกระบวนการอื่นที่จะเรียกใช้ซึ่งหมายความว่าการสังเกตเวลาของคุณอาจจะเบ้
SnakeDoc

คำตอบ:


13

การอุทิศแก่นน่าจะมากไป

ฉันขอแนะนำให้คุณลองใช้ห้องสมุดpigpioของฉัน โดยค่าเริ่มต้นมันจะเปลี่ยนเวลาระดับ GPIO ภายใน 10 .s

จากการทดสอบอย่างรวดเร็วฉันขอแนะนำให้คุณดูตัวอย่าง Pythonนี้ซึ่งจะพิมพ์การเปลี่ยนแปลงระดับ GPIO ใด ๆ และเวลาเป็นไมโครวินาทีนับตั้งแต่การเปลี่ยนแปลงครั้งล่าสุดใน GPIO นั้น

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

คุณสามารถล็อคโปรแกรมของคุณเป็นหนึ่งคอร์โดยใช้schedutilsตามที่อธิบายไว้ในบทความ Cyberciti นี้ :

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

กระบวนการอื่น ๆ ยังคงสามารถกำหนดเวลาไว้ในแกนหลักเดียวกันได้ ดังนั้นสิ่งที่สองที่ต้องทำคือให้แน่ใจว่าคำสั่งของคุณรันด้วยลำดับความสำคัญสูงสุดโดยใช้คำสั่งnice (ซึ่งจะบอกเคอร์เนล Linux ว่ากระบวนการอื่น ๆ ควรถูกจองไว้ล่วงหน้าหากจำเป็น) เริ่มโปรแกรมของคุณด้วยวิธีนี้:

nice -n -20 your-program

มีสาเหตุอื่นที่เป็นไปได้สำหรับปัญหาเรื่องเวลาของคุณ สิ่งเหล่านี้ไม่ใช่เรื่องง่ายที่จะทำอะไรเกี่ยวกับ:

  • หากคุณกำลังเขียนโปรแกรมใน Python มีตัวรวบรวมขยะที่บางครั้งจะหยุดโปรแกรมของคุณเพื่อเพิ่มหน่วยความจำที่ไม่ได้ใช้
  • อินเตอร์รัปต์ทำให้ CPU จัดการอย่างอื่นที่คุณต้องการ ตัวอย่างเช่นแพ็คเก็ตเครือข่ายหรืออินพุต / เอาท์พุตอื่น ๆ
  • หากโปรแกรมของคุณกำลังหลับมากอาจมีกระบวนการอื่นที่เติมแคช CPU (แคช L1 / L2) นี่เป็นการบังคับให้คุณรอการเข้าถึง RAM
    • ยิ่งแย่ไปกว่านั้นถ้า RAM ของคุณเต็มเพื่อที่กระบวนการของคุณจะถูกสลับไปที่ดิสก์เพราะการ์ด SD เป็นสิ่งที่ไม่ดี

มีวิธีที่จะทำให้กระบวนการของคุณเรียลไทม์ซึ่งหมายความว่ามันจะทำงานด้วยการรับประกันเวลาที่แน่นอน ปัญหานี้คือทุกอย่างอื่นอาจช้าลงและเป็นหัวข้อที่ซับซ้อน หากคุณต้องการที่จะไปลงหลุมกระต่ายนี้ผมแนะนำให้คุณเริ่มต้นการอ่านขึ้นในกระบวนการเวลาจริงในลินุกซ์


2
จะดีกว่าถ้าให้ลำดับความสำคัญแบบเรียลไทม์ของกระบวนการซึ่งจะทำให้แน่ใจได้ว่ามันจะทำงานตามความต้องการของกระบวนการที่ไม่ใช่แบบเรียลไทม์
joan

จุดดีฉันจะเพิ่มในบันทึกเกี่ยวกับที่
Emil Vikström

1
"gc.disable ()" จะเกิดอะไรขึ้นหากคุณปิดใช้งานตัวรวบรวมขยะ
Keine

@Keine คุณสามารถทำให้หน่วยความจำรั่ว สมมติว่าคุณมีวัตถุ A ที่มีตัวแปรที่ชี้ไปที่ B. Python จะติดตามการอ้างอิงนี้เป็นตัวเลขมันรู้ว่า B มี 1 วัตถุที่ชี้ไปที่มัน ลบ A เมื่อคุณไม่ต้องการใช้อีกต่อไป จำนวนการอ้างอิงสำหรับ B จะลดลงและถ้ามันเข้าชม 0 Python ก็สามารถทำให้ B เป็นอิสระได้เช่นกัน สิ่งนี้เรียกว่าการนับการอ้างอิง แต่ตอนนี้บอกว่า B มีการอ้างอิงกลับไปที่ A ตอนนี้คุณมีกลุ่มวัตถุที่ชี้ไปยังกันและกัน จะไม่มีการกดปุ่มใด ๆ เป็น 0 และจะถูกปล่อยให้เป็นอิสระ GC สามารถค้นหากลุ่มดังกล่าวและลบออกเมื่อโปรแกรมหลักไม่ชี้ "เป็น" คลัสเตอร์
Emil Vikström

1
ฉันจะเพิ่มข้อเสนอแนะที่คุณทำกับโครงการของฉัน แต่ฉันหวังว่าจะหลีกเลี่ยงหัวข้อที่ซับซ้อนเกินไป ในกรณีนั้นฉันคิดว่าเป็นการดีกว่าที่จะทำการตรวจจับไมโครคอนโทรลเลอร์ขัดจังหวะและเชื่อมต่อกับ RPi เพื่อบันทึกข้อมูล ขอบคุณ!
NonStandardModel

2

เนื่องจากคุณมีข้อกำหนดเกี่ยวกับเวลา Raspberry Pi จึงไม่ใช่แพลตฟอร์มที่เหมาะสมสำหรับเรื่องนี้อีกต่อไป มันไม่ใช่แพลตฟอร์มแบบเรียลไทม์และจังหวะเวลาสามารถถูกรบกวนได้ด้วยแหล่งรบกวนที่แตกต่างกันมากมาย

แต่คุณควรใช้ไมโครคอนโทรลเลอร์เพื่อวัดเวลานี้ควรใช้การขัดจังหวะและส่งข้อมูลไปยัง Pi ในภายหลัง


1
เป็นไปไม่ได้ไหมที่จะขัดจังหวะด้วยหมุด GPIO บน Raspberry Pi?
Florian Castellane

แน่นอนขึ้นอยู่กับว่ามีส่วนอื่น ๆ ของข้อกำหนดการออกแบบที่ทำให้เครื่อง linux เหมาะสมกว่า MCU RPi สามารถจัดการงานนี้ได้ดีเช่นเดียวกับ MCU ที่ 10 MHz
Sean Houlihane

1

ตามความต้องการของคุณฉันไม่คิดว่าคุณจะต้องใช้โปรเซสเซอร์แกนเดียว สิ่งที่คุณต้องการคือทำให้โปรแกรมของคุณทำงานตลอดเวลา เพื่อให้บรรลุผลนั้นคุณสามารถกำหนดลำดับความสำคัญของโปรแกรมของคุณให้สูงมากเพื่อไม่ให้รบกวนกระบวนการอื่นใด

เท่าที่ฉันรู้ระบบปฏิบัติการ (ระบบปฏิบัติการทั่วไป) ที่เราใช้นั้นไม่ได้ถูกออกแบบมาให้ใช้ในระบบเรียลไทม์ดังนั้นหากคุณต้องการเรียกใช้กระบวนการของคุณแบบเรียลไทม์เพื่อไม่ให้กระบวนการอื่นรบกวนคุณต้องไป สำหรับ OS แบบเรียลไทม์ (RTOS) บางทีพวกเขาจะเกิดขึ้นกับการเลือกหลัก :)


1
มี RTOS ฟรีที่ดีอยู่ที่นั่นไหม?
Keine

RTLinux และ Vxworks เป็นตัวอย่างของ RTOS และเป็นสิ่งที่ดีเช่นกัน แต่คุณต้องศึกษาเกี่ยวกับระบบปฏิบัติการ (อะไรคือจุดเน้นของการสร้าง) ก่อนติดตั้งเพื่อให้สามารถตอบสนองความต้องการของคุณได้
Vishwajeet Vishu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.