طبقات تجريد العتاد وبرامج تشغيل الأجهزة
تعلّموا استخدام طبقات تجريد العتاد (HALs) وكتابة برامج تشغيل بسيطة للأجهزة للتفاعل مع الملحقات في المتحكمات الدقيقة.
طبقات تجريد العتاد وبرامج تشغيل الأجهزة درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 3 دروس في المجموع.
طبقات تجريد العتاد (HALs)
مرحبًا بك في عالم Rust للأنظمة المضمّنة! عند العمل مع المتحكمات الدقيقة، ستواجه مفهومًا مهمًا: طبقات تجريد العتاد (HALs).
طبقة HAL هي طبقة برمجية توفر واجهة موحّدة للوحدات الطرفية في المتحكم الدقيق، مثل منافذ GPIO وI2C وSPI وUART. وهي تخفي التفاصيل المعقدة لمعالجة السجلات مباشرةً.
لماذا نحتاج إلى HALs
تخيل أنك تحاول جعل مصباح LED يومض. في أحد المتحكمات الدقيقة، قد تضبط بتًا في السجل GPIO_PORTA_DR. وفي متحكم آخر، قد يكون السجل هو PIND_OUT.
- التعقيد: الوصول المباشر إلى السجلات عمل رتيب ومعرّض للأخطاء.
- قابلية النقل: من دون HALs، لن تعمل الشفرة المكتوبة لشريحة على شريحة أخرى، حتى لو كانتا من العائلة نفسها.
تحل HALs هذه المشكلة من خلال توفير طريقة متسقة للتفاعل مع العتاد، بغض النظر عن الشريحة الأساسية.
منظومة HAL المضمّنة في Rust
في Rust، تحدد الحزمة embedded-hal مجموعة من السمات (المشابهة للواجهات) للعمليات الشائعة على الوحدات الطرفية. وتعمل هذه السمات كعقد يجب على HALs الخاصة بكل متحكم دقيق تنفيذها.
embedded-hal: توفر سمات عامة (مثلDigitalOutputPinوI2c).- HALs الخاصة بالشرائح: تنفذ حزم مثل
rp-hal(للوحة Raspberry Pi Pico) أوstm32f4xx-halهذه السمات للعتاد الخاص بها.
يتيح هذا الفصل كتابة برامج تشغيل الأجهزة بطريقة عامة!
التفاعل الأساسي مع HAL: GPIO
لنرَ كيف يمكن لـ HAL أن تجرد منفذ إدخال/إخراج للأغراض العامة (GPIO). في الشفرة المضمّنة الفعلية، ستحصل على كائن منفذ من HAL الخاصة بشريحتك ثم تضبطه.
يحاكي هذا المثال كيفية تفاعلك مع كائن «منفذ» للتحكم في مصباح LED.
struct GpioPin {
name: String,
state: bool,
}
impl GpioPin {
fn new(name: &str) -> Self {
println!("Configuring {} as output...", name);
GpioPin { name: name.to_string(), state: false }
}
fn set_high(&mut self) {
self.state = true;
println!("{} set to HIGH (LED ON)", self.name);
}
fn set_low(&mut self) {
self.state = false;
println!("{} set to LOW (LED OFF)", self.name);
}
fn toggle(&mut self) {
if self.state { self.set_low(); } else { self.set_high(); }
}
}
fn main() {
let mut led_pin = GpioPin::new("LED_GPIO_PIN");
println!("\n--- Blinking LED Simulation ---");
led_pin.set_high();
led_pin.set_low();
led_pin.toggle();
led_pin.toggle();
println!("-----------------------------");
}فهم أوضاع منافذ GPIO
لا تقتصر منافذ GPIO على تشغيل الأشياء وإيقافها! فلها أوضاع مختلفة:
- الإخراج: للتحكم في المكونات الخارجية (مثل مصباح LED).
- الإدخال: لقراءة الإشارات من المكونات الخارجية (مثل زر).
- الإدخال مع مقاومة سحب لأعلى/لأسفل: لضمان حالة مستقرة عند عدم اتصال أي شيء، ومنع مداخل «عائمة».
- تماثلي: لقراءة مستويات الجهد المستمرة (مثل الجهد الصادر من مستشعر).
توفر HALs أساليب لضبط هذه الأوضاع بأمان.
ما برامج تشغيل الأجهزة؟
بينما تمنحك HALs تحكمًا منخفض المستوى في الوحدات الطرفية، تُبنى برامج تشغيل الأجهزة فوق HALs لتوفير وظائف عالية المستوى لأجهزة خارجية محددة (مثل مستشعر درجة حرارة أو شاشة LCD).
يجرد برنامج تشغيل الجهاز بروتوكول الاتصال (مثل I2C أو SPI) والأوامر المحددة اللازمة لشريحة معينة. ويحوّل عمليات نقل البايتات الخام إلى عمليات مفهومة مثل sensor.read_temperature().
توحيد برامج التشغيل باستخدام `embedded-hal`
تظهر القوة الحقيقية لـ embedded-hal عند كتابة برامج التشغيل. فبدلًا من معرفة برنامج التشغيل بـ HAL محددة لـ STM32 أو RP2040، يكفي أن يعرف سمات embedded-hal.
فمثلًا، قد يتطلب برنامج تشغيل لمستشعر درجة حرارة يعمل عبر I2C كائنًا ينفذ السمة embedded_hal::i2c::I2c. وهذا يعني أن شفرة برنامج التشغيل نفسها يمكن أن تعمل مع أي متحكم دقيق لديه HAL تنفذ تلك السمة!
مثال على برنامج تشغيل: مستشعر I2C (تصوري)
تخيل أن لديك مستشعر درجة حرارة يتصل عبر I2C. وسينفذ برنامج التشغيل الخاص به ما يلي:
- يأخذ كائن
embedded_hal::i2c::I2cكمدخل. - ينفذ أساليب مثل
read_temperature()أوset_config(). - تستخدم هذه الأساليب داخليًا أساليب
i2c.write_read()أوi2c.write()التي توفرها HAL الأساسية عبر سمةembedded-hal.
ينشئ هذا واجهة واضحة قابلة لإعادة الاستخدام للمستشعر.
خطوات إنشاء برنامج تشغيل أساسي
إذا أردت كتابة برنامج تشغيل بسيط لجهاز جديد، فإليك مخططًا تصوريًا:
- تعريف بنية برنامج التشغيل: الاحتفاظ بواجهة الوحدة الطرفية (مثل كائن I2C الخاص بـ HAL) وأي حالة خاصة ببرنامج التشغيل.
- تنفيذ `new()`: تهيئة برنامج التشغيل، مع ضبط الوحدة الطرفية عند الحاجة.
- إضافة أساليب التفاعل: إنشاء دوال مثل
read_data()وwrite_config()تستخدم أساليب HAL. - معالجة الأخطاء: استخدام نوع
Resultفي Rust لإدارة أخطاء الاتصال أو الجهاز بطريقة سلسة.
اختبار سريع حول HALs وبرامج التشغيل
اختبر مدى فهمك لطبقات تجريد العتاد وبرامج تشغيل الأجهزة.
مراجعة: HALs وبرامج التشغيل
استكشفنا في هذا الدرس كيف توفر طبقات تجريد العتاد (HALs) طبقة تجريد مهمة، فتسهّل التفاعل مع الوحدات الطرفية للمتحكم الدقيق وتعزز قابلية نقل الشفرة.
وتعلمنا أيضًا كيف تُبنى برامج تشغيل الأجهزة فوق HALs وسمات embedded-hal لتوفير واجهات عالية المستوى قابلة لإعادة الاستخدام للمكونات الخارجية المحددة، مما يعفيك من تفاصيل الاتصال منخفض المستوى. ويُعد هذا النهج الطبقي أساسيًا لتطوير Rust متين للأنظمة المضمّنة!
الأسئلة الشائعة
هل درس «طبقات تجريد العتاد وبرامج تشغيل الأجهزة» مجاني؟
نعم — نص درس «طبقات تجريد العتاد وبرامج تشغيل الأجهزة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 3 دروس في المجموع.
ماذا ستتعلم في «طبقات تجريد العتاد وبرامج تشغيل الأجهزة»؟
تعلّموا استخدام طبقات تجريد العتاد (HALs) وكتابة برامج تشغيل بسيطة للأجهزة للتفاعل مع الملحقات في المتحكمات الدقيقة. تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟
لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.
كم من الوقت يستغرق درس «طبقات تجريد العتاد وبرامج تشغيل الأجهزة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟
نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مقدمة إلى Rust المضمّنة
- طبقات تجريد العتاد وبرامج تشغيل الأجهزة
- مفاهيم تطوير أنظمة التشغيل