باسلام
یه سوال داشتم دوستانی که تجربه دارند ممنون میشم کمک کنند🙏🏻
مناسبترین برد برای کار روی یک پروژه سنگین (مثل ECUخودرو) که شامل میکرو STM32 باشه و معماری RTOS رو هم ساپورت کنه چی پیشنهاد میدید؟
تو استفاده از rtos ها یه سری نکات رو رعایت کنید که بعدا به مشکل نخورید.
سعی کنید از api های استاتیک اون استفاده کنید،تسک ها صف ها و سمافور رو به صورت استاتیک تعریف کنید.
به جای جابهجایی داده ها با صف یا بافر مسیج ها از پوینتر ها برای جابهجایی داده استفاده کنید. خود این جابهجایی داده ممکنه پردازش اضافی داشته باشه.
اگر میخواید تو وقفه ها از توابع rtos استفاده کنید از نسخه isr اون توابع استفاده کنید.
به جای سمافمور باینری از نوتیف ها استفاده کنید که ۵۰ درصد سریع ترن
بهترین فلگ(علامت دادن) استفاده از notification هست بعدش semaphore
از کويی ها برای تسک های آنی به هیچ وجه استفاده نکنید.
برای زمان بندی دقیق از vTaskDelayUntil استفاده کنید.vTaskDelay زمان اجرای کد رو در نظر نمیگیره.
آخر تسک هایی که میدونی میکرو کاری نمیکنه از portYield استفاده کن تا rtos کانتکس سوییچ انجام بشه
#rtos
#freertos
@Embedded_geek
RTOS - بخش یک
آر تووس!! یا سیستم عامل های بلادرنگ یک جور OS هایی هستند که قرار هست کوچک و قطعی در اجرا باشند.هدف کوچک بودن از نظر حافظه و رم مصرفی و بهینه بودن در اجرای دستورات و مصرف انرژی هست بر خلاف سیستم عامل های general purpose.
Multitasking یا چند تسکی
کرنل(kernel) هسته یک سیستم عامل هست. در سیستم عامل هایی مثل لینوکس کرنل این قابلیت رو به کاربر میده که به پراسسور همزمان دسترسی پیدا کنند و تسک های خودشون رو ظاهرا همزمان اجرا کنند.
هرکدام از این تسک ها توسط یک رشته یا threads زیر نظر سیستم عامل اجرا میشه.اگر سیستم عامل بتونه چند رشته رو باهم اجرا کنه میگن Multitasking انجام میده. اما تو سیستم عامل های مختلف این کلمه رشته متفاوته مثلا تو freertos به همین رشته میگن task یا توابع posix که یک wrapper روی freertos تو فریمورک esp-idf هست بهش میگه thread .
Multitasking در برابر Concurrency
میکرو و پروسسر های تک هسته ای درحالت عادی میتوانند یک تسک رو اجرا کنند اما اگر سیستم عامل دائم بین تسک ها سوییچ کنه انگار که تسک ها دارن به صورت موازی اجرا می شن. این برخلاف این هست که پردازنده چند هسته چند تسک که واقعا به صورت موازی اجرا میکنه.
Scheduling
زمانبند یا scheduler یه بخش از کرنل هست که تصمیم میگیره در لحظه چه تسکی اجرا بشه.
هر تسکی ممکنه یک وضعیت داره و در آینده ممکنه این وضعیت تغییر بکنه.برای مثال تسک A اجرا میشه و بعد مدتی Block میشه و تسک B اجرا میشه.
وضعیت تسک ها میشه به چهار مورد زیر برای Freertosدسته بندی کرد:
حالت Running
تو این حالت تسک به معنای واقعی در حال اجرا روی پردازنده هست.برای یک پردازنده یک هسته ای در لحظه تنها یک تسک وضعیت running داره.
حالت Ready
در این حالت تسک ها نمیتونن اجرا بشن ولی وضعیت suspend یا blocked هم ندارن،این موقعیت وقتی پیش میاد که یک تسک دیگه با اولویت یکسان یا بالاتر در حالت Running هست.
حالت Blocked
وقتی تسکی در این وضعیت باشه منتظر یک پدیده(event) خارجی هست.برای مثال وقتی از توابع delay استفاده میکنید تسک وارد حالت Blockedمیشه تا وقتی که delay تمام بشود. تسک همچنین میتواند برای صف ها، سمافور ها،event group ها و notification ها تو این حالت بلوکه باشه.معمولا تسک ها یک timeout برای این حالت دارند که اگر تمام بشود از این حال
FreeRTOS-part2
FreeRTOS که یک سیستم عامل بلادرنگ هست برای میکروکنترلر ها و کامپایلر های زیادی پورت شده است. از این لینک میتونید برنامه دموی این rtos رو برای میکروهای مختلف ببنید.همچنین این rtos قابلیت شبیه سازی برروی ویندوز رو داره میتونید از این لینک بهش دسترسی پیدا کنید.همچنین میتونید از Qemu برای شبیه سازی این سیستم عامل با معماری های مختلف مثل cortexm-3 و riscv استفاده کنید.
آناتومی Freertos
برنامه شما تا قبل اینکه vTaskStartScheduler فراخونی بشه مثل یک برنامه non-rtos هست که معمولا اون رو تو main فراخونی میکنند. rtos فقط دستورات پس از فراخونی این تابع رو مدیریت میکنه.سورس های این به زبان c هست که اگر این کل کدش رو از سایت Freertos.org دانلود کنید به فرمت زیر هست.
FreeRTOS/Source/tasks.c
FreeRTOS/Source/queue.c
FreeRTOS/Source/list.c
FreeRTOS/Source/portable/[compiler]/[architecture]/port.c.
FreeRTOS/Source/portable/MemMang/heap_x.c
این ها حداقل فایل هایی هستند که به پروژه خودتون باید اضافه کنید. برای تایمر های نرم افزاری، event group،stream buffer ، message buffer و قابلیت co-routine باید سورس فایل های مربوطه رو به کدتون اضافه کنید.
فایل های هدر زیر هم هم باید در Include path کامپایلر تعریف شوند:
FreeRTOS/Source/include
FreeRTOS/Source/portable/[compiler]/[architecture].
هر پروژه ای یک فایل به نام FreeRTOSConfig.h داره وظیفش مدریت کرنل rtos هست که در فایل سورس اصلی تون باید قرار بگیره نه مسیر سورس کد rtos.
configMINIMAL_STACK_SIZE یکی از ماکرو های این فایل هستش که میزان استکی که به تسک idleاختصاص داده میشه رو تعیین میکنه.اگر خیلی کم درنظر بگیرید ممکنه برنامه stackoverflow بکنه.پس بهتر هست که مقدارش رو طبق دمو های خود سایت freertos.org قرار بدید یا از قالب آماده این لینک استفاده کنید.
Interrupt Vectors
هر rtos از تایمر برای ایجاد وقفه های تیک متناوب(periodic tick interrupt) استفاده میکند.خیلی از پورت ها(ports) ها از تایمر های اضافی برای context switching استفاده میکنند. وقفه های که rtos استفاده میکند توسط فایل سورس پورت rtos تعریف میشن. تعریف این وقفه ها هم به پورت و کامپایلر بستگی داره
#rtos
#freertos
@Embedded_geek
FreeRTOS-part3
FreeRTOS Libraries
توزیع های freertos بیش از یک کرنل هستند. این توزیع ها کتابخونه های مختلفی را به همراه کرنل فراهم میکنند که میتوانند در سیستم عامل هایی مثل لینوکس و دیگر rtos ها اجرا شوند.این کتابخونه ها به دسته بندی های متفاوت تقسیم میشن:
FreeRTOS-Plus libraries
که دو افزونه متفاوت را دارد:
FreeRTOS-Plus-TCP
استک TCP/IP برای freertos
FreeRTOS-Plus-CLI
وجود رابط خط فرمان برای freertos
FreeRTOS core libraries
کتابخونه های freertos به زبان سی بدون هیچ وابستگی به کتابخونه دیگر براساس استاندارد های اتصال(connectivity) و امنیتی
coreMQTT
پایده سازی پروتکل MQTT برای freertos
coreMQTT Agent
یک رشته برای مدیریت هماهنگی بین چندین MQTT
coreHTTP
کتابخانه HTTP برای freertos
coreSNTP
کتابخانه پروتکل SNTP برای freertos
Transport Interface
کتابخانه برای لایه لایه انتزاعی انتقال داده ها
coreJSON
کتابخانه برای pars کردن json
corePKCS
کتابخانه برای پیاده سازی استاندارد PKCS
FreeRTOS Cellular Interface Library
کتابخونه برای ارتباط با مدم های سلولی
Modular Over the Air Updates
کتابخونه برای آپدیت OTA
FreeRTOS for AWS IoT
کتابخونه های freertos برای فریمورک IoT امازون.
AWS IoT Device Shadow
AWS IoT Jobs
AWS IoT Device Defender
AWS IoT Fleet Provisioning
AWS Signature Version 4
FreeRTOS labs
کتابخونه های که عمل میکنند اما ناقص،آزمایشی و یا حتی برای علاقه جامعه برنامه نویسان ساخته شده.
LoRaWAN: کتابخانه برای پروتکل LoRaWAN
FreeRTOS-Plus-POSIX: پیاده سازی توابع براساسapi های posix
FreeRTOS-Plus-FAT: سیستم فایل FAT
FreeRTOS MCUBoot: کتابخانه بوتلودر برای برای میکروها
#rtos
#freertos
@Embedded_geek
FreeRTOS-part4
کرنل freertos در مدت ۱۸ سال با کمپانی های متفاوت توسعه داده شده.در ادامه توضیح میدیم اصن freertos چی هست بعد از ۳ پارت!!
سیستم عامل های General Purpose چی هستند؟
این سیستم عامل یک برنامه کامپیوتری هست که قابلیت های ساده کامپیوتر رو پشتیبانی میکنه و همچنین به برنامه های دیگه مثل اپلیکیشن ها سرویس میده.اپلیکیشن قابلیت ها و نیاز های کاربر رو فراهم میکنه.سرویس هایی که توسط سیستم عامل ارائه میشن نوشتن اپلیکشین ها رو سریع تر،ساده تر و قابل نگهداری میکنند.
RTOS چی هست؟
خیلی از سیستم عامل ها اجازه میدن که چندین برنامه همزمان اجرا بشن که بهش Multi-tasking میگن.در واقعیت هر هسته پردازنده میتونه یک رشته یا thread رو اجرا کنه و زمان بند یا scheduler وظیفه داره که انتخاب کنه در لحظه چه برنامه ای اجرا بشه و همچنین این توهم رو ایجاد که که برنامه ها همزمان اجرا میشن با دائما سوییچ کردن بین هر برنامه. نوع سیستم عامل توسط نوع زمانبند اون تعریف میشه مثلا برای یک سیستم عامل مثل unix زمانبند اون به هر کاربر زمان اجرای مساوی اختصاص میده و مثلا در ویندوز هدف زمانبند این هست که در اول به کاربر پاسخگو باشه.
زمابند در rtos ها طراحی شدند که الگوی اجرای قابل پیش بینی(deterministic) فراهم کنند.
بلادرنگ بودن ایجاب میکنه که امبدد سیستم نسبت به یک رویداد مشخص قبل از زمان تعیین شده(deadline) پاسخ بده. این فقط زمانی اتفاق میافته که که رفتار زمانبند سیستم عامل قابل پیشبینی باشه. زمابند بلادرنگ مانند آنچه در freertos هست این قطعیت(determinism) رو با فراهم کردن قابلیت تخصیص اولویت(priority) برای کاربر فراهم میکنند. این اولویت تعیین میکنه که کدام رشته قرار هست در دفعه بعد اجرا بشه. تو freertos به رشته ای که اجرا میشه میگن تسک یا task.
FreeRTOS چی هست؟
یک کلاس از rtos می باشد که طراحی شده که آنقدر کوچک باشه که در میکروکنترلر ها اجرا بشود هرچند که محدود به کاربرد های میکروکنترلر ها محدود نمیباشد. محدودیت های فضا و ذات اپلیکیشن های اختصاصی بسیار کم اجازه استفاده از تمام قابلیت های rtos را میدهند.قابلیت های اضافی مثل رابط خط فرمان(CLI) پیشته های شبکه(networking stack) میتوانند به همراه ادان های دیگر با freertos استفاده شوند.
#Freertos
#rtos
@Embedded_geek
FreeRTOS-part5
Tasks and Co-routines
در این پارت درمورد task ها و co-routin ها صحبت میکنیم.اپلیکیشن ها میتوانند تنها با تسک ها یا فقط کو روتین ها یا ترکیبی از هردو استفاده کنند اما هرکدام از api های متفاوت استفاده میکنند و کیو(Queue) از یک تسک به کو روتین یا برعکس نمی تونه ارسال بشه .
کو روتین ها برای پردازنده هایی که محدودیت زیادی در رم دارند استفاده میشن.
خصوصیات تسک
به طور خلاصه یه اپلیکیشن بلادرنگ که از rtos استفاده میکنه میتونه مجموعه ای از تسک های مستقل باشه.هر تسک درون چارچوب خودش اجرا میشه بدون هیچ وابستگی تصادفی به تسک های دیگر داخل سیستم یا زمانبند(Scheduler).در لحظه تنها یک تسک میتونه در هر لحظه از زمان اجرا بشه و زمانبند مسئول این هست که تصمیم بگیره کی اجرا بشه.پس زمانبند ممکن است که هر تسک رو به طور مکرر شروع و متوقف کنه.یک تسک هیچ اطلاعی از فعالیت زمانبند نداره و مسئولیت زمانبند rtos هست که context پروسسور(مثل مقادیر رجیستر ها،محتوای استک و..) همان مقداری باشد که تسکی شروع شد همان مقداری باشد که متوقف میشود.برای دستیابی به این هدف هر تسکی یک پشته(استک) مخصوص خودش رو داره. وقتی که یک تسک متوقف میشه کانتکس(context) اجرای تسک در پشته ذخیره میشه. پس همان تسک وقتی دوباره اجرا میشه میتونه بازیابی بشه.
خلاصه تسک:
ساده،
هیچ محدودیتی در استفاده ندارد،
تمام پیشدستی (preemption) هارو ساپورت میکنه،
کاملا اولویت بندی شده(Fully prioritised)
هر تسک استک خودش رو داره که مصرف رم رو بیشتر میکنه،
در صورت استفاده از پیشدستی، باید ورود مجدد به دقت در نظر گرفته شود.
فرق priority(اولویت) و preemption(پیشدستی)
تسک ها ممکنه اولویت های متفاوت داشته باشه این اولویت اجراشون رو تعیین میکنه اما اگر دو تسک اولویت یکسان داشته باشن چی؟ اینجاست که مفهوم preemption رو داریم که تسک با پیشدستی بیشتر اول اجرا میشه یعنی به معنای واقعی پیشدستی میکنه و اول اجرا میشه.
یه الگوریتم هم داریم به نام round robin algorithm این الگوریتم هم در سطح سخت افزار برای دو فعالیت مثل دسترسی همزمان cpu یا dma به یک حافظه تصمیم میگیره کدوم اول اجرا بشه
ویژگی های کو روتین
این کو روتین ها برای دستگاه های بسیار کوچک پیاده سازی شده اند اما بسیار کم استفاده شده اند در فیلد های امروزی. اگر چه هیچ پلنی برای حذ
FreeRTOS-part6
Task Priorities یا اولویت های تسک
هرتسکی یک اولویت از ۰ تا configMAX_PRIORITIES -۱ رو میتونه داشته باشه که مقدار configMAX_PRIORITIES در فایل هدر تنظیمات Freertos یعنی FreeRTOSConfig.h تنظیم میشه.
قبل از گفتن جمله بعدی چند مفهوم را شفاف سازی کنم تا بفهمید
پورت: همونطور که میدونید freertos باید برای هر میکرویی و معماری پورت بشه یعنی نحوره تعاملش با پردازنده و ارتباط با بخش های زمانبند ،وقفه ها و.. مدیریت بشه که ممکنه از زبان های سی و حتی اسمبلی برای اینکار استفاده بشه.
Count Leading Zeros: در برخی پردازنده ها یک قابلیت سخت افزاری وجود دارد که پردازنده ۳۲ بیتی بفهمه در یک رجیستر ۳۲ بیتی اولین بیت غیر صفر کدام است. از این قابلیت بعدا تو rtos میشه استفاده کرد.
اگر پورت استفاده از یک مکانیزم بهنیه شده برای انتخاب تسک استفاده میکنه مانند استفاده از CLZ وconfigUSE_PORT_OPTIMISED_TASK_SELECTION مقدار ۱ دارد در این صورت configMAX_PRIORITIES نمیتونه مقدار بیشتر از ۳۲ داشته باشد.
به ازای هر هسته پردازنده یک تسک idle داریم که دارای اولویت ۰ هست(در ادامه تسک idle رو میگم).
زمانبند freertos مطمئن میشه که تسک های در وضعیت ready یا running هموار پردازش پردازنده رو نسبت به تسکی با اولویت پایین تر که در وضعیت ready هست بگیره. در معنای دیگر تسک در حالت اجرا همواره بالاترین اولویت تسکی رو داره که باید اجرا بشه.
دوباره چند مفهوم رو قبلش بگم برای متن بعدی:
Time slicing: یعنی زمانبند میاد زمان اجرا هرتسکی ره به میلی ثانیه تقسیم میکنه
مثلا سه تسک با اولیت یکسان داریم و configTICK_RATE_HZ روی ۱۰۰ باشه میکرو هرتسکی رو ۱۰ میلی ثانیه اجرا میکنه.
الگوریتم Round Robin
یه الگوریتم برای زمانبندی برای مدیریت چند وظیفه یکسان
هرتعداد تسکی میتونن اولویت یکسانی داشته باشند.اگر configUSE_TIME_SLICING تنظیم نشده باشه این مقدار پیشفرض ۱ رو میگیره و تسک های با اولویت یکسان رو با زمان یکسان با time استفاده از slicing و الگوریتم round robin اجرا میکنه.
Idle Task یا تسک بیکار!!!
این تسک به طور اتوماتیک وقتی زمانبند شروع بکار میکنه ایجاد میشه که مطمئن باشه هموار حداقل یک تسک هست که اجرا بشه.اولویت این تسک هم پایین ترین مقدار هست که مطمئن بشیم زمان هیچ تسک با اولویت بالاتر ر
FreeRTOS-part7
زمابندی FreeRTOS(تک هسته،AMP و SMP)
در ادامه درمورد الگوریتم های زمابندی تک هسته، چند هسته ای نامتقارن(asymmetric multicore (AMP)) و چند هسته ای متقارن(symmetric multicore (SMP)) صحبت میکنیم.
الگوریتم زمابندی یه روتین نرم افزاری هست که تصیمی میگیره کدام تسک RTOS دارای وضعیت Running باشه. تنها یک تسک دارای وضعیت Running به ازای هر هسته در هر زمان مشخیص میتونه وجود داشته باشه.AMP حالتی هست که هر هسته پردازنده نمونه (Instance) خودش از FreeRTOS رو اجرا بکنه.ولی در SMP تنها یک نمونه از FreeRTOS هست که تصمیم میگیره تسک ها بین هسته های پردازنده اجرا بشن.کتاب خود FreeRTOS شامل جزییات و بلوک دیاگرام های بیشتری برای جزییات این الگوریتم ها هستش.
سیاسیت پیشفرش زمانبندی RTOS(تک هسته ای)
پیشفرض FreeRTOS از سیاست زمانبندی پیش دستی اولویت ثابت(fixed-priority preemptive scheduling policy) استفاده میکنه با استفاده از الگوریتم روند رابین برای time-slicing برای تسک های اولویت یکسان.
اولویت ثابت یا Fixed priority به این معناست که زمانبند اولویت یک تسک را به صورت دائمی تغییر نخواهد داد، اگرچه ممکنه به دلیل ارثبری اولویت(priority inheritance) ، به طور موقت اولویت یک وظیفه رو افزایش بده. بعدا درمورد این ارث بری اولویت توضیح میدم.
پیش دستی یا Preemptive یعنی زمانبند همیشه تسکی که بالاترین اولویت رو داره که قابل اجرا باشه رو اجرا میکنه بدون توجه به اینکه تسک کی قابل اجرا میشه. برای مثال یک روتین سرویس وقفه(ISR)اولویت یک تسک با بالاترین اولویت رو تغییر بده، زمانبند تسک فعلی در حال اجرا رو متوقف میکنه و تسک با اولیت بالاتر رو اجرا میکنه حتی اگر این در بین زمان time-slincing اتفاق بیافته. اصطلاحا میگن تسک با اولویت پایین تر preempted توسط تسک با اولویت بالاتر شده.
زمان برش خورده یا Time sliced به این معنا هست که زمانبند بین تسک های با اولویت یکسان سوییچ بکنه در هر تیک وقفه(tick interrupt)- زمان بین دو تیک وقفه میشه یک time slice.(تیک های وقفه، وقفه های متناوب هستند که توسط RTOS برای اندازه گیری زمان استفاده میشن.)
استفاده از زمانبند پیشدستی اولویت دار – جلوگیری از task starvation
عواقب همیشه اجرا کردن تسک با بالاترین اولویت باعث میشه که تسک هیچ وقت وارد حالت Blocked
FreeRTOS-part8
سیاست زمانبندی FreeRTOS در حالت AMP
در پردازش نامتقارن چند هستهای (AMP) با FreeRTOS، هر هسته در یک دستگاه چند هستهای، نمونه مستقل و جداگانهای از FreeRTOS را اجرا میکند. هستهها لزوماً نیازی ندارند که معماری یکسانی داشته باشند، اما اگر نمونههای FreeRTOS نیاز به ارتباط با هم داشته باشند، باید بخشی از حافظه را به اشتراک بگذارند.
از آنجایی که هر هسته نمونه مخصوص به خودش از FreeRTOS را اجرا میکند، الگوریتم زمانبندی روی هر هسته دقیقاً مشابه همان توضیحات سیستم تکهستهای است. میتوانید از Stream Buffer یا Message Buffer به عنوان ابزار ارتباط بین هستهها استفاده کنید. به این صورت، تسکها در یک هسته میتوانند وارد حالت Blocked شوند و منتظر داده یا رویدادی بمانند که از هسته دیگر ارسال شده است.
سیاست زمانبندی FreeRTOS در حالت SMP
در پردازش متقارن چند هستهای (SMP) با FreeRTOS، تنها یک نمونه از FreeRTOS وجود دارد که تسکهای سیستم عامل بلادرنگ را بین چندین هسته پردازنده زمانبندی میکند. از آنجایی که فقط یک نمونه FreeRTOS در حال اجراست، تنها یک پورت (Port) از FreeRTOS در هر زمان میتواند استفاده شود؛ بنابراین همه هستهها باید معماری پردازنده یکسانی داشته باشند و فضای حافظه یکسانی را به اشتراک بگذارند.
سیاست زمانبندی SMP در FreeRTOS از همان الگوریتم زمانبندی تکهستهای استفاده میکند. اما برخلاف سناریوهای تکهستهای و AMP، در SMP ممکن است در هر لحظه بیش از یک تسک در حالت Running وجود داشته باشد (یک تسک در حال اجرا برای هر هسته). این یعنی آن فرض قدیمی که «یک تسک با اولویت پایینتر فقط زمانی اجرا میشود که هیچ تسک با اولویت بالاتری آماده اجرا نباشد» دیگر برقرار نیست.
برای درک دلیل، یک مثال میزنیم: فرض کنید زمانبند SMP میخواهد تسکها را روی یک میکروکنترلر دو هستهای انتخاب کند. در ابتدا، یک تسک با اولویت بالا و دو تسک با اولویت متوسط، همه در حالت Ready هستند. زمانبند باید دو تسک را انتخاب کند، یکی برای هر هسته.
اول، تسک با اولویت بالا، بالاترین اولویت را دارد، بنابراین برای هسته اول انتخاب میشود.
حالا دو تسک با اولویت متوسط، بالاترین اولویت موجود هستند، پس یکی از آنها برای هسته دوم انتخاب میشود.
نتیجه این میشود که یک تسک با اولویت بالا و یک تسک با