Tôi có thể có 1 lõi xử lý chỉ cho chương trình của mình không?


12

Tôi phải tính thời gian chênh lệch thời gian giữa cao -> thấp và thấp -> cạnh tín hiệu cao trên các chân GPIO. Tôi đã viết chương trình đơn giản mà làm điều này. Sau khi chạy nó một thời gian, tôi khá hài lòng với kết quả (biến thể 0,01 giây). Nhưng theo thời gian đã có lỗi 0,5 s. Tôi đã nghĩ rằng điều này có thể là do một số quy trình hệ thống khác đang chạy vào thời điểm đó. Vì vậy, câu hỏi của tôi là:

Tôi có thể dự trữ một lõi xử lý chỉ cho chương trình của mình và để 3 lõi khác cho hệ thống không?

Tôi đang sử dụng Raspbian Jessie Lite, vì vậy tôi nghĩ rằng 3 lõi sẽ đủ để chạy nó.


4
Tôi giả sử bạn đang bỏ phiếu trong một vòng lặp cho trạng thái của pin GPIO. Điều này rất dễ bị ảnh hưởng bởi cách hệ điều hành quyết định thực thi chương trình của bạn, điều này sẽ dành phần lớn thời gian để giữ CPU bận rộn trong khi không làm gì thực sự hữu ích. Bạn có thể muốn xem xét cách thiết lập ngắt trên chân GPIO cụ thể, bạn có thể sử dụng để cho chương trình của mình ngủ giữa các cạnh tín hiệu trên các chân GPIO.
Florian Castellane

4
Không chắc chắn về dự án của bạn, nhưng đôi khi Vi điều khiển phù hợp hơn, đặc biệt là khi bạn cần nhiều hệ thống giống như thời gian thực hơn. Arduino cung cấp rất nhiều tùy chọn và bạn có thể viết chương trình của mình bằng C / C ++.
SnakeDoc

@Florian Có một chức năng trong RPi.GPIO tương tự như ngắt. Nó sẽ chặn chương trình cho đến khi cạnh được phát hiện (nguồn: sourceforge.net/p/raspberry-gpio-python/wiki/Inputs ).
NonSt ChuẩnModel

@SnakeDoc Tôi biết rằng vi điều khiển là tốt hơn. Tôi đã hy vọng tránh nó, bởi vì tôi không cần độ chính xác của micro giây. 1/100 của một giây là quá đủ. Ngoài ra tôi chỉ cần thời gian khác nhau, vì vậy nếu có sự chậm trễ, tôi đã hy vọng điều đó sẽ giống nhau khi bắt đầu và dừng lại. Nếu điều này không hiệu quả, tôi phải đi với bộ vi điều khiển được kết nối với RPi để lưu trữ dữ liệu.
NonSt ChuẩnModel

1
Hoặc có được hệ điều hành Realtime chạy trên PI. Vấn đề với thiết lập của bạn, là nó phụ thuộc vào "nỗ lực tốt nhất" của HĐH. Tùy thuộc vào những gì khác đang diễn ra cùng lúc chương trình của bạn yêu cầu quyền truy cập đặc quyền vào GPIO, nó có thể bị xếp hàng sau các tác vụ khác mà HĐH đang thực hiện ngay lúc đó. Chương trình người dùng của bạn sẽ có mức độ ưu tiên thấp hơn các tác vụ hệ thống. Ngoài ra còn có quyền ưu tiên, có nghĩa là trong thời gian chạy chương trình của bạn, hệ điều hành có thể bị "tạm dừng và" đặt sang một bên "để một quy trình khác chạy, nghĩa là các quan sát thời gian của bạn có thể bị sai lệch.
SnakeDoc

Câu trả lời:


13

Dành một lõi có lẽ là quá mức cần thiết.

Tôi đề nghị bạn thử thư viện pigpio của tôi . Theo mặc định, thời gian GPIO sẽ thay đổi trong vòng 10 phút.

Để kiểm tra nhanh, tôi khuyên bạn nên xem ví dụ Python này , nó sẽ in bất kỳ chuyển đổi cấp GPIO nào và thời gian tính bằng micrô giây kể từ lần chuyển đổi cuối cùng trên GPIO đó.

pigpio không được cài đặt theo mặc định trong Jessie Lite. Hoặc cài đặt mới nhất từ ​​trang web được liên kết hoặc cài đặt phiên bản cũ hơn trong kho.

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)

Tôi sẽ thử thư viện pigpio của bạn. Ngay bây giờ tôi phải hoàn thành một dự án khác, nhưng tôi sẽ quay lại vấn đề này. Tôi sẽ báo cáo lại sau vài tuần nữa. Cảm ơn bạn!
NonSt ChuẩnModel

4

Bạn có thể khóa chương trình của mình vào một lõi bằng cách sử dụng schedutilsnhư được mô tả trong bài viết này của Cyberciti :

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

Các quy trình khác vẫn có thể được lên lịch trên cùng một lõi, mặc dù. Vì vậy, điều thứ hai cần làm là đảm bảo lệnh của bạn chạy với mức ưu tiên cao nhất bằng cách sử dụng lệnh đẹp (điều này sẽ cho hạt nhân Linux biết rằng các quy trình khác sẽ được xử lý trước nếu cần). Bắt đầu chương trình của bạn theo cách này:

nice -n -20 your-program

Có một số lý do có thể khác cho vấn đề thời gian của bạn. Đây không phải là dễ dàng để làm bất cứ điều gì về:

  • Nếu bạn đang lập trình bằng Python, có một trình thu gom rác đôi khi tạm dừng chương trình của bạn để giải phóng bộ nhớ không sử dụng.
  • Ngắt làm cho CPU xử lý một cái gì đó khác hơn bạn muốn. Ví dụ, các gói mạng hoặc đầu vào / đầu ra khác.
  • Nếu chương trình của bạn ngủ nhiều, có thể có các quy trình khác lấp đầy bộ đệm CPU (bộ đệm L1 / L2). Điều này buộc bạn phải chờ truy cập RAM.
    • Thậm chí tệ hơn nếu RAM của bạn đầy để quá trình của bạn bị tráo đổi ra đĩa vì thẻ SD bị chậm.

Có nhiều cách để làm cho quá trình của bạn theo thời gian thực , có nghĩa là nó sẽ chạy với các đảm bảo thời gian nhất định. Vấn đề với điều này là mọi thứ khác có thể chậm hơn, và nó là một chủ đề phức tạp. Nếu bạn muốn đi xuống lỗ thỏ này, tôi khuyên bạn nên bắt đầu đọc các quy trình thời gian thực trong Linux .


2
Thay vì tốt đẹp, tốt hơn là nên ưu tiên cho quy trình theo thời gian thực để đảm bảo nó chạy theo ưu tiên cho các quy trình không theo thời gian thực.
joan

Điểm tốt, tôi sẽ thêm vào một lưu ý về điều đó.
Emil Vikström

1
"gc.disable ()" điều gì xảy ra nếu bạn tắt trình thu gom rác?
Keine

@Keine Bạn có thể bị rò rỉ bộ nhớ. Giả sử bạn có một đối tượng A có một biến trỏ đến B. Python sẽ theo dõi tham chiếu này dưới dạng một số, nó biết rằng B có 1 đối tượng hướng về phía nó. Xóa A khi bạn không cần nó nữa. Số tham chiếu cho B sẽ giảm và nếu nó chạm 0 Python cũng có thể giải phóng B. Điều này được gọi là đếm tham chiếu. Nhưng bây giờ nói rằng B có một tham chiếu trở lại A. Bây giờ bạn có một cụm các đối tượng chỉ vào nhau. Không ai trong số họ sẽ đạt 0 và được giải thoát. GC có thể tìm thấy các cụm như vậy và loại bỏ chúng khi chương trình chính không trỏ "vào" cụm.
Emil Vikström

1
Tôi sẽ thêm các đề xuất bạn thực hiện cho dự án của tôi. Nhưng tôi hy vọng sẽ tránh được những chủ đề quá phức tạp. Trong trường hợp đó, tôi cho rằng tốt hơn là làm cho một bộ vi điều khiển phát hiện ngắt và kết nối nó với RPi chỉ để lưu dữ liệu. Cảm ơn bạn!
NonSt ChuẩnModel

2

Vì bạn đang có yêu cầu về thời gian, Raspberry Pi không còn là nền tảng thích hợp cho việc này. Nó không phải là một nền tảng thời gian thực và thời gian có thể bị loại bỏ bởi rất nhiều nguồn can thiệp khác nhau.

Thay vào đó, bạn nên sử dụng một vi điều khiển để đo thời gian này, tốt nhất là sử dụng các ngắt và truyền thông tin cho Pi sau đó.


1
Không thể có được các ngắt trên các chân GPIO trên Raspberry Pi?
Florian Castellane

Chắc chắn điều này phụ thuộc vào việc có bất kỳ phần nào khác trong các yêu cầu thiết kế làm cho máy linux phù hợp hơn MCU hay không. RPi có thể xử lý tốt nhiệm vụ này, cũng như MCU có tốc độ 10 MHz.
Sean Houlihane

1

Theo yêu cầu của bạn, tôi không nghĩ bạn cần sử dụng bộ xử lý lõi đơn. Những gì bạn cần là đảm bảo chương trình của bạn chạy mọi lúc. Để đạt được điều đó, bạn có thể đặt mức độ ưu tiên của chương trình rất cao, để nó không bị xáo trộn bởi bất kỳ quy trình nào khác.

Theo như tôi biết về HĐH (General Purpose OS), chúng tôi sử dụng không được thiết kế để sử dụng trong các hệ thống thời gian thực, vì vậy nếu bạn muốn chạy quy trình của mình trong thời gian thực để không có quá trình nào khác làm phiền nó, bạn cần phải đi cho hệ điều hành thời gian thực (RTOS). Có lẽ họ sẽ đưa ra lựa chọn cốt lõi. :)


1
Có RTOS miễn phí tốt ngoài đó?
Keine

RTLinux và Vxworks là những ví dụ về RTOS và chúng cũng tốt. Nhưng bạn cần nghiên cứu về HĐH (trọng tâm cho việc tạo ra nó) trước khi cài đặt, để nó có thể đáp ứng nhu cầu của bạn.
Vishwajeet Vishu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.