تطوير البرامج الثابتة: مقدمة

مرحبا يا هابر! أقدم لكم ترجمة مقالات كريس سفيك ، الأصل هنا . تم النشر بإذن من المؤلف بموجب ترخيص CC-A-NC-ND .

هندسة البرمجيات المدمجة 101: مقدمة


أنا بصدد إطلاق سلسلة من البرامج التعليمية حول تطوير البرامج الثابتة. سنبدأ بوصف متحكم بسيط ، وبعد أن تفهم كيف يعمل ، سنطور هذا لفهم كيفية عمله فيما يتعلق بالأنظمة المعقدة مثل Fitbit أو Nest.
اتصلت بهذه السلسلة Embedded Software Engineering 101 ، وستبدأ هذا الأسبوع هنا على هذه المدونة.

تابع القراءة لمزيد من الشرح والتفاصيل.


بعض الكتل البنائية في الكتل البنائية الأخرى.

أنا أعمل مع أنظمة مدمجة وأطور شرائح دقيقة لأكثر من 14 عامًا. أحب الأنظمة المدمجة - الأجهزة والبرامج والقيود التي تربطها ببعضها البعض. جعلت
الإلكترونيات والأفكار الهواة مثل Arduino و Adafruit و Sparkfun من الممكن بسهولة رمي شيء من الأجهزة والبرامج خلال عطلة نهاية الأسبوع (أو شهر أو فصل دراسي) ، وخلق شيء جديد ومثير للاهتمام ويمكن أن يكون مفيدًا.

انه رائع! إن إعطاء الناس فرصة الإبداع أمر رائع ؛ إذا أردت أن أعبر عن نفسي بقسوة ، فسأطلق عليها طموحًا "التكنولوجيا الديمقراطية".

معظم مشاريع الهواة لمرة واحدة. أنت تجمع شيئًا ، وتجعله جيدًا بما يكفي من الوقت أو الطاقة ، والمضي قدمًا.
قضيت مسيرتي المهنية في الطرف المقابل من الطيف - صنعت منتجات بمئات الآلاف أو الملايين أو أكثر من النسخ - وهذا يتطلب طريقة تفكير مختلفة تمامًا ونهج منظم.

أريد تعليم الناس كيفية كتابة البرامج الثابتة لهذه الأنواع من الأنظمة. لقد عززت هذه الفكرة منذ فترة طويلة لدورة / دليل / كتاب / مدونة هندسة مدمجة 101 ، وبفضل مدونة Embedded.fm ، بدأت في تنفيذها الآن.

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

هدفي هو أنه بحلول نهاية هذه الدورة ، يمكنك معرفة كيفية عمل Fitbit أو ترموستات Nest أو نظام مضمن مشابه. يمكنك البدء في العمل مع أنظمة البرامج المضمنة باستخدام الخبرة المهنية.

تم تصميم هندسة البرمجيات المدمجة 101 من أجل:

  1. خريجو الجامعات في مجال علوم الكمبيوتر أو هندسة الكمبيوتر أو الإلكترونيات ، مهتمون بالأنظمة المدمجة.
  2. هواة الإلكترونيات الهواة الذين يرغبون في فهم أعمق لكيفية عمل نظامهم على Arduino ، ومعرفة كيفية تقدمهم (وما إذا كان ذلك ضروريًا!).
  3. , , .
  4. , , -.

ماذا أعني بالقول إنني "شخص من النوع الأساسي"؟ ريتشارد فاينمان ، عالم فيزياء حائز على جائزة نوبل ورواة قصص ممتاز ، صاغها بأفضل طريقة ممكنة: "ما لا يمكنني إعادة إنشائه ، لا أفهم."

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

الأساسيات في المقام الأول - هذا بالطبع اقتناعي الشخصي فقط. صنع العديد من الأشخاص أشياء مفيدة مع Arduino دون فهم أي من الأساسيات. هذه السلسلة من المقالات مخصصة لأولئك الذين ما زالوا يريدون فهم الأساسيات وكل شيء مبني عليهم.

بالطبع ، يجب أن نسأل أنفسنا - أين هو المستوى المناسب للبدء بهذه "الأساسيات"؟ الترانزستورات والبوابات المنطقية؟ لا ، هذا منخفض جدًا لبدء البرامج الثابتة. الاتصال بأجهزة الاستشعار الشائعة؟ لا ، هذا مستوى مرتفع جدًا ، يتطلب الأمر الكثير من المعرفة للبدء بهذا.

أعتقد أن المستوى الصحيح من الأساسيات هو المعالج الدقيق المدمج. ليس من الضروري فهم الفيزياء أو الإلكترونيات من أجل استخدام المعالج الدقيق المدمج ؛ ليس من الضروري أيضًا أن تكون خبيرًا في البرمجة.

إذن هذا هو المكان الذي سنبدأ فيه في المقالة التالية.

تحذير التحيز: في الحياة الماضية ، كنت مهندس معماري / معالج. قد لا يكون بدء هذه الدورة من خلال فهم كيفية عمل وحدة المعالجة المركزية أفضل طريقة لفهم الأنظمة المضمنة ، ولكن هذه هي الطريقة التي يعمل بها عقلي. تأكد من تجربة دورات / كتيبات أخرى ، وما إلى ذلك ، إذا كنت لا تفهم ذلك بعد عدة مقالات.

هندسة البرمجيات المدمجة 101: أساسيات وحدة التحكم الدقيقة


سنبدأ رحلتنا من برنامج Egineering 101 المضمن باستخدام متحكم متواضع. المتحكم الدقيق (أو المعالج الدقيق) هو لبنة البناء الرئيسية لجميع أنظمة الحوسبة ، المضمنة وغيرها.

يبدو MK عضوًا معقدًا إلى حد ما ، ولكنه يتكون من ثلاثة أشياء بسيطة: التعليمات والسجلات والذاكرة. التعليمات هي تلك الأشياء التي يعرف المتحكم الدقيق كيفية القيام بها. لا يستطيع عضو الكنيست البسيط أداء الكثير - فقد يكون لديه ، على سبيل المثال ، 20 أو 30 تعليمات. في وقت لاحق من هذه الدورة ، سأستخدم متحكم MSP430 من شركة Texas Instruments ، والذي يحتوي على 27 تعليمات فقط.


مجرد صورة MK (TI MSP430F5529)

هذه الإرشادات الـ 27 هي الأشياء الوحيدة التي يمكن لـ MSP430 القيام بها. يمكنه إضافة رقمين ، أو طرح رقم آخر من رقم ، أو نقل الأرقام من مكان إلى آخر ، أو إجراء 24 عملية بسيطة أخرى. قد لا تبدو 27 عملية كافية للقيام بأي شيء مفيد ، ولكن في الواقع ستكون كافية بما يكفي لتنفيذ أي برنامج يمكن تصوره.

حسنًا ، هذا يعني أن وحدة التحكم الدقيقة لديها تعليمات تفعل شيئًا باستخدام الأرقام. لكن أين هذه الأرقام؟ يسجل والذاكرة! تعمل التعليمات مع الأرقام المخزنة في السجلات والذاكرة.

السجلات عبارة عن مستودع سريع للغاية يحتوي على أرقام تعمل بناء على تعليمات. يمكنك التفكير فيها كمفكرة تستخدمها التعليمات. يحتوي MK على عدد قليل من السجلات ، عادة 8-32. على سبيل المثال ، يحتوي MSP430 على 16 تسجيل.

الذاكرة هي أيضًا تخزين للأرقام ، لكنها أكبر بكثير وأبطأ من التسجيلات. يمكن أن تحتوي وحدة التحكم الدقيقة على 64 كيلوبايت أو 256 كيلوبايت أو حتى أكثر من 1 ميجابايت من الذاكرة. يحتوي MSP430F5529 على حوالي 128 كيلو بايت من الذاكرة ؛ هذا هو أكثر من 8000 ضعف عدد سجلاته!

قبل أن نبدأ في النظر في الأمثلة ، أحثك ​​على الحصول على قطعة من الورق وقلم أو قلم رصاص ودراسة هذه الأمثلة أثناء قراءتك. من الصعب دراستها على الورق من مجرد قراءة ما كتبته. وبالتالي ، ستقترب من العملية بعناية ، وستكون فرص حفظ المستفادة أعلى.

دعونا نلقي نظرة على مثال خيالي ، ولكن مميز لميكروكونترولر.

لنفترض أن عضو الكنيست لديه 4 تسجيلات و 8 خلايا ذاكرة. عادة ما يطلق على التسجيل بشكل إبداعي ، على سبيل المثال ، "R0" ، "R1" ، وما إلى ذلك ، وسنفعل نفس الشيء. عادةً ما تتم الإشارة إلى خلايا الذاكرة من خلال أرقامها ، وتسمى أيضًا عناوين الذاكرة ، بدءًا من الترقيم 0. هذه هي الطريقة التي ستبدو بها سجلاتنا وذاكرتنا:



والآن سأضع بعض القيم فيها:



الآن ، يحتاج متحكمنا الخيالي إلى بعض التعليمات.
مجموعة التعليمات التي يعرفها MK تسمى مجموعة التعليمات الخاصة به. دعنا نقول في المجموعة سيكون هناك ثلاثة تعليمات: ADD (إضافة) ، SUB (اختصار لـ "طرح" - طرح) و MOVE (نقل). يجب أن تحصل التعليمات على الأرقام التي تعمل من خلالها في مكان ما ، وأن تضع أيضًا نتائجها في مكان ما ، لذا يحتوي بعضها على معلومات حول مكان بيانات الإدخال والإخراج.

على سبيل المثال ، اسمح لتعليمات ADD بمصدرين ومستقبل بيانات واحد ، ويجب أن تكون جميعها سجلات. قد يصف الدليل هذه التعليمات مثل هذا:
ADD regist، regPrm
تضيف تعليمات ADD قيمة التسجيل regGist إلى قيمة التسجيل regPrm وحفظ النتيجة في سجل regPrm
ملخص: regPrm = regGist + regPrm
مثال: ADD R1 ، R2 ينفذ العملية R2 = R1 + R2
من المقبول عمومًا في التعليمات استخدام أحد المصادر أيضًا كمستقبل ، كما تفعل تعليمات ADD ، باستخدام regPrm كمصدر ومستقبل للبيانات.

"ADD R1، R2" هي لغة تجميع لميكروكونترولر ، وهي لغة برمجة أصلية MK.

دعنا نحدد SUB بنفس النمط:
تسجيل SUB ، regrpm
يطرح تعليمات SUB قيمة سجل المسجل من قيمة سجل regprm ويخزن النتيجة في سجل regprm
ملخص: regPrm = regPrm - regist
مثال: SUB R3 ، R0 ينفذ العملية R0 = R0 - R3
أخيرًا ، دع تعليمات MOVE لها مصدر واحد وجهاز استقبال واحد ، وإما:

  • كلا الحجج هي سجلات أيضًا
  • واحد سجل والآخر موقع ذاكرة.

سيقرأ دليل مجموعة التعليمات:
1. تسجيل MOVE ، تسجيل
2. MOVE تسجيل ، تسجيل
3. MOVE تسجيل ، rem
التعليمات MOVE نسخ البيانات من الوسيطة الشرق إلى الوسيطة Prm.
ملخص: هناك ثلاثة أنواع من تعليمات MOVE
1. regPrm = regist
2.regPm = memist
3. memPm = reg
مثال: سأعرض أمثلة على تعليمات MOVE لاحقًا في هذا المنشور .
ملاحظة واحدة حول كلمة "نقل" المستخدمة في هذه التعليمات: معظم مجموعات التعليمات تستخدمها ، على الرغم من نسخ البيانات في الواقع ، وليس نقلها.

قد يعطي اسم "نقل" انطباعًا بأن مصدر المعامل للتعليمات قد تم إتلافه أو مسحه ، ولكنه في الواقع يبقى بمفرده ، يتم تعديل جهاز الاستقبال فقط.
لنستعرض بعض الأمثلة باستخدام متحكمنا الخيالي.
في البداية ، تبدو سجلاتنا وذاكرتنا على



النحو التالي : الآن نقوم بتنفيذ التعليمات التالية على MK:

ADD R1, R2

يأخذ قيمة R1 ، ويضيفها إلى قيمة R2 ، ويخزن النتيجة في R2. ينفّذ المعالج معظم التعليمات في عملية واحدة ، لكنني سأقسم تنفيذ كل تعليمة ADD و SUB و MOVE إلى عدة خطوات مع سهم "=>" الذي يؤدي من خلال عمليات الاستبدال (التسجيل / الذاكرة => القيمة):

R2 = R1 + R2 =>
R2 = 37 + 100 =>
R2 = 137

بعد تنفيذ هذه التعليمات ، لم تتغير الذاكرة ، ولكن تبدو السجلات الآن كما يلي ، مع القيمة المتغيرة المكتوبة باللون الأحمر:



لاحظ أن R1 لم يتغير ؛ تم تغيير تسجيل جهاز الاستقبال فقط R2.
بعد ذلك دعونا نجرب بيان SUB:

SUB R3, R0

تأخذ قيمة R3 ، وتطرحها من قيمة R0 ، وتخزن النتيجة في R0:

R0 = R0 - R3 =>
R0 = 42 - 2 =>
R0 = 40

بعد تنفيذ هذه التعليمات ، لم تتغير الذاكرة ، ولكن تبدو السجلات الآن كما يلي:



أخيرًا ، لنجرب نسختين من تعليمات MOVE:

MOVE R2, R0

تنسخ تعليمات MOVE قيمة R2 إلى R0:

R0 = R2 =>
R0 = 137

والآن تبدو السجلات كما يلي:



بعد ذلك ، نقوم بنسخ السجل في الذاكرة:

MOVE R3, [3]

تقوم تعليمات MOVE بنسخ R3 إلى موقع الذاكرة 3. الأقواس المربعة في مجموعة التعليمات الخاصة بنا هي خلايا الذاكرة.

[3] = R3 =>
[3] = 2

السجلات دون تغيير ، لكن الذاكرة تتغير:



وبالنسبة لمثالنا الأخير ، نقوم بنسخ القيمة من الذاكرة للتسجيل:

MOVE [6], R0

هنا ، يتم نسخ قيمة خلية الذاكرة 6 إلى السجل R0:

R0 = [6] =>
R0 = 1

الذاكرة غير قابلة للتغيير ، والسجلات تبدو الآن على هذا النحو:



صدق أو لا تصدق ، ولكن إذا فهمت معظم ما ناقشناه للتو حول التعليمات والسجلات والذاكرة ، فأنت تفهم أساسيات وحدات التحكم الدقيقة ولغة التجميع.

بالطبع لقد حذفت الكثير من التفاصيل. على سبيل المثال ، كيف يحصل MK على تعليمات للتنفيذ؟

هل هناك تعليمات أكثر إثارة للاهتمام من مجرد تعليمات بسيطة للرياضيات والنسخ؟ هل الذاكرة هي نفسها ذاكرة الوصول العشوائي أم الفلاش أم لا؟

سنجيب على هذه الأسئلة في المقالة التالية.

All Articles