تنويه. المؤلف لا يدافع عن استخدام أنظمة التشغيل متعددة المهام لأجهزة التحكم الدقيقة.
الحياة بلا رحمة يفرض استخدام أنظمة التشغيل (OS) لميكروكونترولر. هناك عدد هائل من هذه الأنظمة في السوق. يحاول مطورو نظام التشغيل ، المتنافسون مع بعضهم البعض ، زيادة وظائف منتجاتهم إلى الحد الأقصى. يؤدي هذا غالبًا إلى زيادة "ثقل" النظام ، وأيضًا زيادة كبيرة في "عتبة الدخول" للمبرمج الذي يطور برامج للأنظمة المدمجة.
لكي لا تعذبني اختيار نظام التشغيل لمشاريعنا ، بالإضافة إلى عدم إغراء العقل بدراسة منتج شخص آخر ، وكذلك لإتقان تقنية كتابة التطبيقات المدمجة لأنظمة التشغيل ، وكذلك لمعرفة ما يدور حوله ، قررت أن أكتب نظام التشغيل الخاص بي. ليس لها رائحة.
نظام التشغيل المقترح (OS ، اللغة لا تجرؤ على استدعاء نظام التشغيل الخاص به ، وخاصة OSRV) التعاونية مع المهام الثابتة. كما ذكر أعلاه ، لست مؤيدًا لاستخدام نظام التشغيل لأجهزة التحكم الدقيقة ، لكنني أكثر من ذلك لست مؤيدًا لاستخدام أنظمة التشغيل الوقائية في أجهزة التحكم الدقيقة. تعدد المهام الاستباقية ، مقارنة بالتعاونية ، ليس فقط إجراءات تبديل السياق المعقدة ، ولكن أيضًا تزامن سلاسل العمليات كثيفة الاستخدام للموارد. يؤدي استخدام المهام الديناميكية أيضًا إلى تعقيد نظام التشغيل بشكل كبير.
تم تطوير نظام التشغيل لمعالج عائلة Cortex-M0. مع التغييرات الطفيفة في قواعد حفظ واستعادة السياق ، يمكن استخدامه لأنواع أخرى من المعالجات.
شفرة المصدر
ملف IntorOS.h#ifndef __INTOROS_H #define __INTOROS_H
ملف IntorOS.c #define _INTOROS_C #include "stm32l0xx.h" #include "IntorOS.h"
ملف IntorOSSleepIAR.s #define SHT_PROGBITS 0x1 EXTERN KolvoTask EXTERN TaskList EXTERN TaskNum PUBLIC Sleep SECTION `.text`:CODE:NOROOT(2) THUMB
ملف IntorOSSleepGCC.s .cpu cortex-m0 .text .cfi_sections .debug_frame .section .text.Sleep,"ax",%progbits .align 1 .global Sleep .syntax unified .thumb .thumb_func .type Sleep, %function .extern KolvoTask .extern TaskList .extern TaskNum .cfi_startproc
ثوابت تجميع نظام التشغيل
#define IntorOSMaxKolvoZadach (2)
لأسباب دينية ، لا يمكنني استخدام تخصيص الذاكرة الديناميكي ، لذلك يجب تحديد مقدار الذاكرة المطلوبة في مرحلة الترجمة.
خدمات نظام التشغيل
void InitTask(void (*TaskPointer)(void), unsigned long Stek);
مهمة التهيئة. يتم تنفيذ المهمة في شكل دالة ، يتم تمرير مؤشر إلى دالة إلى إجراء التهيئة. أثناء التهيئة ، يجب عليك تحديد حجم المكدس المخصص للمهمة. يحدد الترتيب الذي تتم به تهيئة المهام معرفاتها. المهمة التي تمت تهيئتها أولاً لها المعرف 0. إذا قمت بتحديد الحجم الكلي للمكدس الأكبر من المحجوز ، فسيحدث خطأ. عند تهيئة المهمة ، يتم تعيين المؤشر إلى مكدس المهام ، ويتم تحميل المكدس بواسطة سياق المهمة.
void StartOS(unsigned long Num);
بداية نظام التشغيل. كوسيطة للدالة ، يتم تمرير معرف المهمة التي تبدأ التنفيذ. عند بدء تشغيل نظام التشغيل ، يتم ضبط مؤقت النظام على كمية من مللي ثانية واحدة. يتم شطب السياق من رصة المهمة المطلقة وتسمى المهمة.
void Sleep(unsigned long ms);
المجدول. عندما يتم استدعاء هذه الوظيفة من مهمة ، يتم نقل التحكم إلى نظام التشغيل. يحدد نظام التشغيل مهمة جاهزة للتنفيذ من القائمة وينقل التحكم فيها. وسيطة الدالة هي الوقت بالميلي ثانية وبعدها من الضروري إرجاع التحكم إلى المهمة الحالية. عندما يتم استدعاء دالة بالوسيطة 0xFFFFFFFF ، لن يعود التحكم أبدًا.
من المستحيل كتابة هذه الوظيفة في لغة C ، لذلك فإن خوارزمية تشغيلها تدمر منطق اللغة تمامًا. يحتوي الكود المصدري على اختبارات لبرامج التجميع لأنظمة البرمجة IAR و GCC. بالنسبة للمرضى ، يتم إعطاء الكود في C. لكن أود أن أشير إلى أنه قادر على التجميع بشكل صحيح مع "مراحل القمر" معينة فقط. في حالتي ، حدث هذا فقط عند استخدام المستوى المتوسط من التحسين ، في المستوى المنخفض والعالي ، تم تجميع الشفرة عن طريق الخطأ.
ملف Sleep.c extern Task_t TaskList[IntorOSMaxKolvoZadach];
void EndTask(void);
الانتهاء من المهمة. كما هو مذكور أعلاه ، تكون المهام ثابتة ، وتفريغ المهام أمر مستحيل. إذا كنت بحاجة إلى إكمال المهمة ، يمكنك استخدام هذه الوظيفة. تبقى المهمة في القائمة ، ولكن لا يتم نقل التحكم إليها.
void StopTask(unsigned long Num); void StartTask(unsigned long Num);
وقف أو بدء مهمة. الوسيطة هي معرف المهمة. تسمح لك هذه الوظائف بتنفيذ مدير المهام. تجدر الإشارة إلى أنه يمكنك فقط بدء مهمة متوقفة مسبقًا ، والوقت الذي تبدأ فيه هو 0xFFFFFFFF.
باستخدام نظام التشغيل
على سبيل المثال ، متحكم تقليدي "helword" لنظام تشغيل مطور.
#include "stm32l0xx.h" #include "stm32l0xx_ll_gpio.h" #include "IntorOS.h"
في الختام ، أود أن أتمنى مخلصًا أن يكون هذا ، من أجل المتعة ، نظام التشغيل المطور مثيرًا للاهتمام ومفيدًا لمطوري البرامج للأنظمة المدمجة.