اطلاعیه

Collapse
No announcement yet.

سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

Collapse
این موضوع برجسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #16
    پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

    سلام سلام سلام !!
    شرمنده خیلی دیر شد :mrgreen:

    این پست به تعیین رویدادها و اینکه چطوری تسک ها می تونن اجرای هم رو کنترل کنند، اختصاص داره. (preemptive)
    طبق معمول با مثال توضیح میدم. فرض کنید تسکی داریم که برای اجرا شدنش باید چندتا تسک دیگه کامل یا تا حدودی اجرا شده باشن. مثلا به داده های نیاز داره که توسط چندتا تسک دیگه تامین میشه. یا اینکه زمینه اجرای این تسک رو، چندتا تسک دیگه آماده کنن. به دلیل اینکه ممکنه شرایط مختلفی پیش بیاد ما نمی تونیم دقیق مشخص کنیم که اون تسک ها کی به مرحله ای میرسن که زمینه برای اجرای تسک مورد نظر آماده بشه.
    هر تسک یک پرچم (flag) 16 بیتی برای تعیین رویدادها داره. هر بیت یک رویداد. فرض کنید task3 به مرحله ای از اجرا که رسید که باید منتظر 2 تا رویداد بمونه بعد ادامه بده. این تسک با اشاره به 2 تا از بیت های پرچمش به سیستم عامل اعلام میکنه که منتظره این دو پرچم فعال بشن و بعد ادامه بده. این 2 تا رویداد توسط دو تسک دیگه به نام های task1 و task2 تامین میشن. پس تو هر کدوم از تسک های 1 و 2 باید در قسمت مورد نظر این دو پرچم فعال شده و رویداد خودشون رو اعلام کنن. به محض اینکه هر دو پرجم فعال شدن، task3 روند اجرای خودش رو ادامه میده.

    #include <AT91SAM7X256.h>
    #include <rtl.h>

    OS_TID tsk_ID1, tsk_ID2, tsk_ID3;
    __task void task_init(void);
    __task void task1(void);
    __task void task2(void);
    __task void task3(void);
    int main()
    {
    os_sys_init(task_init);

    while(1){}
    return 0;
    }

    __task void task_init(void)
    {
    //initialization ports for led
    *AT91C_PIOB_PER = (1 << 1);
    *AT91C_PIOB_OER = (1 << 1);
    *AT91C_PIOB_OWER = (1 << 1);

    tsk_ID1 = os_tsk_create(task1, 1); //priority:1
    tsk_ID2 = os_tsk_create(task2, 1); //priority:1
    tsk_ID3 = os_tsk_create(task3, 2); //priority:2

    os_tsk_delete_self(); //necessary
    }

    __task void task1(void)
    {
    int i = 0;
    while(1){
    for (i = 0; i < 0x5ffff; i++); //process
    os_evt_set(0x1, tsk_ID3);
    }
    }

    __task void task2(void)
    {
    int i = 0;
    while(1){
    for (i = 0; i < 0x6ffff; i++); //process
    os_evt_set(0x2, tsk_ID3);
    }
    }


    __task void task3(void)
    {
    while(1){
    os_evt_wait_and(0x3, 0xffff); //wait for bit 1 and 2 forever
    *AT91C_PIOB_ODSR ^= (1 << 1); //Blink
    }
    }

    task3 در ابتدای اجرای خودش توسط تابع os_evt_wait_and اعلام میکنه که منتظر بیت شماره 0 و 1 پرچم میمونه. پارامتر اول الگوی بیت های مورد نظر تابع رو مشخص میکنه (حداکثر 16 بیت). 0x3 یعنی دو بیت اول. پارامتر دوم timeout رو مشخص میکنه. یعنی اندازه زمانی که تسک منتظر اتفاق افتادن این رویدادها باشه. بعد از گذشت این زمان، بدون توجه به رویدادها تسک ادامه پیدا میکنه. این پارامتر هم 16 بیتی به غیر از 0xffff. مقدار 0xffff یعنی بی نهایت (تابع اونقدر منتظر میمونه تا رویدادها صورت بگیرن). خب بعد از اجرای این تابع، تسک به حالت معلق درمیاد. task1 و task2 ادامه داده میشن تا هر کدوم به دستور os_evt_set برسن. اینجا همونجایی که توسط این تسک ها اعلام رویداد میشه. پارامتر دوم این تابع شماره ID تسکی که می خوایم بیت های پرچمش رو یک کنیم. پارامتر اول بیت های مورد نظر برای فعال شدن رو مشخص میکنه. همونطور می بینید task1 بیت شماره 0 و task2 بیت شماره 1 از پرچم task3 رو فعال میکنه. بعد از فعال شدن هر دو بیت، task3 دوباره فعال میشه، تابع wait تسک3 همه بیت های پرچم رو صفر میکنه (برای دفعه بعد) و از تابع خارج میشه تا تسک ادامه پیدا کنه.
    تابع wait رویداد یک مقدار برگشتی هم داره (برای وقتی که timeout غیر از 0xffff باشه) اگه مقدار برگشتی OS_R_EVT باشه یعنی با فعال شدن پرچم ها (رویداد) از تابع گذشته شده و اگه OS_R_TMO باشه یعنی زمان timeout تموم و از تابع خارج شده. با توجه به این مقدار برگشتی میشه تصمیم گیری مناسب کرد.

    تابع مشابه دیگه ای به نام os_evt_wait_or وجود داره که فقط منتظر یکی از بیت های مشخص شده پرچم میمونه. یعنی لازم نیست همه بیت های مشخص شده برای پرچم یک بشن تا از تابع گذشته بشه. فقط یکی از بیت ها کافیه. برای اینکه بفهمیم کدوم یکی از بیت ها (کدوم رویداد) باعث فعال شدن تسک شده، از تابع os_evt_get استفاده میکنیم. خروجی این تابع مقدار 16 بیتی که بیت رویداد مورد نظر رو یک کرده.

    یه نکته مهم اینکه تو توابع وقفه irq (نه fiq) از تابع isr_evt_set برای فعال کردن پرچم ها استفاده میشه (نه تابع os_evt_set)

    می خوام نقش این توابع تعیین رویداد رو بیشتر درک کنید
    فکر کتید اگه این توابع نبودن باید چیکار میکردین؟؟
    ...
    ...
    میشه چندتا متغیر سراسری تعریف کرد. مقدارشون صفر بشه. تو تابعی که قراره wait بخوره، این متغیر ها رو تو حلقه چک میکنیم. تا موقعی که صفر هستن از حلقه گذشته نشه. مقدار این متغیرها هم تو تسک هایی که رویداد رو تولید میکنن یک میشه...
    خب بنظرتون اشکالش چیه؟
    اگه task3 که می خواد منتظر رویداد باشه، اولویتش از تسک های دیگه بیشتر باشه (مثل مثال بالا)، تا موقعی که داره دستوراتش (حلقه چک کردن متغیر) اجرا میشه، اصلا اجازه اجرا شدن تسک های دیگه رو نمیده!! (یعنی برنامه همین جا قفل میشه)
    اگه این تسک با تسک های دیگه هم اولویت باشه، اجازه اجرا به اونا هم داده میشه. اما خب زمان پردازش به task3 هم داده میشه. یعنی پردازش بیخود. تلف کردن وقت پردازنده. در حالی که اگه از تابع تعیین رویداد سیستم عامل استفاده کنیم، دیگه سراغ task3 نمیاد(تسک به حالت معلق درمیاد) تا وقتی که رویدادها صورت بگیرن.


    امیدوارم تونسته باشم مطلب رو برسونم. تاپیک مهمی بود. اهمیتش رو در عمل خواهید دید...
    https://www.linkedin.com/in/mohammadhosseini69

    http://zakhar.blog.ir

    دیدگاه


      #17
      پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

      آقای حسینی دمتون گرم
      حیف که Keil رو نصب ندارم و با IAR کار میکنم
      ولی موضوع خیلی مهمی رو روش کار کردید
      من نتوستم کل تاپیک رو بخونم ولی یه سوال دارم شما با FreeRTOS کار کردید؟
      نسبت به این چه جوریاست؟
      { خلاف قوانین - پاک شد }

      دیدگاه


        #18
        پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

        نوشته اصلی توسط Mohpooria
        آقای حسینی دمتون گرم
        حیف که Keil رو نصب ندارم و با IAR کار میکنم
        ولی موضوع خیلی مهمی رو روش کار کردید
        من نتوستم کل تاپیک رو بخونم ولی یه سوال دارم شما با FreeRTOS کار کردید؟
        نسبت به این چه جوریاست؟
        من FreeRTOS رو avr پیاده کردم. اما واسه keil پورت نشده بود. منم نتونستم رو keil پورتش کنم. تا ایتکه با RTX کیل آشنا شدم. باید بگم این خیلی بهتر از FreeRTOS. توابعش با وجود سادگی، کامل هستن و اکثرا timeout دارن... FreeRTOS بنظر باگ زیاد داشت. RTX خیلی روونه. ضمنا RTX افزونه هایی مثل Can, ethernet, flash file system داره و احتمالا در نسخه های بعدی بیشتر هم میشه.
        FreeRTOS واسه IAR رو میکرو های زیادی پورت شده. شاید بتونی راهش بندازی. اما درکل RTX واسه ARM رو میکروهای خیلی بیشتری پورت شده.
        ضمنا من keil رو خیلی بیشتر از IAR ترجیح میدم (در این مورد بحث نکنیم تاپبک منحرف میشه :mrgreen
        تاپیک رو بخون بفهمی نحوه کار کردن با سیستم عامل چطوریه... بعدش با هر سیستم عاملی راحت می تونی کار کنی. حیف نیست این همه وقت گذاشتم نوشتم :mrgreen:
        https://www.linkedin.com/in/mohammadhosseini69

        http://zakhar.blog.ir

        دیدگاه


          #19
          پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

          سلام.
          من امروز داشتم یکی از مجلات PMM رو می‎خوندم. اونجا نوشته بود این سیستم عامل‎ها باید روی
          حافظه‎های جانبی که به میکروهای ARM وصل میشن اجرا بشن.
          الان این سیستم عاملی که داری توضیحش میدی رو باید روی یک حافظه جانبی مثلا MMC بریزیم
          و اجراش کنیم؟
          اگه وقت کردین جواب بدین ممنونتون میشم
          :bye

          دیدگاه


            #20
            پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

            نوشته اصلی توسط sina_80
            سلام.
            من امروز داشتم یکی از مجلات PMM رو می‎خوندم. اونجا نوشته بود این سیستم عامل‎ها باید روی
            حافظه‎های جانبی که به میکروهای ARM وصل میشن اجرا بشن.
            الان این سیستم عاملی که داری توضیحش میدی رو باید روی یک حافظه جانبی مثلا MMC بریزیم
            و اجراش کنیم؟
            اگه وقت کردین جواب بدین ممنونتون میشم
            :bye
            اینو که من رو حافظه فلش میکرو پروگرم کردم. احتیاجی به حافظه خارجی نیست.
            احتمالا منظورش میکروهای مبتنی بر ورژن های بالاتر آرم مثل ARM9 که خودشون حافظه ندارن و باید حافظه واسه شون گذاشت

            من یه مدتی فرصت نمی کنم تاپیک رو ادامه بدم. مباحث اصلی و پایه ای رو گفتم. هرکی تا اینجا خونده و فهمیده می تونه ادامه بده.
            "مدیریت منابع" و "ارتباط بین پروسه ها" مونده. از رو هلپ کیل بخونید و یکمی هم سرچ کنید
            خدا بخواد خودم بعد امتحانات ادامه میدم...

            ---------------------------------------
            بحث مدیریت منابع و سمافور رو اینجا ببینین
            http://www.eca.ir/forum2/index.php?topic=49501.msg283385#msg283385

            https://www.linkedin.com/in/mohammadhosseini69

            http://zakhar.blog.ir

            دیدگاه


              #21
              پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

              سلام دوستان .... من روی میکروی فیلیپس LPC2378 کویر FREE RTOS رو تست کردم ... واسه کیل هم بود... جواب داد ..... اکه می خواین بزارمش تو همین سایت .... ببخشید موضوع تاپیک رو عوض کردم ......

              دیدگاه


                #22
                پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

                نوشته اصلی توسط محمد حسینی
                RTOS : Real Time Operating System
                سیستم های realtime برای پاسخ به رویدادهایی طراحی میشن که این رویدادها برای دریافت پاسخ، اصطلاحا یک ضرب العجل (deadline) دارن. یعنی تو زمان مشخصی حتما باید بهشون پاسخ داده بشه. برای این سیستم ها زمان انجام عمل مورد نظر دقیقا قابل محاسبه هست و نباید از بازه ای که محاسبه میشه تجاوز کنه.
                بعد از multitasking خصوصیت بعدی یک سیستم عامل، realtime بودن. اساس کار scheduler سیستم عامل realtime مشابه multitasking اما با هدف متفاوت. هدف scheduler بلادرنگ اینه که deadline رو درنظر بگیره و تا قبل از اتمام فرصت مورد نظر برای یک تسک، عملیات تسک رو کامل کنه.
                اینکار چطور ممکن میشه؟
                خیلی ساده! برنامه نویس باید برای هر تسک یک اولویت (Priority) تعیین کنه. scheduler همیشه زمان پردازش رو به تسک با اولویت بالاتر میده و تا وقتی تسک با اولویت بالاتر آماده برای اجرا باشه، تسک اولویت پایین تر هیچ زمان پردازشی نمیگیره. در صورتی هم که چند تسک با اولویت برابر آماده اجرا باشن، زمان پردازش بینشون تقسیم میشه.
                وقتی چندتا تسک با اولویت برابر تعریف میکنیم. زمان پردازش بینشون تقسیم میشه و سرعت اجرای هر کدوم نسبت به زمانی که به تنهایی اجرا بشن کم میشه. فرض کنید تسکی داریم که 500 میلی ثانیه طول میکشه اجرا بشه (به تنهایی) و تو پروژه ای که داریم هم حتما باید 500 میلی ثانیه باشه نه بیشتر. بنابراین به این تسک نسبت به بقیه تسک ها یک اولویت بالاتر میدیم و اینطوری مطمئنیم که در زمان اجرای این تسک، هیچ پردازش دیگه ای نداریم و تو همون 500 میلی ثانیه انجام میشه.

                از پست بعد میریم سر اصل مطلب
                سلام محمد جان در این قسمت اول فکر میکنم یادت رفت که بگی فایل retarget.c رو هم بچه ها به پوشه پروژه خودشون کپی کنند.

                دیدگاه


                  #23
                  پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

                  نوشته اصلی توسط Mohpooria
                  این جور که معلومه RTX فقط برای Keil است، یا میشه در IAR هم ازش استفاده کرد؟
                  دوست عزیز تا جایی که میآ‌دونم RTX برای Keil هستش و IAR سیستم عامل خودش با نام POWERPAC رو داره.

                  دیدگاه


                    #24
                    پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

                    کسی دیگه ای هم مشکل هنگ کردن سیستم عامل RTX رو داره ؟ :sad:
                    برنامه مثلا موقعی که داره TFTLCD رو مینویسه متوقف میشه.
                    چه عواملی میتونن باعث هنگ کردن RTOS بشن ؟

                    یه سوال دیگه :

                    تو برنامه نویسی معمولی به زبان C متغیرهایی به صورت عمومی و محلی و استاتیک وجود دارن.متغیرهایی محلی هر تابع با اجرای اون تابع به وجود میان و با تمام شدن تابع از بین میرن(مگه اینکه استاتیک باشن).حالا تو برنامه نویسی با RTX متغیرهای تسک ها در چه حالتی هستن ؟در این حالت که تسک ها قبل تموم شدن هی سوئیچ میشن مشکلی پیش نمیاد ؟نباید متغیر هارو استاتیک تعریف کنیم؟

                    آقای حسینی شما که بیشتر راه رو رفتین بیاین بحث های باقیمونده رو هم مختصر توضیح بدین.

                    دیدگاه


                      #25
                      پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

                      سلام
                      با اجازه آقای حسینی
                      در مورد هنگ کردن RTOS باید بگم من هم همین مشکل را با آن داشتم البته من با یک RTOS دیگر کار می کردم و نه با RTX. با کلی درگیرشدن باهاش مشکل را متوجه شدم :biggrin: مشکلش این بود که من از نسخه رایگان آن داشتم استفاده می کردم و شرکت سازنده در نسخه رایگان یک سری تغییراتی داده بود که کاربر بتواند از کلیه امکانات RTOS استفاده کند اما بعد از فکر کنم حدود 15 دقیقه کار کردن سیستم ، RTOS هنگ می کرد. :sad: اما وقتی توانستم نسخه اصلی را گیربیارم این مشکل حل شد. :biggrin:
                      در مورد متغییر ها هم در آن RTOS که من استفاده می کردم مشکلی نداشت و به همان صورت معمولی استفاده کردم دلیل آن هم این می باشد که هر وظیفه دارای یک پشته برای خودش هست. و مشکلی برای متغییرها پیش نمی آید.

                      دیدگاه


                        #26
                        پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

                        سلام
                        هنگ کردن ممکنه بخاطر پر شدن استک یه تسک باشه (برای تسک های بزرگ اتفاق می افته). در مورد استک ها توضیح ندادم؟ اینکه موقغ تعویض تسک، اطلاعات کجا ذخیره میشه...
                        فضای استک رو بیشتر کن ببین درست میشه.
                        در مورد متغیر ها
                        اطلاعات context هر تسک موقع تعویض ذخیره میشن (تو استک). مشکلی واسه متغیر ها پیش نمیاد.. کدهایی که گذاشتم رو ببین...

                        بعد امتخانات (تابستون) میام مباحث رو ادامه میدم...
                        https://www.linkedin.com/in/mohammadhosseini69

                        http://zakhar.blog.ir

                        دیدگاه


                          #27
                          پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

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

                          دیدگاه


                            #28
                            پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

                            طبق معمول من بازم دیر رسیدم.

                            یک نکته راجع به کار با RTX روی ARM بنظرم اومد ممکنه بدرد بخور باشه. از اونجایی که بر خلاف AVR نوشتن برنامه به اسمبلی کمتر مورد نظر برنامه نویسان روی ARM هست میشه با کمی جرح و تعدیل یک لایبرری برای کار با RTX تحت windows آماده کرد که شما بتونین دقیقا برنامه تون رو (با در نظر گرفتن امکانات سخت افزاری) تحت ویندوز اجرا کنین. من این کارو برای یک پروژه مبتنی بر LPC2378 و اترنت براحتی روی Visual Studio 2008 انجام دادم. مسلما سورسها و توابع ارتباط با سخت افزار باید دو نسخه ای باشند؛ یک نسخه برای ویندوز و یک نسخه برای روی ARM. اما قسمت های منطقی برنامه براحتی روی ویندوز قابل پیاده سازی هست. از طرف دیگه شما براحتی از توابع و ساختارهای RTX استفاده میکنین. در مواردی این عمل یک وسیله نجات بخش هست. مثلا وقتی دارین از یک منطق پیچیده استفاده میکنین استفاده از چیزایی مثل سیمولاتور یا اجرا روی سخت افزار اصلی در مراحل اولیه مطلقا کمکی که نمیکنه هیچ؛ بیشتر ممکنه باعث سر درگمی هم بشه.

                            من اینجور مواقع کد اصلی رو به C مینویسم که بشه براحتی روی ARM برش گردوند. از طرف دیگه با یک برنامه #C میام یک سری سخت افزار ها رو شبیه سازی میکنم و توسط روال های تطبیقی برای برقراری ارتباط بین این دو تا برنامه استفاده میکنم. اینجوری میشه ورودی خروجی های دیجیتال و یا آنالوگ رو براحتی پیاده سازی کرد. از طرف دیگه سخت افزار های پیچیده رو هم با این روش شبیه سازی میکنم.

                            برای راهنمایی میتونین برای استفاده از اترنت از WinPCap استفاده کنین. تا بتونین حتی protocol stack خودتون رو تحت ویندوز که این توابع رو بطور داخلی داره تست کنین.

                            برای اینکه دقیقا زمان بندی رو ببینین باید برنامه رو پروگرم کنین و در عمل ببینین. در این مورد شبیه ساز اصلا دقیق عمل نمیکنه...
                            این یکی از مواردیه که من از این روشی که ذکر کردم بیشتر استفاده میکنم. دقتش خیلی بیشتره اما مسلما اگه پای تاخیراتی با دقت 1 میلی ثانیه پیش بیاد بیشتر به سرعت سیستمتون بستگی پیدا میکنه. مسلما استفاده از یک سیستم چند هسته ای ممکنه بدرد بخور باشه اما برای اجرای بهتر و مشابه تر با اجرا روی ARM بهتر برنامه شبیه ساز فقط از یک هسته استفاده کنه.

                            دیدگاه


                              #29
                              پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

                              نوشته اصلی توسط reza_agha
                              طبق معمول من بازم دیر رسیدم.

                              یک نکته راجع به کار با RTX روی ARM بنظرم اومد ممکنه بدرد بخور باشه. از اونجایی که بر خلاف AVR نوشتن برنامه به اسمبلی کمتر مورد نظر برنامه نویسان روی ARM هست میشه با کمی جرح و تعدیل یک لایبرری برای کار با RTX تحت windows آماده کرد که شما بتونین دقیقا برنامه تون رو (با در نظر گرفتن امکانات سخت افزاری) تحت ویندوز اجرا کنین. من این کارو برای یک پروژه مبتنی بر LPC2378 و اترنت براحتی روی Visual Studio 2008 انجام دادم. مسلما سورسها و توابع ارتباط با سخت افزار باید دو نسخه ای باشند؛ یک نسخه برای ویندوز و یک نسخه برای روی ARM. اما قسمت های منطقی برنامه براحتی روی ویندوز قابل پیاده سازی هست. از طرف دیگه شما براحتی از توابع و ساختارهای RTX استفاده میکنین. در مواردی این عمل یک وسیله نجات بخش هست. مثلا وقتی دارین از یک منطق پیچیده استفاده میکنین استفاده از چیزایی مثل سیمولاتور یا اجرا روی سخت افزار اصلی در مراحل اولیه مطلقا کمکی که نمیکنه هیچ؛ بیشتر ممکنه باعث سر درگمی هم بشه.

                              من اینجور مواقع کد اصلی رو به C مینویسم که بشه براحتی روی ARM برش گردوند. از طرف دیگه با یک برنامه #C میام یک سری سخت افزار ها رو شبیه سازی میکنم و توسط روال های تطبیقی برای برقراری ارتباط بین این دو تا برنامه استفاده میکنم. اینجوری میشه ورودی خروجی های دیجیتال و یا آنالوگ رو براحتی پیاده سازی کرد. از طرف دیگه سخت افزار های پیچیده رو هم با این روش شبیه سازی میکنم.

                              برای راهنمایی میتونین برای استفاده از اترنت از WinPCap استفاده کنین. تا بتونین حتی protocol stack خودتون رو تحت ویندوز که این توابع رو بطور داخلی داره تست کنین.
                              این یکی از مواردیه که من از این روشی که ذکر کردم بیشتر استفاده میکنم. دقتش خیلی بیشتره اما مسلما اگه پای تاخیراتی با دقت 1 میلی ثانیه پیش بیاد بیشتر به سرعت سیستمتون بستگی پیدا میکنه. مسلما استفاده از یک سیستم چند هسته ای ممکنه بدرد بخور باشه اما برای اجرای بهتر و مشابه تر با اجرا روی ARM بهتر برنامه شبیه ساز فقط از یک هسته استفاده کنه.
                              آقا رضا شما دیر میای ولی وقتی میای غوغا میکنی. :agree:
                              نوشتتونو 3 4 بار خودنم ولی بعضی چیزها رو هنوز نفهمیدم. :redface:
                              منظورتون اینه که برنامه ای برای ویندوز بنویسیم که بتونه برنامه های نوشته شده برای RTX رو تحت ویندوز اجرا کنه؟اینطوری اول باید خود RTX رو تو ویژوال استادیو شبیه سازی کنیم ؟
                              با یه مثال ساده تر توضیح بدین مننون میشم.یا اصلا پروژه خودتون رو بیشتر توضیح بدین. :nerd:

                              قبلا من یه برنامه با زبان جاوا برای موبایل نوشته بودم که میکروکنترلر 8051 رو با اجرای بایت به بایت کد هگز شبیه سازی میکرد و مثل یه سیمولاتور رجیسترهاش رو نشون میداد.میشه کاری که گفتین رو برای موبایل هم انجام داد .تو موبایل تقریبا تمام سخت افزارهای مورد نیاز در دسترس هستن.

                              دیدگاه


                                #30
                                پاسخ : سیستم عامل بی درنگ RTX برای ARM7/9 و Cortex-M

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

                                بذارین اینطوری بگم.
                                فرض کنیم میخواییم یک تابلو روان 8 در 8 ساده بسازیم. 16 تا IO میخواییم. و یک حلقه کوچیک برای ایجاد اطلاعات این پانل و یک روال برای ارسال به سخت افزار.
                                کد حدودی زیر رو در نظر بگیرین:


                                void SendDataToPanel(unsigned char *buf)
                                {
                                }

                                void DrawCharacter(unsigned char *buf, unsigned char c)
                                {
                                }

                                void main(void)
                                {
                                unsigned char buf[8];
                                static unsigned char text[] PROGMEM =
                                "Sample text to show";
                                unsigned char c;
                                int read_loc = 0;

                                for( ; ; )
                                {
                                c = pgm_read_byte(&text[read_loc]);
                                if( c == '\0' )
                                {
                                read_loc = 0;
                                continue;
                                }
                                read_loc++;
                                DrawCharacter(buf, c);
                                SendDataToPanel(buf);
                                }
                                }


                                این کد میتونه اصل یک کد تابلو روان باشه. روال main چیزی که مختص پلاتفرم باشه نداره. غیر از اون رشته ثابت که من میتونم اینطوری تعریفش کنم:


                                #ifdef _WIN32
                                #undef PROGMEM
                                #define PROGMEM
                                #endif

                                static const unsigned char text[] PROGMEM =
                                "Sample text to show";


                                که البته اون تیکه پیش پردازشی رو در یک هدر ثابت میذارم. مسلما روال SendData چون با سخت افزار سیستم نهایی درگیره باید بطور متفاوتی پیاده سازی بشه:

                                void SendDataToPanel(unsigned char *buf)
                                {
                                #ifdef _WIN32
                                place your Win32 based code here for simulation
                                #else
                                place your AVR/ARM based code here for real execution
                                #endif
                                }


                                با این روش میشه با استفاده از امکانات پیش پردازش C سورس برنامه رو جوری نوشت که برای هر پلاتفرم قابل قبولی احتیاج آنچنانی به نوشتن مجدد کد های برنامه نداشته باشه.

                                این برای کد هایی که خودمون مینویسیم. اما برای موردی مثل RTX شانسی که داریم اینه که سورس RTX موجود هست. یا حداقل اطلاعات اولیه راجع به توابع RTX در دسترس هست.
                                .....

                                دیدگاه

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