Linux: مشكلة توقيت تصدير gpio

تم إنشاؤها على ٢٧ مارس ٢٠١٤  ·  9تعليقات  ·  مصدر: raspberrypi/linux

إذا تم تنفيذ الأوامر الثلاثة التالية بشكل فردي من سطر الأوامر في Raspberry Pi باستخدام Raspbian (2014-01-07-wheezy-raspbian.zip) ، فحينئذٍ يتم تنفيذها بنجاح:

pi<strong i="6">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/unexport
pi<strong i="7">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/export
pi<strong i="8">@raspberrypi</strong> ~ $ echo out > /sys/class/gpio/gpio23/direction 
pi<strong i="9">@raspberrypi</strong> ~ $ 

ومع ذلك ، إذا تم تنفيذهما معًا على نفس السطر ، فهناك خطأ مرفوض في الإذن:

pi<strong i="13">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/unexport; echo 23 > /sys/class/gpio/export; echo out > /sys/class/gpio/gpio23/direction
-bash: /sys/class/gpio/gpio23/direction: Permission denied
pi<strong i="14">@raspberrypi</strong> ~ $ 

يحدث خطأ رفض الإذن لأن "echo out> / sys / class / gpio / gpio23 / direction" قيد التنفيذ قبل المجموعة وبت الأذونات لـ "/ sys / class / gpio / gpio23 / direction" تم تعيينها على القيم المناسبة . المجموعة وبتات الإذن هما "root" و "-rw-r - r--" ، لكن يجب أن تكون "gpio" و "-rwxrwx ---".

يمكن رؤية مشكلة التوقيت هذه في تسلسل الأوامر أدناه الذي يصدر gpio 23 ويسرد محتويات "/ sys / class / gpio / gpio23 /" مرتين. إخراج الأمر ls الأول مختلف تمامًا عن إخراج الأمر ls الثاني. تم تغيير كل من المجموعة والأذونات لجميع الملفات.

pi<strong i="19">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/unexport; echo 23 > /sys/class/gpio/export; ls -l /sys/class/gpio/gpio23/; ls -l /sys/class/gpio/gpio23/
total 0
-rw-r--r-- 1 root root 4096 Mar 27 21:51 active_low
-rw-r--r-- 1 root root 4096 Mar 27 21:51 direction
-rw-r--r-- 1 root root 4096 Mar 27 21:51 edge
drwxr-xr-x 2 root root    0 Mar 27 21:51 power
lrwxrwxrwx 1 root root    0 Mar 27 21:51 subsystem -> ../../../../class/gpio
-rw-r--r-- 1 root root 4096 Mar 27 21:51 uevent
-rw-r--r-- 1 root root 4096 Mar 27 21:51 value
total 0
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 active_low
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 direction
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 edge
drwxrwx--- 2 root gpio    0 Mar 27 21:51 power
lrwxrwxrwx 1 root gpio    0 Mar 27 21:51 subsystem -> ../../../../class/gpio
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 uevent
-rwxrwx--- 1 root gpio 4096 Mar 27 21:51 value

هل هذه مشكلة تحتاج إلى معالجة؟

التعليق الأكثر فائدة

هذه مشكلة مزعجة للغاية تتطلب حلولاً قبيحة. لا ينبغي أن يكون قد أغلق.

ال 9 كومينتر

لقد قمت للتو بتحرير المنشور أعلاه. في البداية لم يكن هناك أي من تكرارات "echo 23> / sys / class / gpio / unexport". يعد unexport ضروريًا فقط لإعادة gpio إلى حالته الأولية غير المُصدرة.

انا حصلت:

pi<strong i="6">@raspberrypi</strong>:~ $ ls -l /sys/class/gpio/
total 0
--w------- 1 root root 4096 Mar 27 17:41 export
lrwxrwxrwx 1 root root    0 Mar 27 17:41 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
--w------- 1 root root 4096 Mar 27 17:41 unexport
pi<strong i="7">@raspberrypi</strong>:~ $ echo 23 > /sys/class/gpio/unexport
-bash: /sys/class/gpio/unexport: Permission denied

وهو ما كنت أتوقعه. الجذر فقط لديه إذن للوصول إلى / sys / class / gpio / unexport ، لذلك عندما يحاول pi القيام بذلك بشكل صحيح ، يتم رفض الإذن.

إذا قمت بتشغيل "sudo su" أولاً ، فسيعمل الأمر كما هو متوقع.

هذا ما اعتدت الحصول عليه في الإصدارات الأقدم أو Raspbian ، ولكن في 2014-01-07-Wheezy-raspbian حصلت على:

pi<strong i="7">@raspberrypi</strong> ~ $ ls -l /sys/class/gpio/
total 0
-rwxrwx--- 1 root gpio 4096 Mar 28 16:58 export
lrwxrwxrwx 1 root gpio    0 Jan  1  1970 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
-rwxrwx--- 1 root gpio 4096 Mar 28 17:01 unexport
pi<strong i="8">@raspberrypi</strong> ~ $ echo 23 > /sys/class/gpio/export 
pi<strong i="9">@raspberrypi</strong> ~ $ 

كل شيء يعمل بشكل جيد ولا توجد أخطاء. كل شخص في مجموعة gpio لديه إذن للوصول إلى / sys / class / gpio / export و pi عضو في مجموعة gpio.

pi<strong i="13">@raspberrypi</strong> ~ $ groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users netdev input spi gpio

uname مخرجات ما يلي:

pi<strong i="17">@raspberrypi</strong> ~ $ uname -a
Linux raspberrypi 3.10.34+ #661 PREEMPT Thu Mar 27 00:36:02 GMT 2014 armv6l GNU/Linux

تغير السلوك لأننا نستخدم بعض الأشياء udev من الناس piface. أنت محق في أنه يتعين عليك انتظار udev لتغيير الأذونات على الجهاز الذي تم إنشاؤه. هذا جزء من مساحة المستخدمين ، لذا فهو ليس حقًا لهذا الريبو ، لكنني لست متأكدًا حقًا من وجود طريقة لتحسينه.

هل هذا فعال؟

echo 23 > /sys/class/gpio/unexport; echo 23 > /sys/class/gpio/export; sleep 1; echo out > /sys/class/gpio/gpio23/direction

asb طيب ، شكرا على المعلومات. أعتقد أنني سأغير الكود في وضع

popcornmix نعم ، هذا يعمل ، شكرًا.

أستطيع أن أرى قيمة في تمديد عملية إذن GPIO في مساحة المستخدم ، ولكن هذا التنفيذ
أفسد دلالات عملية تصدير kernel GPIO. الكتابة إلى / sys / class / gpio / export
يجب انتظار عملية مساحة المستخدم للإبلاغ عن اكتمال عملها قبل عودة الكتابة.

الحلول البديلة التي تنص على أنه يجب على المستخدمين الانتظار بعض الوقت حتى يتم تسوية البيانات الوصفية لـ sysfs بعد ملف
عملية التصدير قبيحة للغاية لأنه لا توجد فترة انتظار صحيحة. عمل حول استراتيجية ذلك
يبحث عن التغييرات في البيانات الوصفية (على سبيل المثال ، المجموعة مضبوطة على gpio) غير كافية لأن الغرض من
تتسم عملية إذن مساحة المستخدم بالمرونة - فقد تقرر أن الجذر هو المجموعة المناسبة ولا يوجد تغيير
يحدث.

التغيير الدلالي لعملية تصدير kernel GPIO هو عقبة أمام الكود المحمول ، ليس فقط
بين Raspberry Pi وأنظمة الأجهزة الأخرى ، ولكن أيضًا بين أنظمة Linux المختلفة
التوزيعات على Raspberry Pi.

متفق. تقع على عاتق kernel مسؤولية توفير تطبيق sysfs فعال ، وتنفيذ Raspbian بشكل واضح بطريقة قبيحة. لا أرى كيف يمكن وضع علامة مغلق على هذه المشكلة.

هذه مشكلة مزعجة للغاية تتطلب حلولاً قبيحة. لا ينبغي أن يكون قد أغلق.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات