Learn RTOS Programming Easymcu Org
Learn RTOS Programming Easymcu Org
قیمت :رایگان
وبسایتwww.EasyMCU.org :
آشنایی با مرتضی زندی
فهرست مطالب
مقدمه 5...........................................................................................................................
برنامه نویسی ،امری خداگونه!01 ...........................................................................................
سبک های برنامه نویسی؟ 00.................................................................................................
سیستم عامل RTOSچیست؟ 01 .........................................................................................
سیستم عامل 05............................................................................................... FreeRTOS
میکرو 05.............................................................................................................. STM32
انواع abstractionهای موجود 01 .......................................................................................
دلیل استفاده از سیستم عامل جهت میکروکنترلرها 01...............................................................
سبک سیستم عامل چه مزایایی دارد 01 .................................................................................
در پس پرده ی سیستم عامل چه می گذرد؟ 01 ........................................................................
محدودیت های سبک کد نویسی معمولی01 ..........................................................................
مزایای سبک کد زنی سیستم عامل 00 ....................................................................................
از کجا شروع کنیم 02 ..........................................................................................................
CMSIS-RTOSو 01 ....................................................................................... FreeRTOS
بیایید شروع کنیم 01 ..........................................................................................................
آموزش نرم افزار 01 ................................................................................. STM32cubeMX
تعریف اولین پروژه11 .........................................................................................................
تنظیمات پروژه در محیط 10..................................................................... STM32cubeMX
توسعه پروژه در محیط 22 ............................................................................................ Keil
تابع )(51.......................................................................................................... osDelaly
اولویت 51........................................................................................................... Priority
تعریف دومین پروژه 51 .......................................................................................................
سخن پایانی 11 .................................................................................................................
www.EasyMCU.org
5 برنامه نویسی به روش RTOSبرای میکروکنترلرها
مقدمه
روز به روز ترانزیستورها کوچکتر می شوند و سخت افزارها و نرم افزارها پیچیده تر.
با همه گیر شدن اینترنت و ظهور ایدهی اینترنت اشیاء ( ، )IoTاز میکروکنترلرهای
سادهی امروزه هم انتظار میرود که به اینترنت متصل شده و بتوانند تبادل اطالعات
داشته باشند.
به بیان دیگر این انتظارات جزء انتظارات و نیازهای اولیهی خیلی از پروژههاست،
حال آنکه کار به همینجا ختم نمیشود و این شروعی برای پیادهسازی عملکردهای
خاص پروژه است .بنابراین میتوان ادعا کرد که با توجه به پیچیدهتر شدن سخت-
افزار و نرمافزار و از همه مهمتر انتظارات کاربران ،برنامهنویسان نیاز دارند روز به روز
توانایی پیادهسازی قابلیتهای بیشتری را داشته باشند .چرا که معموال کاربرانی که
از محصوالت ما استفاده میکنند ،ترجیح میدهند کارهای بسیار پیچیده را تنها با
استفاده از یک دکمه اجرا کنند ،به عبارت دیگر ،هرچه عملیات اجرا سادهتر ،کار
طراحی و پیادهسازی آن توسط برنامهنویسان پیچیدهتر خواهد بود.
در زمان بسیار کوتاهی صنعت برنامهنویسی میکروکنترلرها ،مانند دیگر صنایع،
دارای تحوالت جدی بوده است ،با ورود میکروکنترلرهای ARMبه بازار و تالش
شرکت های مختلف برای ارائه محصوالت متنوع متناسب با نیاز روز بازار ،نوشتن
برنامه در سطح رجیستر که روزگاری سبک مرسومی برای برنامهنویسی پردازندهها
و میکروکنترلرها به شمار میرفت ،امروزه در قیاس با گذشته طرفدار کمتری دارد.
www.EasyMCU.org
6 برنامه نویسی به روش RTOSبرای میکروکنترلرها
یکی از مهمترین اصلها در ارائه محصوالت به بازار ،زمان تحویل محصول به بازار
است .این زمان اگر از حدی طوالنیتر شود به این مفهوم است که ایدهی ساخت
محصول از زمانی به بعد دیگر ایدهی جدیدی در نظر گرفته نمیشود و تاریخ انقضای
آن میگذرد ،همینطور دیگر رقبا نیز در تالش برای پیادهسازی ایدههای جدیدتر و
خالقانه تر هستند ،به بیانی دیگر اگر زمان بگذرد ،بازار دیگر نیازی به آن محصول
نخواهد داشت.
خیلی از برنامهنویسان هنوز اصرار به نوشتن برنامه در سطح زبان و کد ماشین دارند
چرا که این روش را بهینه ترین روش در پیادهسازی کدها میدانند .احتماال با خیلی
افراد برخورد کرده باشید که با زبان اسمبلی برنامهنویسی میکنند ،زمانی که پیش
این برنامهنویسان از زبان Cسخن به میان آید ،زبان Cدر قیاس با زبان اسمبلی
یک زبان غیر بهینه مورد خطاب قرار می گیرد.
این وضعیت برای برنامه نویسانی که با Cبرنامهنویسی میکنند نیز صادق است،
اگر برنامهنویسی با زبان ، Basic ، C++پایتون پیش آنها عنوان شود ،احتماال
www.EasyMCU.org
7 برنامه نویسی به روش RTOSبرای میکروکنترلرها
موضع یکسانی مشاهده خواهد شد " ،این زبانها نامناسب هستند و به اندازه C
بهینه نیستند! ".
بله ،البته که منظور از قشر برنامهنویسان یاد شده ،برنامهنویسان متعصب است،
همهی برنامهنویسان اینطور فکر نمیکنند .البته نظر چنین برنامهنویسانی از نظر
بهینه بودن برنامههای نوشته شده تا حد زیادی درست است ،اما مسئله از اینجا
شروع می شود که تنها مشکل در زمینهی امبدد سیستمها ،بحث بهینه بودن
کدهای نوشته شده ،نیست ،بلکه همواره فاکتورهای دیگری برای تولید محصول
وجود دارد که باید مورد نظر قرار گیرد .اگر بخواهیم مسائل را تنها با عینک بهینه
بودن کدها بررسی کنیم ،جزء آن دسته از تیمهایی خواهیم بود که محصول را به
موقع نمیتوانند به بازار ارائه کنند!
ممکنه االن با خودتان بگویید که دارم در مورد چه چیزی حرف میزنم! همه چیز را
زیر سوال می برم و منکر قدرت زبانها و روشهای سنتی میشوم؟ً!
باید بگویم ،مطلقا همچین هدفی را دنبال نمیکنم ،علی رغم اینکه تغییر ،کار بسیار
سختی برای نوع بشر است ،از همهی همکاران و دوستان عزیزم دعوت میکنم که
بیایید در امر بهینهسازی ،کامل گرایی نکنیم ،چرا که در این صورت خیلی فاکتورهای
مهمتر دیگر را نمی توان رعایت کرد و نتیجه در مجموع مطلوب نخواهد بود .البته
از آن طرف بوم هم نیفتیم که آنقدر به پلتفرم هایی نظیر آردوینو و ...رو بیاریم که
ابزار پرست بشویم و متکی ،حالتی که اگر بعضی ابزارها از ما گرفته شود دیگر
نتوانیم برنامه نویسی کنیم!
www.EasyMCU.org
8 برنامه نویسی به روش RTOSبرای میکروکنترلرها
بنابراین طبیعی است که با آمدن پردازنده های جدید ،نرم افزارهای جدید ،نیازهای
روز افزون ،روشهای قدیمی دیگر پاسخگوی تمام نیازها نیستند و قطعا افراد و
شرکتهای مختلفی در تالش برای ارائهی راه حلهای جدید هستند و این به این
معنی است که یک برنامه ثابت را میتوان با روشهای متفاوت و سبکهای
مختلفی نوشت.
برای اینکه این بحث ملموس تر شود این مثال را در نظر بگیرید .برنامهنویسی که
برنامهای را در زمان کوتاهی مینویسد ،قابلیتهای جدیدی برای پروژه تعریف می
شود .برنامه نویس در شرایطی است که با یک کد پیچیده دست و پنجه نرم میکند
و نمیتواند نیازمندی های جدید پروژه را پیاده سازی کند.
حالت دیگر این است که با گذشت زمان یک ماهه و بیشتر از زمانی که پروژه خاتمه
یافته است ،زمانی که برنامه نویس به کدهای خود بر می گردد دیگر نمی تواند از
کدهای خود سر در بیاورد و قابلیت های جدید را پیاده ساز ی کند.
به عنوان حالتی دیگر در نظر بگیرید که کار برنامهنویسی تمام شده است و برنامه-
نویس دیگری می خواهد کار را در دست بگیرد و پروژه را ادامه دهد ،منتها نمی
تواند با کدهای نوشته شده ا رتباط برقرار کند ،از این جهت که ساختار خاصی برای
کدهای نوشته شده وجود ندارد! و . ...
از این دست مثال ها زیاد است ،و این موارد برنامهنوسان حرفهای را از مابقی
برنامه نویسان جدا می کند .قابلیت خوانایی ،قابلیت نگهداری و ...موارد ضروری
هستند که در زمان برنامهنویسی باید در نظر گرفته شود .خیلی جاها ممکن است
www.EasyMCU.org
9 برنامه نویسی به روش RTOSبرای میکروکنترلرها
به دلیل خوانایی بیشتر کد بخواهیم از پیادهسازی پیچیده و بهینه بودن کد چشم
پوشی کنیم ،چرا که اگر پیادهسازی پیچیده ،ولو اینکه بهینه باشد ،در صورتی که
قدرت خوانایی را بگیرد ارزشی نخواهد داشت.
www.EasyMCU.org
10 برنامه نویسی به روش RTOSبرای میکروکنترلرها
اینجاست که برنامه نویس ایفای نقش می کند و برنامه نویسی مفهوم پیدا میکند
و بدین سبب یک لوح پاک در اختیار برنامهنویس قرار میگیرد و اینجاست که
www.EasyMCU.org
11 برنامه نویسی به روش RTOSبرای میکروکنترلرها
برنامهنویس با قلم خود به این موجود بی جان روح میبخشد و سرنوشت آن را
قلم میزند .گویی برنامهنویسی امریست خدا گونه ،چرا که سراسر خلق مخلوق
است! هر برنامهای یک خلقت جدید و هر پروژهای یک مخلوق جدید!
شمایی که این مطلب را می خونید ،اگر برنامهنویس هستی قدر خودت رو بیشتر
بدون و اگر تازه داری وارد وادی برنامه نویسی میشی ،بدون که داری کجا پا
میذاری ،این وادی ملکوتیه! از این زاویه بهش نگاه کن.
مرتضی زندی
بهار 99
www.EasyMCU.org
12 برنامه نویسی به روش RTOSبرای میکروکنترلرها
از این بین دو مورد اول bare metalو RTOSروی اکثر میکروکنترلرها قابل پیاده
سازی می باشد.
سبک OS
مورد سوم مربوط به پردازنده های نسل جدیدتر و قدرتمندتر می باشد که در دسته
بندی میکروکنترلرهای ARMجزء خانوادهی Applicationقرار دارند .به این ترتیب
معماری این پردازنده های به گونه ای است که می توانند سیستم عامل های همه
منظوره نظیر لینوکس را بوت کنند .برای اینکه OSاشتباها در عوض RTOSاستفاده
نشود ،می توانیم نام GPOSرا به آن اختصاص دهیم که به معنی سیستم عامل
همه منظوره ( )General Purpose Operation Systemاست.
www.EasyMCU.org
13 برنامه نویسی به روش RTOSبرای میکروکنترلرها
همان روش مرسوم که تمام برنامه درون یک حلقه ی بینهایت (ابر حلقه) ( Super
)Loopنوشته می شود.
www.EasyMCU.org
14 برنامه نویسی به روش RTOSبرای میکروکنترلرها
در این بین یک اشتباه رایج وجود دارد و آن این است که عبارت های RTOSو
OSبعضا به جای یکدیگر استفاده می شوند .منظور از OSسیستم عامل های همه
منظوره هستند که بنابه دالیلی برای هر نوع عملکردی بر روی میکروکنترلرها مناسب
نمی باشند RTOS .به سیستم عامل هایی اطالق می شود که زمان اجرای تسک
ها را گارانتی می کنند ،به این ترتیب ،برنامه نویس می تواند مطمئن باشد که
وظایف هارد-تایم )( (Hard-Timeوظایفی که بحرانی و مهم هستند و حتما باید
در زمان معینی انجام شوند) قابل اجرا می باشد .بنابراین RTOSها و OSها دو
مورد جداگانه هستند و نباید بجای یکدیگر به کار گرفته شوند .همانطور که پیش
تر اشاره شد ،برای جلوگیری از این اشتباه می توانیم از عنوان GPOSدر عوض OS
استفاده کنیم.
www.EasyMCU.org
15 برنامه نویسی به روش RTOSبرای میکروکنترلرها
میکرو STM32
در دهه ی اخیر شاهد ورود میکروکنترلرهای متنوع با قابلیت های متفاوتی بودیم
که از این بین میکرو کنترلر های ARMسهم بسیار زیادی از بازار را بدست آوردند.
شرکت های مختلف میکروکنترلرهای خود را بر مبنای هسته ی ARMتوسعه دادند،
بنابراین شرکت های مختلفی از جمله ST ، NXP ، ATMELو ...میکروکنترلرهای
www.EasyMCU.org
16 برنامه نویسی به روش RTOSبرای میکروکنترلرها
ARMبا قابلیت های متنوعی را به بازار عرضه کردند .از این بین شرکت STگوی
سبقت را ربوده و عالوه بر ارائه میکروکنترلرهای خود ،بردهای توسعه پذیر مناسبی
ارائه کرده است .همینطور نرم افزارهایی به منظور تسریع کار با میکروکنترلرهای
خود و ساده سازی امر برنامه نویسی آن ها بوجود آورده است عالوه بر این سبک
های برنامه نویسی مختص خود را نیز بوجود آورده است ،به این ترتیب در بازار
توجه هر برنامه نویسی که در حوزی سیستم های نهفته ( امبدد سیستم ها) کار
می کنند را ربوده است و خیلی از مهندسان به استفاده از میکروکنترلرهای این
شرکت روی آوردند.
www.EasyMCU.org
17 برنامه نویسی به روش RTOSبرای میکروکنترلرها
همین امر باعث می شد ،کد نویسی در سطح ریجستر این میکروکنترلرها برای
محصوالت هر شرکتی متفاوت باشد و طبیعتا این مورد کار برنامه نویسان و توسعه
دهندگان سیستم های نهفته را به شدت سخت و پیچیده می کرد .بنیاد ARM
کتابخانه های استانداردی برای استفاده از میکروکنترلرهای ARMرا با نام CMSIS
معرفی کرد و شرکت های استفاده کنند از هسته ی ARMدر محصوالت
میکروکنترلری خود را موظف کرد که برای محصوالت خود این کتابخانه ها را توسعه
دهند ،به این ترتیب یک کتابخانه ی مرجع در آستانه ی ظهور بود که قابلیت حمل
کدها بین میکروکنترلرهای شرکت های مختلف را تا حدی باال می برد.
هر شرکت میکروکنترلری الیه های نرم افزاری متنوعی را برای محصوالت خود ارائه
داد که از این بین شرکت STمتنوع ترین سبک ها را دارد .بعد از ، CMSISسبک
SPLبرای این میکروکنترلر ارائه شده و در ادامه abstractionهای HALو LL
ارائه شد.
www.EasyMCU.org
18 برنامه نویسی به روش RTOSبرای میکروکنترلرها
تولید می شوند ،امروزه نیازهای بسیار ی مطرح هست و مصرف کنندگان انتظارات
بسیار زیادی از دستگاه ها و به عبارت دیگر انتظارات زیادی از میکرو کنترلرها دارند.
برای مثال اتصال به اینترنت و استفاده از استک TCP/IPامروزه یک خواسته ی
بسیار ابتدایی و نیاز اولیه ی مصرف کننده ها شده است .این در حالی است که در
سطح پیاده سازی ،استک TCP/IPبسیار پیچیده است و پیاده سازی پیچیده ای
دارد .اگر کدهای این بخش به صورت Bare Metalبخواهد توسعه یابد ،یک
چرخه ی عمر کامل انسان را طلب می کند و طبیعتا اصال معقول نیست.
حال مصارفی چون USBو ...ها را نیز که در نظر بگیریم متوجه می شویم که این
واحدها دارای پیچیدگی های بسیار زیادی هستند و برنامه نویسی آن ها از ابتدا
هیچ توجیهی ندارد .بنابراین یه سری از این کتابخانه ها به صورت Third party
با الیسنس های متنوعی به صورت آزاد و یا پولی در اختیار توسعه دهندگان در
دسترس است .به طبع با باالتر رفتن خواسته های مصرف کنندگان و ساده سازی
بیشتر استفاده از محصوالت ،سطح کاری برنامه نویسان نیاز به تحول جدی داشته
و سبک های مختلفی معرفی شده است.
www.EasyMCU.org
19 برنامه نویسی به روش RTOSبرای میکروکنترلرها
خواهد داشت و می تواند کار برنامه نویسی را تسهیل کند ،از این جهت که دیگر
کل برنامه درون یک ابر حلقه ) (Super Loopدر تابع mainنوشته نمی شود،
بنابراین برنامه ی بزرگ می تواند در بلوک های جداگانه ی کد ،در قالب تسک
) (Taskهای مختلف پیاده سازی شود و کار خوانایی ،نگهداری و قابلیت حمل آن
را به میزان قابل توجهی افزایش دهد .همینطور دیباگ کردن تسک ها می تواند
ساده تر شود.
www.EasyMCU.org
20 برنامه نویسی به روش RTOSبرای میکروکنترلرها
در نظر بگیرید که قصد داریم برنامه ای بنویسیم که کارهای ذیل را به صورت
همزمان اجرا کند.
www.EasyMCU.org
21 برنامه نویسی به روش RTOSبرای میکروکنترلرها
افزایش پیدا کنند و برنامه پیچیده تر شود ،روش یاد شده در باال کامال غیر
قابل استفاده خواهد بود و همینطور امکان نگهداری برنامه و ارتقاء آن در
آینده بسیار پیچیده و مشکل خواهد بود و در بعضی مواقع کامال غیر ممکن
است!
www.EasyMCU.org
22 برنامه نویسی به روش RTOSبرای میکروکنترلرها
و بجای تاخیرTask ،به خواب ) (sleepمی رود و فرصت اجرا شدن را به
Taskبعدی می دهد و به این ترتیب از ماکسیمم توان پردازنده می توان
بهره برد و بهینه ترین برنامه ها و عملکردها را می توان نوشت.
نتیجه
همانطور که دیده می شود ،با استفاده از RTOSدر میکروکنترلرها ،امکان
درک پروژه پیاده سازی شده بیشتر می شود و در دراز مدت می توان پروژه
را به راحتی تحلیل کرد ،همینطور در قالب Taskهای جدید ارتقاء داد .عالوه
براین می توان اولویت اجرا برای هر وظیفه (تسک) قائل شد .مورد قابل
توجه در دید ما ،اجرا شدن تمام Taskها به صورت همزمان در کنار یکدیگر
است! این گفته صحبت قبلی را رد نمی کند ،همچنان پردازنده توانایی اجرای
یک دستور در هر لحظه را دارد و نه بیشتر ،و اما توسط سیستم عامل چطور
این اتفاق به صورت همزمان نمود می کند؟!
www.EasyMCU.org
23 برنامه نویسی به روش RTOSبرای میکروکنترلرها
در واقع سیستم عامل در پشت پرده ،یک هسته با برنامه نویسی پیچیده
دارد که نام آن ( Schedulerزمان بندی کننده) است .به این ترتیب زمان
اجرای Taskها ،وقفه های حین اجرا ،اولویت ها و … همه و همه به
وسیله ی Schedulerکنترل می شود Scheduler .زمان های محدودی در
حد چند میلی ثانیه برای اجرای هر Taskقائل است که به آن تکه های
زمانی ) (Time Sliceیا ( )Time Slotگفته می شود .اگر تسک در حال
اجرا در این مدت زمان به اتمام نرسد ،در صورتی که Taskای با اولویت
باالتر وجود داشته باشد ،اجرای Taskفعلی را متوقف می کند و خط اجرای
برنامه را به Taskبا اولویت اجرای باالتر می دهد و خطوط اجرا را از سر می
گیرد .در زمان جابه جایی Taskها ،به خاطر می سپارد که هر Taskتا چه
خطی اجرا شده است و در دور بعدی که نوبت به اجرای همان Taskبرسد،
خط اجرا را از همان نقطه که متوقف شده بود ،ادامه و از سر می گیرد.
به این ترتیب با اجرای سریالی از هر تسک به اندازه ی چند میلی ثانیه،
باعث می شود که در یک ثانیه ،همه ی تسک ها چند بار به صورت مکرر
اجرا شوند و این امر موجب می شود که عملیات اجرای تسک ها همزمان
نمود کند و این مزیت RTOSاست که به طراح این اطمینان را می دهد که
www.EasyMCU.org
24 برنامه نویسی به روش RTOSبرای میکروکنترلرها
اجازه بده ید بحث را با معرفی نرم افزارها و سخت افزارهای مورد نیاز برای شروع
یادگیری برنامه نویسی به سبک RTOSادامه دهیم .با توجه به توضیحات قبل یک
میکروکنترلر از میکروکنترلرهای شرکت STرا معرفی می کنم که برای شروع
میکروکنترلر ی ارزان و مناسب است و آن STM32F103C8Txاست ،اگر عالقه
مند بودید که یک برد توسعه بر مبنای این میکروکنترلر تهیه کنید ،برد mini
STM32یک برد ارزان و در دسترس است که اندازه کوچکی دارد و به راحتی می
توان آن را بر روی بردبورد متصل کرد و به روش SWDبا پروگرامر/دیباگر St-Link
و یا J-linkکار برنامه ریزی برد را انجام داد .تصویر برد و پروگرامر/دیباگرهای یاد
شده را در ذیل مشاهده می کنید.
www.EasyMCU.org
25 برنامه نویسی به روش RTOSبرای میکروکنترلرها
تصویر St-Link
www.EasyMCU.org
26 برنامه نویسی به روش RTOSبرای میکروکنترلرها
تصویر J-link
همانطور ،از نرم افزار STM32cubeMXکه توسط شرکت STتوسعه داده می
شود ،استفاده می کنیم و واحدهای مورد نیاز را پیکربندی می کنیم تا بیس پروژه
آماده شود .کار برنامه نویسی را در محیط Keilادامه می دهیم و پروژه مدنظر را
پیاده سازی می کنیم.
www.EasyMCU.org
27 برنامه نویسی به روش RTOSبرای میکروکنترلرها
CMSIS-RTOSو FreeRTOS
در بخش های قبلی در مورد سیستم عامل بالدرنگ FreeRTOSصحبت کردیم.
همینطور فهیدیم که CMSISبه چه هدفی به وجود آمده است .این اواخر
CMSIS-RTOSنیز ارائه شده به این هدف که APIهایی در اختیار برنامه نویس
قرار دهد که وی را از سطح خود سیستم عامل مورد استفاده جدا کند ،حال آنکه
سیستم عامل مورد بحث می تواند FreeRTOS ، RTXو ...باشد .به عبارت دیگر
این کتابخانه اصطالحا شامل wrapperهایی می باشد که APIهای RTOSرا به
CMSIS-RTOSمی دوزد و زین پس برنامه نویس بجای اینکه از APIهای خود
RTOSبخواهد استفاده کند ،از APIهای CMSIS-RTOSاستفاده می نماید .به
بیانی دیگر CMSIS-RTOSمی تواند الیه ای بین برنامه نویس و RTOSباشد.
به این ترتیب می توان APIهای CMSIS-RTOSرا به طور کلی نادیده گرفت و
به طور مستقیم از APIهای RTOSموردنظر استفاده کرد.
www.EasyMCU.org
28 برنامه نویسی به روش RTOSبرای میکروکنترلرها
www.EasyMCU.org
29 برنامه نویسی به روش RTOSبرای میکروکنترلرها
استفاده از این نرمافزار دارید ،این آموزش عالی رو از دست ندید ،حتی اگر با محیط
این نرم افزار هم آشنا هستید توصیه می کنم روی این آموزش یک مرور سریع
داشته باشید .در ادامه اینطور در نظر میگیریم که با این محیط آشنایی دارید،
بنابراین توضیحات خالصهتری ارائه میشود.
https://easymcu.org/fa/product/stm32cubemx-video-tutorial/
www.EasyMCU.org
30 برنامه نویسی به روش RTOSبرای میکروکنترلرها
قبل از خواندن ادامهی مطالب ،توصیه می کنم نتیجهی پروژهی یاد شده را در لینک
زیر پیگیری کنید ،در یک سمت ویدئو پیاده سازی با روش Super Loopو در
سمت دیگر با روش RTOSپیاده سازی شده است.
www.EasyMCU.org
31 برنامه نویسی به روش RTOSبرای میکروکنترلرها
https://www.aparat.com/v/yoB8q
اکنون که فیلم عملکرد پروژه را مشاهده کردید ،حدس شما به نتیجه تا چه حد
نزدیک بود؟
www.EasyMCU.org
32 برنامه نویسی به روش RTOSبرای میکروکنترلرها
تنظیم GPIO
نرم افزار STM32cubeMXرا اجرا میکنیم ،آخرین ورژن این نرمافزار و نرم افزار
استفاده شده در این کتاب ورژن 5.6.1است .در پروژهی اول که در باال تعریف
شده است ،نیاز داریم که دو پایه از میکروکنترلر STM32F103C8xرا به صورت
خروجی پیکربندی کنیم و در سختافزار آن دو عدد LEDرا متناظر با این پایهها در
نظر بگیرم .مطابق تصویر زیر پایههای B12و B13از برد mini STM32را برای
این منظور اختصاص میدهیم B12 .معادل LED1و B13معادل LED2خواهد
بود .این موارد را در ادامه در محیط Keilبه صورت Defineشده در نظر می
گیریم.
www.EasyMCU.org
33 برنامه نویسی به روش RTOSبرای میکروکنترلرها
تنظیم FreeRTOS
www.EasyMCU.org
34 برنامه نویسی به روش RTOSبرای میکروکنترلرها
واحد UARTرا به شرح تصویر زیر فعال میکنیم( .از این واحد برای پروژه بعدی
استفاده میکنیم) .باود ریت را برابر 115200تنظیم می کنیم 8 ،بیت دیتا1 ،
استاپ بیت ،بدون بیت پریتی.
www.EasyMCU.org
35 برنامه نویسی به روش RTOSبرای میکروکنترلرها
تنظیم SWD
در ادامه پایههای ) Serial Wire (SWرا نیز از بخش SYSفعال میکنیم.
www.EasyMCU.org
36 برنامه نویسی به روش RTOSبرای میکروکنترلرها
در صورتی که اطالعات بیشتری در رابطه با پروگرام کردن این میکروکنترلر نیاز
دارید ،لینکهای زیر توضیحات کاملی را پوشش دادهاند.
www.EasyMCU.org
37 برای میکروکنترلرهاRTOS برنامه نویسی به روش
www.EasyMCU.org
38 برنامه نویسی به روش RTOSبرای میکروکنترلرها
www.EasyMCU.org
39 برنامه نویسی به روش RTOSبرای میکروکنترلرها
www.EasyMCU.org
40 برنامه نویسی به روش RTOSبرای میکروکنترلرها
www.EasyMCU.org
41 برنامه نویسی به روش RTOSبرای میکروکنترلرها
www.EasyMCU.org
42 برنامه نویسی به روش RTOSبرای میکروکنترلرها
بعد از زدن دکمهی Generateیک پیغام اخطار نمایان میشود که این مورد را
گوش زد میکند ،در زمان استفاده از FreeRTOSبهتر است از یک تایمر دیگر بجای
Systickاستفاده کنید .اینجا قصد نداریم وارد جزئیات بشیم .بنابراین پیغام را OK
میکنیم و پروژه را تولید میکنیم ،توضیحات بیشتر در این رابطه در آینده ارائه
خواهد شد.
www.EasyMCU.org
43 برنامه نویسی به روش RTOSبرای میکروکنترلرها
بعد از تولید فایل های پروژه یک پیغام ظاهر میشود مشابه تصویر زیر .در صورتی
که بخواهید پروژه مستقیم در محیط کد نویسی اجرا شود ،دکمه Open Project
را انتخاب کنید .در صورتی که بخواهید به پوشهی تولید فایلهای پروژه هدایت
شوید ،دکمهی Open Folderرا انتخاب کنید.
www.EasyMCU.org
44 برنامه نویسی به روش RTOSبرای میکروکنترلرها
www.EasyMCU.org
45 برنامه نویسی به روش RTOSبرای میکروکنترلرها
www.EasyMCU.org
46 برنامه نویسی به روش RTOSبرای میکروکنترلرها
در تصویر باال محتویات تنهی اصلی برنامه قابل مشاهده است.
بخش : 9این تابع به منظور پیکربندی کردن سبک برنامه نویسی HALفراخوانی
شدهاست.
www.EasyMCU.org
47 برنامه نویسی به روش RTOSبرای میکروکنترلرها
بخش : 5این تابع کرنل RTOSو Schedulerرا اجرا میکند ،به این معنی است
که ازین پس برنامه به سبک سیستم عامل اجرا میشود.
بخش : 7در صورتی که سیستم عامل به درستی اجرا شود ،خط برنامه نباید به
بخش 6برسد ،در غیر اینصورت خطایی رخ دادهاست.
حاال برنامهی چشمکزن را به سبک سنتی پیادهسازی میکنیم .دقت کنید که در
محیط STM32cubeMXواحدهای بیشتری را فعال کردهایم که در این پروژه از
آنها استفاده نمیکنیم ،در عوض برای پروژه بعدی نیازی نیست مجدد به محیط
STM32cubeMXمراجعه کنیم و تنظیمات بیشتری را انجام دهیم .بنابراین
محتویات این تابع mainرا کامنت میکنیم که بعدا از آن استفاده کنیم و در عوض
یک تابع mainجدید به عنوان گام اول پیادهسازی کرده که محتوای آن به شرح
زیر است.
//------------------------------------
//--> Macro Defenition
//------------------------------------
www.EasyMCU.org
48 برای میکروکنترلرهاRTOS برنامه نویسی به روش
//---------------------------------------
//--> Super Loop method
//---------------------------------------
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while(1)
{
{ //LED1
LED1_SET(1);
HAL_Delay(DELAY_LOW);
LED1_SET(0);
HAL_Delay(DELAY_LOW);
}
{ //LED2
LED2_SET(1);
HAL_Delay(DELAY_HIGH);
LED2_SET(0);
HAL_Delay(DELAY_HIGH);
}
}
}
www.EasyMCU.org
49 برنامه نویسی به روش RTOSبرای میکروکنترلرها
تعدادی ماکرو به منظور اعمال وضعیت LEDها و تاخیرها در نظر گرفته شدهاست.
همانطور که مشاهده می شود در کد باال که به سبک سنتی در یک سوپر لوپ
( )Super Loopنوشته شدهاست ،دو بخش برنامه که یکی وضعیت LED1را
کنترل میکند و دیگری وضعیت LED2را کنترل میکند ،کامال به یکدیگر مربوط
هستند و بر روی یکدیگر اثر میگذارند .به عبارت دیگر تغییر وضعیت LED1بستگی
به تاخیرهای اعمالی به LED2هم دارد ،و اگر بخواهیم وضعیت LED1را تغییر
دهیم ،ناگزیریم بخش مربوط به LED2را نیز تغییر دهیم.
ممکن است به ذهنتان روشهای دیگر ی خطور کند ،مثال برنامهنویسی بدون
استفاده از تاخیرهای به این سبک ،یا با استفاده از تایمر و اختصاص شرطهای
زمانی موازی بین تسکها ،یا روش استفاده از وقفه و ، ...اما در کل ایدهی اصلی
تمام روشهای یاد شده سوپر لوپ است و در نهایت وظایف برنامه که از حدی
بیشتر باشد به شرایط محدودی مانند مثال سادهی یاد شده در باال م رسد .پس
این مثال ساده میتواند با یک پروژهی پیچیده و بزرگ پیاده سازی شده به روش
سوپر لوپ که حاال قصد تغییراتی بر روی آن را داریم ،مدل شود .پس لطفا از این
دید به ماجرای سبکهای کدنویسی نگاه کنید.
www.EasyMCU.org
50 برنامه نویسی به روش RTOSبرای میکروکنترلرها
به منظور دیدن نتیجه ،سختافزار سادهای مشابه تصویر زیر بر روی بردبورد می-
بندیم.
برای مشاهده نتیجه ،نیاز است که برنامه نوشته شده را با زدن دکمه ی F7کامپایل
و سپس برد mini STM32را پروگرام کنیم .خروجی که نرم افزار
STM32cubeMXتولید میکند ،به صورت پیشفرض ،نوع دیباگر/پروگرامر را
ST-Linkانتخاب میکند .جهت آموزش نحوه ی پروگرام کردن برد mini STM32
لینک های زیر را بررسی کنید.
www.EasyMCU.org
51 برنامه نویسی به روش RTOSبرای میکروکنترلرها
https://easymcu.org/fa/stm32-stlink-keil-program/
https://easymcu.org/fa/stm32-stlink-utility-program/
https://easymcu.org/fa/program-st-jlink/
www.EasyMCU.org
52 برنامه نویسی به روش RTOSبرای میکروکنترلرها
از defineهای گام قبلی مستقیم در این مرحله نیز استفاده می کنیم.
هر تسک نیاز به یک handleدارد ،برای این منظور از کدهای ذیل استفاده می
کنیم.
www.EasyMCU.org
53 برای میکروکنترلرهاRTOS برنامه نویسی به روش
int main(void)
{
//--> Init System
HAL_Init();
SystemClock_Config();
www.EasyMCU.org
54 برنامه نویسی به روش RTOSبرای میکروکنترلرها
)while (1
{
}
}
در تصویر فوق 2عدد تسک تعریف شده ،تسک 1وظیفه ی کنترل LED1را بر عهده
دارد و تسک 2وظیفه ی کنترل LED2را بر عهده دارد .در تصویر فوق صرفا این دو
تسک را در بدنه ی تابع mainتعریف کردیم .در آینده به جزئیات بیشتر می
پردازیم.
در گام بعدی روتین وظیفه ی هر کدام از تسک ها را به صورت جداگانه پیاده سازی
می کنیم که مشابه یک حلقه ی مستقل بینهایت اختصاصی به ازاء هر تسک می
باشد.
www.EasyMCU.org
55 برنامه نویسی به روش RTOSبرای میکروکنترلرها
www.EasyMCU.org
56 برنامه نویسی به روش RTOSبرای میکروکنترلرها
برنامه ی جدید را که بر مبنای RTOSپیاده سازی شده است ،با استفاده از دکمه
F7کامپایل می کنیم و برد را مجدد برنامه ریزی یا اصطالحا پروگرام می کنیم.
www.EasyMCU.org
57 برنامه نویسی به روش RTOSبرای میکروکنترلرها
تابع )(osDelaly
این تابع یکی از APIهای CMSIS-RTOSمی باشد که به موجب آن ،روتین
اجرای تسکی که در آن فرا خوانی می شود را به میزان تعیین شده در ورودی تابع
به از حالت RUNخارج کرده و به حالت Readyمی برد .به عبارت دیگر این تابع
درون هر تسکی فراخوانی شود ،آن تسک را به میزان تعیین شده می خواباند ،در
این بین اگر تسک دیگری آماده ی اجرا باشد ،فرصت اجرا را در دست می گیرد و
هیچ زمانی تلف نمی شود.
در سبک کد نویسی معمولی با استفاده از تابع )( CPU ،delayرا مجبور می کنیم
که دور باطل بزند ،تا زمان تاخیر مورد نیاز ما برآورده شود ،و این به مفهوم اتالف
زمان CPUمی باشد .اما در سبک سیستم عامل بالدرنگ ،این میزان تاخیر با مفهوم
www.EasyMCU.org
58 برنامه نویسی به روش RTOSبرای میکروکنترلرها
دیگری اجابت می شود و از این زمان تاخیر برنامه استفاده می کند تا فرصت اجرای
برنامه را به تسکی بدهد که آماده ی اجرا می باشد.
حال ممکن است این سوال پیش بیاید که اگر هیچ تسکی آماده ی اجرا نباشد،
چه اتفاقی می افتد؟ در این حالت یک تسک پیشفرض به نام Idleدر زمان اجرای
schedulerایجاد می گردد که در زمانی که تسکی در حال اجرا نباشد ،این مورد
را به عهده بگیرد ،به این ترتیب می توان اجرای تسک ها و وظایف را بهینه کرد و
حتی در زمانی که تسکی در حال اجرا نیست هسته را در حالت Power Down
قرار داد که به میزان قابل توجه ای در مصرف انرژی صرفه جویی می کند و برای
دستگاه های پرتابل ،زمان کارکرد طوالنی تری را به ازاء هر بار شارژ دستگاه در پی
دارد.
اولویت Priority
زمانی که تسک ها را تعریف می کنیم ،این امکان را داریم که اولویت اجرای آنها را
نیز تعیین کنیم ،به این مفهوم است که اگر وظیفه ای دارای اولویت اجرای باالتر
باشد ،و زمان اجرا شدن آن فرا رسیده باشد در حالی که در این لحظه یک تسک با
اولویت پایین تر در حال اجرا می باشد scheduler ،تسک در حال اجرا را به حالت
Readyمی برد و تسک با اولویت باالتر را در حالت اجرا قرار می دهد .اصالحا به
www.EasyMCU.org
59 برنامه نویسی به روش RTOSبرای میکروکنترلرها
این وضعیت گفته می شود که تسک با اولویت باالتر درون تسک با اولویت پایین
تر preemptشده است.
www.EasyMCU.org
60 برنامه نویسی به روش RTOSبرای میکروکنترلرها
www.EasyMCU.org
61 برای میکروکنترلرهاRTOS برنامه نویسی به روش
.یک ماکرو به منظور پرینت کردن اطالعات به شرح زیر تعریف می کنیم
#include <string.h>
#define Print(x) HAL_UART_Transmit(&huart1, (uint8_t*)x, strlen(x), 100);
مربوط به واحدinit مطمئن شوید که تابعmain در این پروژه کافیست که در تابع
به شرح ذیلmain به این ترتیب محتویات تابع. فراخوانی شده استUART
. به تعریف تسک ها می پردازیمmain مشابه قبل در تنه ی تابع.خواهد بود
int main(void)
{
//--> Init System
HAL_Init();
SystemClock_Config();
www.EasyMCU.org
62 برای میکروکنترلرهاRTOS برنامه نویسی به روش
while (1);
}
www.EasyMCU.org
63 برنامه نویسی به روش RTOSبرای میکروکنترلرها
www.EasyMCU.org
64 برنامه نویسی به روش RTOSبرای میکروکنترلرها
با اولویت باالتر شده باشد ،این تسک منتظر ،منتظر تسک اولویت پایین در حال
اجرا نمی ماند تا تمام بشود و اصطالحا تسک با اولویت باالتر درون تسک با اولویت
کمتر که در حال اجراست preemptمی شود و تسک در حال اجرا را به حالت
Readyمی برد.
www.EasyMCU.org
65 برای میکروکنترلرهاRTOS برنامه نویسی به روش
This is Task 2
This is Task 1
This is Task 2
This is Task 1
This is Task 2
This is Task 1
www.EasyMCU.org
66 برنامه نویسی به روش RTOSبرای میکروکنترلرها
نتیجه
تا اینجا به یک درک بسیار ابتدایی از عملکرد RTOSرسیدیم .با پیاده سازی پروژه
به روش Super Loopو RTOSآشنا شدیم و در کنار یکدیگر دیدیم که استفاده
از RTOSهمچین هم پیچیده به نظر نمی رسد و بسیار روش دلچسب ،دقیق و
مطمئنی است مخصوصا برای پروژه های بزرگ ،پروژه هایی که تسک هایی برای
اجرای همزمان نیاز دارد ،مثل پروژه هایی که دارای رابط گرافیکی هستند و یا به
شبکه اینترنت متصل می شوند و در حیطه ی پروژه های IOTقرار می گیرند .در
دهه ی پیش رو آنطور که نیازمندی های شرکت ها گویاست ،تمایل به استفاده از
سیستم عامل های بالدرنگ در پروژه ها بسیار بیشتر از پیش به چشم می خورد و
اما سخن پایانی ...
www.EasyMCU.org
67 برنامه نویسی به روش RTOSبرای میکروکنترلرها
سخن پایانی
با این تفاسیل پر واضح است که توانایی برنامه نویسی بر پایه ی سیستم های
بالدرنگ امروزه تبدیل به یک ضرورت شده است .اگر عالقه مند به پیشرفت و
تضمین موقعیت شغلی خود در آینده هستید ،پیشنهاد می کنم که سری به وبسایت
easymcu.orgبزنید و در کنار دیگر مهندسان خواهان پیشرفت حضور یابید.
امیدوارم که در دورهی FreeRTOSهمراه شما باشیم.
www.EasyMCU.org