اطلاعیه

Collapse
No announcement yet.

آشنایی با سیستم عامل های بلادرنگ – بررسی نحوه عملکرد و پورت کردن FreeRTOS

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    آشنایی با سیستم عامل های بلادرنگ – بررسی نحوه عملکرد و پورت کردن FreeRTOS

    به نقل از خودم توی اینجا: http://www.iranled.com/forum/showthread.php?tid=17975

    سیستم عامل برای میکروکنترلر
    این چند وقت فکرم مشغول سیستم عاملهای بلادرنگ برای میکروکنترلرها بوده
    کلا مبحثهای RTOS و پورت کردن و این دری وریا...
    امروز هم مطالبق معمول دنبال این بحث میسرچیدم ، قاطی نمونه های مختلفی که این چند وقت دیدم مثل :
    http://www.barello.net/avrx/avrx.htm
    http://picoos.sourceforge.net
    http://www.freertos.org
    http://www.lancos.com
    http://www.tinyos.net


    ظاهرا یک os درست کردن به قول خودشون سبکترین os موجود دنیا هست گفتم شروع کنیم به آنالیز سورس هاش و تکمیل شکل ظاهری اون به عنوان یک پروژه قابل فهم به زبان ساده برای خودمون و نسل آیندهWink
    این پروژه به اسم فمتو هست روی سایت http://www.femtoos.org

    یکی دیگه از دلایلی که اینو انتخاب کردم که با هم شروع کنیم کار گروهی برای فهم کارکردش اینه که برای خانواده Atmega طراحی شده ( غیر از سبک بودن )
    مثال های ساده داشت ( روشن کردن LED )
    مدار جانبی خاصی نیاز نداره ( مثل این os هایی که برای Arm زدن و نیاز داره حتما EVal board هاشون به نا به تعریف استاندارد کشیده بدن و قطعات حتما باشن و الا سیستم عامل کرش میکنه و سورس کدهای حجیمو .. .... )

    (اینقدر هیچی نیاز نداره که نمونه اولیه اش برای خالی نبودن عریضه به همراه پروگرامر usbasp ساختن :mrgreen: )
    فایلهاش روی سورس فورج بود که به علت بسته بودن ip های ایران همینجا آخرین نسخه اش را ضمیمه میکنم.

    خلاصه فعلا یه نگاه کلی به سایتش بندازین ، تا بعد شروع کنیم از یه جائیش بریم جلو...
    پیوست : شروع به قول خودش هم اینطوریه :
    http://www.femtoos.org/code_start.html

    ادامه .........

    خب بلاخره امشب تونستم helloword مثال خودش را روی یک فروند atmega16 پورت کنم
    خاک تو اون سر نویسندش ، حداقل مثال میزاره درست بزاره
    مواد لازم :
    http://www.atmel.com/dyn/resources/prod_documents/AvrStudio4Setup.exe
    به حجم 116 مگ

    WinAvr آخرین نسخه
    به علت محدودیت ip روی SF از لینک زیر آخرین نسخه اش را دانلود کنید:
    http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/w/project/wi/winavr/WinAVR/20100110/WinAVR-20100110-install.exe
    به حجم 27 مگا بایت

    خب اصل فمتو هم به علت محدودیتهای sf برای دانلود گذاشته روی هاست خودم پلود کردم از اینجا مستقیم دانلود کنید :
    http://www.ALT.ir/elc/FemtoOS_0.92.zip
    حجم حدود 1.5 مگ

    ،. بعد آنزیپ میکنید( قسمت سختی بود :nerd: )

    بریم سر اصل مطلب یعنی ساخت اولین مثال
    توی شاخه Install_Scripts\avrstudio یک فایل تمپلیت هست مخصوص avrStudio که نویسنده پروفسور این فمتو درست آدرس دهی نکرده دیگه ، ...
    همینجا میتونید فایل تمپلیت را با یک تکست ادیتور معمولی باز کنید و آدرس دهی کنید
    کد:
    <SOURCEFILE>..\..\MainCode\demos_source\code_TestHelloWorld.c</SOURCEFILE>
    <HEADERFILE>..\..\MainCode\demos_headers\config_TestHelloWorld.h</HEADERFILE>
    این ..\..\MainCode\ را بعضی جاهاش نزاشته که باید بزارید یا مستقیم روی فایلها کلیک کنید تا آدرس روی هارد شما به اون اسم فایلها اختصاص پیدا کنه.

    البته پیشنهاد میکنم این تمپلیت
    project_template
    ترجیحا پسوندش را هم بزارید .aps که دیگه با یک کلیک روش خود avrstudio بازش کنه
    نکته : این تمپلیت مال mega8 هست ، میتونید روی اسم پروجکت توی avrstudio رایت کلیک کنید و مدل میکرو و فرکانس و و.... عوض کنید
    عکس ضمیمه

    بعد هم منو Build و فایل hex را توی شاخه ای به اسم standard میتونید داشته باشید که وقتی بریزید روی میکروکنترلر میشه یک سیستم عامل روی میکروکنترل 8بیتی avr

    خب تبریک میگم اولین سیستم عاملتون را روی یک میکرو راه اندازی کردید. :agree:

    قوانین انجمن :
    3.عدم استفاده از عبارات یا تصاویر رکیک و نامناسب در پروفایل کاربر (شامل نام کاربری ، آواتار، امضا و ...) ، همچنین در نوشته ها و تاپیکها.
    آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
    تا در سفر دوزخ از اين باده بنوشم
    آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
    هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

    #2
    پاسخ : سیستم عامل برای میکروکنترلر AVR

    خب از سیستم فمتو اومدم بیرون رفتم سراغ پورت کردن سیستم عامل FreeRTOS
    نحوه کار را به صورت ابتدائی ( در حد استارت کار و تحویل گرفتن یک چشمک زن از یک راس اتمگا مینویسم )تا ببینیم بعدش چی میشه بلاخره...


    خب مراحل استفاده از AVR STudio برای کامپایل و گرفتن خروجی یک فایل hex به عنوان یک سیستم عامل چند وظیفه ای بر روی یک میکروکنترلر ATMEGA بدون نیاز به وسایل جانبی خاص
    فایل FreeRTOS الان آخرین نسخه اش 6.0.5 هست بعد از دانلود و اکستراکت یک شاخه demo داره که میتونید واردش بشید و بگردید دنبال فولدری که لازم دارید
    ما اینجا برای شروع کار با اتمگا دنبال فولدری به اسم : AVR_ATMega323_WinAVR
    توجه کنید که برای کامپایلر IAR هم فولدی جدا هست...

    پس مراحل کار به صورت کلی :
    1- دانلود FreeRTOS
    2- دانلود کامپایلر WinAVR
    3- دانلود نرم افزار AVRSTUDIO
    4- اکستراکت فایل FreeRTOS ( ترجیحا در یک فولدی که توی اسمش فاصله به کار نرفته باشد مثلا اینطوری C:\program--Files\ xyz نباشد

    5- ساخت یک پروجکت جدید در avrstudio
    6- اضافه کردن فایلهای زیر به کنار فایل اصلیتون
    با کلیک رایت و استفاده از گزینه
    کد:
    کد:
    c:\FreeRTOS\Source\croutine.c
    c:\FreeRTOS\Source\list.c
    c:\FreeRTOS\Source\queue.c
    c:\FreeRTOS\Source\tasks.c
    
    c:\FreeRTOS\Source\portable\MemMang\heap_1.c
    توجه کنید که این دوتافایل توی فولدر پرتابل هستند و آدرس دهی مستقیم رجیسترها در فایل دوم انجام میشوند( البته کاری به کارش نداشته باشید)
    c:\FreeRTOS\Source\portable\GCC\ATMega323\port.c
    7- اضافه کردن آدرس path فایلهای هدر اصلی
    کد:
    c:\Embedded\FreeRTOS\Source\include\
    c:\Embedded\FreeRTOS\Source\
    c:\Embedded\FreeRTOS\Source\portable\GCC\ATMega323\
    8- و نوشتن برنامه
    9- حسش بود لیست توابع و کارکردهاشون و نحوه نوشتن یک برنامه مولتی تسک به واسطه این سیستم عامل را براتون میزارم... حسش هم نبود حقتونه که نمیاین کمک ...
    10 - برای تست برنامه Demo همراه فایلهای اصلی کافیه روی پایه های PortB میکروکنترلر LED وصل کنید تا نمونه چشمک زن اون را ببینید
    آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
    تا در سفر دوزخ از اين باده بنوشم
    آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
    هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

    دیدگاه


      #3
      پاسخ : سیستم عامل برای میکروکنترلر AVR

      خوب چجوری کمک کنم من میخواستم از این کار ها بکنم ولی از سورس اصلی چیزی سر در نیاوردم FreeRTOS رو از کجا بگیرم؟
      AVRStudio رو دارم WinAVR از کجا بیارم ورژن های قدیمیش رو کامپیوترم نصب نمیشه مشکل داره :cry2:

      دیدگاه


        #4
        پاسخ : سیستم عامل برای میکروکنترلر AVR

        اسامی هرکدوم را توی گوگل بنویسید اینقدر معروف هستند که اولین گزینه ، جواب مورد نظر شما باشه
        پیوست :
        فقط یک نکته ای : بعضیا که اپن سورس هستند و روی سایت SourceForge تشریف دارند ، به علت بسته شدن آی پی های ایران برای دانلود از لینک زیر میتونید استفاده کنید
        http://www.iranrobocup.com/sourceforge

        پیوست 2:
        سورسها اغلب خیلی سنگین هستند... پیشنهاد نمیکنم از اول بخونیمش ببینیم چیکار کردند ، ولی میتونیم با هم راهنمای اونو به زبان فارسی ترجمه کنیم برای استفاده همه و یا ماژول وار هسته این سیستم عاملها را توسعه بدیم برای استفاده.

        آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
        تا در سفر دوزخ از اين باده بنوشم
        آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
        هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

        دیدگاه


          #5
          پاسخ : سیستم عامل برای میکروکنترلر AVR

          میگم چرا نشینیم یه سیستم عامل اپن سورس برای یه سخت افزار اپن سورس بنویسیم؟اینطوری هر کسی میتونه از این برای پروژه ای که داره استفاده کنه و اینکه سخت افزار و یا نرم افزار جدیدی رو بهش اضافه کنه اگر اینجوری بشه خیلی ها ازش استقبال میکنند و سریع توسعه پیدا میکنه چون این طرح برای یک CPU خاص نیست برای تمام CPU ها و میکروکنترلر ها قابل اجراست :agree: :nerd: :wow:
          نظزتون دربارش چیه؟

          دیدگاه


            #6
            پاسخ : سیستم عامل برای میکروکنترلر AVR

            به این نظریه میگن : اختراع دوباره چرخ .
            ما همین آماده را هم زیاد وقت نداریم روش بزاریم ، چه برسه به نوشتن یکی که در بهترین حالت به سرنوشت همین آ دچار میشه
            آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
            تا در سفر دوزخ از اين باده بنوشم
            آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
            هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

            دیدگاه


              #7
              پاسخ : سیستم عامل برای میکروکنترلر AVR

              وقت؟؟؟شما ندارید من فعلا زیاد دارم نمیدونم چی کار کنم :rolleyes:
              فقط نمیدونم برای نوشتن سیستم عامل از کجا شروع کنم

              دیدگاه


                #8
                پاسخ : سیستم عامل برای میکروکنترلر AVR

                نوشته اصلی توسط شهریار رجب زاده
                وقت؟؟؟شما ندارید من فعلا زیاد دارم نمیدونم چی کار کنم :rolleyes:
                فقط نمیدونم برای نوشتن سیستم عامل از کجا شروع کنم
                خوبه اگه وقت زیاد داری ، بشین همینو ترجمه کن.
                حین این کار اصول طراحی یک سیستم عامل هم میاد دستت ، بعد یکی بنویس
                درضمن برای نوشتن یک سیستم عامل شما باید زبان اسمبلی خیلی خوبی داشته باشید چون خیلی جاها با کمبود حافظه و نیاز به نهایت سرعت مواجه هستی.

                البته به نظر من اون قبلیه فمتو خیلی سبک تر از freeRTOS هست برای شروع .
                ولی این یکی خیلی کاملتر هست و رنج زیادی از میکروکنترلرها را ساپورت میکنه .
                آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
                تا در سفر دوزخ از اين باده بنوشم
                آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
                هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

                دیدگاه


                  #9
                  پاسخ : سیستم عامل برای میکروکنترلر AVR

                  راستش من یه کتاب uC/OS گرفتم خوندم بعضی از کدهاش رو نفهمیدم هنگ کردم گذاشتم کنار گفتم یه سیستم عامل بنویسم ولی بعد گفتم سیستم عامل همینجوری که چیزی نداره تا حالا من همینجا گیر کردم :cry2:
                  یعنی نمیفهمم سیستم عامل به این سادگی به چه درد میخوره؟

                  دیدگاه


                    #10
                    پاسخ : سیستم عامل برای میکروکنترلر AVR

                    مزایای کلی این سیستم عامل چی است ؟
                    استفاده از این سیستم عامل به چه صورت است و چه امکاناتی به ما خواهد داد ؟

                    دیدگاه


                      #11
                      پاسخ : سیستم عامل برای میکروکنترلر AVR

                      شما توی برنامه های سنگین تر ( نه برنامه های معمولی ) نیاز دارید که همزمان چند عملیات مختلف انجام بشه ( MultiTask ) و در عین حال این همزمانی تسکها روی هم اثر نامطلوب نزاره ( پر شدن حافظه و overWrite شدن دیتا ها و .... )و برنامه نوییس سیستم فکرش درگیر استفاده همزمان از منابع مشترک ( با استفاده از سمافورها ) نباشه و یا دیگه نگران از دست دادن اطلاعات هنگام وقوع وقفه ها و Delay های استفاده شده نباشه
                      و توابع کار با هسته هم به صورت توابع آماده API برای در اختیار قرار گرفتن برنامه نویس قرار میگیره
                      و و و ....

                      اینجاست که میان از سیستم عامل استفاده میکنند. و تقسیم وظایف را سیستم عامل میاد با استفاده از حداکثر کلاک سیستم به عهده میگیره و در واقع مدیریت
                      انجام وظایف بالا را میزارن به عهده هسته ای به نام سسیتم عامل.
                      آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
                      تا در سفر دوزخ از اين باده بنوشم
                      آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
                      هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

                      دیدگاه


                        #12
                        پاسخ : سیستم عامل برای میکروکنترلر AVR

                        من مولتی تسکینگ رو نفهمیدم چجوری انجام میشه مگه AVR پردازش موازی میکنه؟؟؟

                        دیدگاه


                          #13
                          پاسخ : سیستم عامل برای میکروکنترلر AVR

                          نوشته اصلی توسط شهریار رجب زاده
                          من مولتی تسکینگ رو نفهمیدم چجوری انجام میشه مگه AVR پردازش موازی میکنه؟؟؟
                          نه AVR مثلا در هر لحظه فقط یک کار انجام میده ، اما مثلا 2 تا وظیفه داری ، سیستم عامل نمیاد منتظر خاتمه اولی بشه به اندازه یک کلاک سیستم اجراش میکنه ، تغییراتی که توی رجیسترها می افته را نگه میداره ، تو کلاک بعدی میره سراغ تسک بعدی ، تغییرات را نگه میداره ، میاد سراغ تسک اولی و تغییرات قبلی را بازیابی میکنه و دوباره تسک را ادامه میده ، و ادامه میده تا بینهایت....
                          این روش کلی کار بود.

                          فکر کنم عکسهای زیر به صورت اولیه ، گویای همه چیز باشند




                          آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
                          تا در سفر دوزخ از اين باده بنوشم
                          آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
                          هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

                          دیدگاه


                            #14
                            پاسخ : سیستم عامل برای میکروکنترلر AVR

                            منم اول اینجوری فکر میکردم اما بعدش میگفتم تا بخواد از این سوییچ کنه روی اون سه چهار سیکل طول میکشه
                            چجوری میشه از این روش استفاده کرد؟

                            دیدگاه


                              #15
                              پاسخ : سیستم عامل برای میکروکنترلر AVR

                              نوشته اصلی توسط شهریار رجب زاده
                              منم اول اینجوری فکر میکردم اما بعدش میگفتم تا بخواد از این سوییچ کنه روی اون سه چهار سیکل طول میکشه
                              چجوری میشه از این روش استفاده کرد؟
                              مطمئن نیستم ، ولی مثلا موقع پورت کردن این سیستم عامل برای avr ها یک فایل دارند در آدرس :
                              FreeRTOS\Source\portable\GCC\ATMega323\port.c
                              توی این فایل میبینید که از r0 ( رجیستر صفر تا رجیستر 30 را با یک خط دستور اسمبلی POP - PUSH نگه داری میکنه و بعد توی سیکل بعدی استفاده میکنه ( احتمال اینکه هرکدوم از این POP یا PUSH ها به تنهائی یک کلاک مصرف کنند هست ولی 30 کلاک در مقابل 8میلیون هیچی نیست
                              کد:
                              #define portSAVE_CONTEXT()									\
                              	asm volatile (	"push	r0						\n\t"	\
                              					"in		r0, __SREG__			\n\t"	\
                              					"cli							\n\t"	\
                              					"push	r0						\n\t"	\
                              					"push	r1						\n\t"	\
                              					"clr	r1						\n\t"	\
                              					"push	r2						\n\t"	\
                              					"push	r3						\n\t"	\
                              					"push	r4						\n\t"	\
                              					"push	r5						\n\t"	\
                              					"push	r6						\n\t"	\
                              					"push	r7						\n\t"	\
                              					"push	r8						\n\t"	\
                              					"push	r9						\n\t"	\
                              					"push	r10						\n\t"	\
                              					"push	r11						\n\t"	\
                              					"push	r12						\n\t"	\
                              					"push	r13						\n\t"	\
                              					"push	r14						\n\t"	\
                              					"push	r15						\n\t"	\
                              					"push	r16						\n\t"	\
                              					"push	r17						\n\t"	\
                              					"push	r18						\n\t"	\
                              					"push	r19						\n\t"	\
                              					"push	r20						\n\t"	\
                              					"push	r21						\n\t"	\
                              					"push	r22						\n\t"	\
                              					"push	r23						\n\t"	\
                              					"push	r24						\n\t"	\
                              					"push	r25						\n\t"	\
                              					"push	r26						\n\t"	\
                              					"push	r27						\n\t"	\
                              					"push	r28						\n\t"	\
                              					"push	r29						\n\t"	\
                              					"push	r30						\n\t"	\
                              					"push	r31						\n\t"	\
                              					"lds	r26, pxCurrentTCB		\n\t"	\
                              					"lds	r27, pxCurrentTCB + 1	\n\t"	\
                              					"in		r0, 0x3d				\n\t"	\
                              					"st		x+, r0					\n\t"	\
                              					"in		r0, 0x3e				\n\t"	\
                              					"st		x+, r0					\n\t"	\
                              				);
                              
                              /* 
                               * Opposite to portSAVE_CONTEXT(). Interrupts will have been disabled during
                               * the context save so we can write to the stack pointer. 
                               */
                              
                              #define portRESTORE_CONTEXT()								\
                              	asm volatile (	"lds	r26, pxCurrentTCB		\n\t"	\
                              					"lds	r27, pxCurrentTCB + 1	\n\t"	\
                              					"ld		r28, x+					\n\t"	\
                              					"out	__SP_L__, r28			\n\t"	\
                              					"ld		r29, x+					\n\t"	\
                              					"out	__SP_H__, r29			\n\t"	\
                              					"pop	r31						\n\t"	\
                              					"pop	r30						\n\t"	\
                              					"pop	r29						\n\t"	\
                              					"pop	r28						\n\t"	\
                              					"pop	r27						\n\t"	\
                              					"pop	r26						\n\t"	\
                              					"pop	r25						\n\t"	\
                              					"pop	r24						\n\t"	\
                              					"pop	r23						\n\t"	\
                              					"pop	r22						\n\t"	\
                              					"pop	r21						\n\t"	\
                              					"pop	r20						\n\t"	\
                              					"pop	r19						\n\t"	\
                              					"pop	r18						\n\t"	\
                              					"pop	r17						\n\t"	\
                              					"pop	r16						\n\t"	\
                              					"pop	r15						\n\t"	\
                              					"pop	r14						\n\t"	\
                              					"pop	r13						\n\t"	\
                              					"pop	r12						\n\t"	\
                              					"pop	r11						\n\t"	\
                              					"pop	r10						\n\t"	\
                              					"pop	r9						\n\t"	\
                              					"pop	r8						\n\t"	\
                              					"pop	r7						\n\t"	\
                              					"pop	r6						\n\t"	\
                              					"pop	r5						\n\t"	\
                              					"pop	r4						\n\t"	\
                              					"pop	r3						\n\t"	\
                              					"pop	r2						\n\t"	\
                              					"pop	r1						\n\t"	\
                              					"pop	r0						\n\t"	\
                              					"out	__SREG__, r0			\n\t"	\
                              					"pop	r0						\n\t"	\
                              				);
                              آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
                              تا در سفر دوزخ از اين باده بنوشم
                              آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
                              هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

                              دیدگاه

                              لطفا صبر کنید...
                              X