اطلاعیه

Collapse
No announcement yet.

راه اندازی rtx kernel در کیل

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

    #16
    پاسخ : راه اندازی rtx kernel در کیل

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

    در منوی Options for Target سیستم عامل رو به RTX Kernel تغییر بده.
    در قسمت output حتما Browse information و Create hex file رو تیک بزن.

    یک سورسی مثل main.c برای خودت بساز.

    محتویات:

    هدر های مورد استفاده:

    کد:
    RTL.h
    و هر هدر دیگه ای مثل string و stdio و LPC23xx.h

    اگه قراره تسکی داشته باشی که یک stack با اندازه غیر پیش فرض مثلا 2 کیلو بایت استفاده کنه اینجوری تعریفش کن:


    unsigned long long my_stack_for_task_1[2000/8];


    این کار به ازای هر تسک از این نوع بایستی تکرار بشه.

    برای خواناتر بودن پیشتاز هر تابعی رو که قراره به عنوان یک تسک مستقل اجرا بشه اینجا قید کن. مثلا:

    کد:
    __task void LED1_task(void);
    __task void LED2_task(void);
    __task void LED3_task(void);
    __task void init_task(void);
    راستی یادم رفت. یک تسک میتونه حداکثر یک آرگومان داشته باشه. اگه قرار باشه آرگومانهای زیادی برای یک تسک ارسال بشه بایستی این اطلاعات در جایی ذخیره بشه و آدرس اون برای تسک ارسال بشه.

    این قضیه init_task اینجا چیه؟ همیشه یک تسک اولیه داریم که rtx از اونجا شروع به اجرا میکنه. این همون تسکه.

    حالا متن توابع:


    int main(void){ os_init_task(init_task); }


    از اینجا به بعد متن توابع تسک ها رو مینویسیم با این شرط که کلیه عملیات آماده سازی سخت افزار در init_task انجام میشه و تمامی task های دیگه هم ایجاد میشه و در انتها این task رو پاک میکنیم:



    __task void init_taskk(void)
    {
    ...
    os_tsk_create( LED1_task, 0);
    os_tsk_create( LED2_task, 0);
    os_tsk_create(LED3_task, 0);
    }


    .....

    دیدگاه


      #17
      پاسخ : راه اندازی rtx kernel در کیل

      اهه یادم رفت... خود تسک رو حذف نکردیم:


      os_tsk_delete_self();


      خوب ما سه تا تسک ساده داریم. که فرض میکنیم با فرکانسهای متفاوتی یک led رو روشن و خاموش میکنن. مثلا 10 و 5و 1 هرتز. این یعنی تغییر وضعیت led بایستی هر 50 , 100, 500 میلی ثانیه اتفاق بیفته. چند تا کار میشه کرد. راحتترینش اینه که به rtx اطلاع بدیم میخواییم این زمانبندی رو تو برامو انجام بدی. در ابتدای هر تسک مقدار زمانی مورد نیاز رو به rtx از طریق os_itv_set براساس واحد tick اطلاع میدیم. برای راحتی فکر میکنیم مقدار تیک برابر با 10 میلی ثانیه هستش.

      بنا بر این:

      کد:
      __task void LED1_task(void)
      {
       char on = 0;
       os_itv_set(50/10);
       while(1)
       {
        if( on )
        {
         FIO2CLR = 1;
         on = 0;
        }
        else
        {
         FIO2SET = 1;
         on = 1;
        }
        os_itv_wait();
       }
      }
      
      
      __task void LED2_task(void)
      {
       char on = 0;
       os_itv_set(100/10);
       while(1)
       {
        if( on )
        {
         FIO2CLR = 2;
         on = 0;
        }
        else
        {
         FIO2SET = 2;
         on = 1;
        }
        os_itv_wait();
       }
      }
      
      __task void LED3_task(void)
      {
       char on = 0;
       os_itv_set(500/10);
       while(1)
       {
        if( on )
        {
         FIO2CLR = 4;
         on = 0;
        }
        else
        {
         FIO2SET = 4;
         on = 1;
        }
        os_itv_wait();
       }
      }


      چرا while؟ چون یک تسک به محض رسیدن به انتهای تابع اصلی خودش تموم میشه. برای اینکه یک تسک رو در حال اجرا قرار بدیم بایستی ازwhile استفاده کنیم. ضمنا استفاده از os_itv_wait این امکان رو به تسک میده که تا ابتدای زمان بعدی که توسط os_itv_set برای تسک فعلی مشخص شده صبر کنه. یک مشکل!
      اگر اجرای اصل عمل بیش از مقدار زمانی مشخص شده در os_itv_set طول کشیده شده باشه برنامه بلافاصله به اجراش ادامه میده.

      اگر هر جا در طی اجرای برنامه خواستیم مقداری delay بدیم میتونیم از os_dly_wait استفاده کنیم. زمان بر اساس تعداد تیک هست و نه میلی ثانیه. ضمنا اگر از os_itv_set و os_itv_wait استفاده میکنین نبایستی از os_dly_wait در اون تسک استفاده کنین. (محدودیت rtx)

      برنامه رو کامپایل کنین و حالشو ببرین.

      بعدا اگه حالش بود راجع به هماهنگی بین تسک ها هم توضیح میدم.

      دیدگاه


        #18
        پاسخ : راه اندازی rtx kernel در کیل

        یه سوال پایه ای !!!
        اصلا هدف ما از استفاده از سیستم عامل RTX یا ... چیه ؟
        جوابی که من فهمیدم (True/False ?) : تقسیم کلاک سیستم بین چند زیر برنامه (Task) که میخوایم با هم انجام بشن .

        1. اگه وقت کردین درمورد اتصال شبکه و LCD هم یه بحثی بکنید .

        2.حالا یه سوال گوگول! :mrgreen: : به نظرتون میشه این کار رو بکنیم که مثلا این تسک ها رو به صورت یه فایل مجزا کامپایل کنیم ، توی یه حافظه ای مثل SD/MMC بریزیم و با نوشتن یه برنامه ، اون فایلو توی SDRAM کپی کنیم و به عنوان یه تسک ازش استفاده کنیم ؟ ( در واقع برنامه هامون رو از برنامه اصلی جدا کنیم ، مثل موبایل که شما توش یه برنامه رو نصب میکنید و وقتی اجراش میکنید به عنوان یه تسک باز میشه)

        آموزشتون خیلی مفیده لطفا ادامه بدید . :applause:
        فرق ما با جهان غرب در اینه که اونا هیچی نمیدونن! و تحقیق میکنند ولی ما همه چیزو می دونیم! و تحقیق برای ما معنی نداره!!!!!!!!!!!! .(از یه آدم اینکاره)

        دیدگاه


          #19
          پاسخ : راه اندازی rtx kernel در کیل

          منم یه سوال دارم
          من واسه usart و adc هیچ library پیدا نکردم فقط ethernet و usb دیدم یه چیزایی داره
          اصلا این RTX رو ساختن library بدن به ملت یا هدف برنامه نویسی به صورت سیستم عاملی بوده؟

          دیدگاه


            #20
            پاسخ : راه اندازی rtx kernel در کیل

            من جواب خودم رو پیدا کردم

            دیدگاه


              #21
              پاسخ : راه اندازی rtx kernel در کیل

              آقا جون من هر کاری بخوام بکنم میتونم بدون RTX هم کارمو انجام بدم. اما سخت تر. من باب اطلاعتون میکروسافت میگه با استفاده از Workflow Foundation میشه تمامی عملیات به ظاهر multitask رو با یک task هم انجام داد. ولی این مسئله وقت گرانبهای برنامه نویس رو حروم میکنه. "کاری نداریم که اینجا وقت از پهن هم بی ارزشتره!" اگر شما نخوای از RTX استفاده کنی بایستی با یک تحلیل تر و تکمیل و یک پیاده سازی خیلی دقیق کارتو پیش ببری. که خیلی جاها و برای خیلی آدما شدنی نیست. یعنی عوض اینکه با یک دست 4 تا هندونه رو ورداری 3 نفر دیگه رو استخدام کنی تا اونا هم هر کدوم یه هندونه برات ببرن. عوضش اینجوری هر کسی میتونه چهار تا چهارتا هندونه هاشو ببره. ولی تو حالت اولیه کار هر کسی نیست. ایضا توسعه این سیستم بمراتب از توسعه یک سیستم بزرگتر که بر اساس rtx نوشته شده باشه سخت تر و زمانبر تره. (همون پهن!!).

              uart و adc تجهیزات سبکی هستن و معمولا کاری که براشون تعریف میشه هم سبکه. میخوای باهاش چکار کنی؟ از دید برنامه وسخت افزار اطلاعات رو توی رجیسترش میذاری و میفرستی. یا از adc یک سری اطلاعات رو میخونی. بنابراین به library خیلی پیچیده ای نیاز نیست. اما پروتکل های شبکه و usb هم حجیم هستن و هم برای راحتی دید برنامه اصلی بایستی خیلی چیزا پیاده سازی بشه. پس میان یک سری library براش مینویسن که اون وقت کذایی کمتر حروم بشه. مثلا برای یک ارتباط tcp/ip حداقل icmp, udp, arp, احتمالا dhcp رو میخوای.
              وگرنه همه این کارها رو میشه بصورت وقفه ای و بدون RTX هم نوشت. همه چی هم از اول!!

              اون چیزی که شما راجع به اجرای تسک های متفاوت میگی آره میشه. اما شما دو تا چیز رو یادت داره میره. اولا ما یک سیستم شدیدا محدود در اختیار داریم. و دوما و به عنوان نتیجه ای از شق اول نمیتونیم مکانیسم هایی رو استفاده کنیم که منجر به افزایش استفاده بیش از حد از حافظه و سرعت میکرو و غیره بشه. منظورم اینه که کدهای مشترک رو میخوای چکار کنی؟ ارتباط بین کدهای متفاوت چی؟ ارتباط بین task های متفاوت چی؟ همه اینه رو میشه راجع بهش کلی بحث کرد. (که البته من نه حوصله تایپش رو دارم نه وقتشو). راحتترین کار استفاده از یک محیطی مثل جاوا برای تعریف کدهای شما و تفسیر اون در زمان اجرا برای شبیه سازی حالت multitasking هستش. اما اینها قراره کجا استفاده بشه. روی یک سیستم محدود با کاربرد خاص پس به نوعی اتلاف منابع است. این سیستم قراره یکبار و برای همیشه پیاده سازی بشه. مثل windows یک محیط عمومی برای کاربردهای عمومی نیست. امیدوارم منظورم رو متوجه شده باشی.

              اتصال شبکه رو باشه یه جای دیگه چون خیلی منطق های متفاوتی میشه برای پیاده سازیش در نظر گرفت. اما راجع به lcd همون کدهای خودت رو استفاده کن. اما به سرعتش کاری نداشه باش چون اینجا بطور منطقی یک میکرو به ازای هر task داریم که تمام وقتش مال اون task هستش. فقط اگر قرار بود دو تا task همزمان با lcd کار کنن مکانیسم های همزمانی بایستی پیاده سازی بشه.

              دیگه؟

              دیدگاه


                #22
                پاسخ : راه اندازی rtx kernel در کیل

                سلام خدمت اقای رضای عزیز
                چند تا سوال داشتم
                1-ایا سمافور فقط بزای پورت ها مثل سریال و .. استفاده میشه تا دو تا تسک با هم حین استفاده تداخل نکنند
                2- من دیدم که میشه متغییر های global تعریف کرد که به راحتی همه تسک ها ازش استفاده کنند و برلی جلو گیری از تداخل هم event ها رو به کار میگیریم چه لزومی به mailbox و message زدن از یک تسک به تسک دیگر می باشد
                3-من نفهمیدم mutex ها دقیقا در چه application هایی کار برد دارند
                www.tehranelec.com

                دیدگاه


                  #23
                  پاسخ : راه اندازی rtx kernel در کیل

                  آقا جون خیلی داری تند میری. بیا پایین با هم بریم!!
                  سمافور و mutex و این خزعبلات برای اینه که شما منطق هایی جدای از هم پیاده سازی کردین که در بعضی جاها با هم اختلال دارند. یعنی میخوان روی یک مورد به طور مشترک عملی رو انجام بدن که منجر به اعمال تغییرات میشه. مثلا اگه جایی قرار باشه یکی یک متغیر رو تغییر بده و اون یکی فقط مقدارش رو بخونه به همزمانی احتیاجی نیست.

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

                  تسک اول:

                  - اخذ یک بایت.
                  - اخذ اجازه برای اعمال تغییرات در بافر (از طریق mutex). یعنی از این به بعد بافر "مال منه".
                  - قرار دادن بایت در بافر.
                  - اعلام اینکه دیگه بافر مال من نیست. آزاد کردن mutex.

                  تسک دوم:
                  - صبر کردن برای اینکه حداقل یک بایت در بافر قرار بگیره.
                  - اخذ اجازه برای اعمال تغییرات در بافر (از طریق mutex) یعنی از این به بعد بافر مال منه.
                  - اخذ بایت از بافر.
                  - اعلام اینکه دیگه بافر مال من نیست. آزاد کردن mutex.

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

                  تسک اول:

                  - اخذ یک بایت.
                  - اخذ اجازه برای اعمال تغییرات در بافر (از طریق mutex). یعنی از این به بعد بافر "مال منه".
                  - قرار دادن بایت در بافر.
                  - اعلام اینکه دیگه بافر مال من نیست. آزاد کردن mutex.
                  - اضافه کردن مقدار سمافور مربوطه (release_semaphore).

                  تسک دوم:
                  - صبر کردن برای اینکه حداقل یک بایت در بافر قرار بگیره. (sem_wait).
                  - اخذ اجازه برای اعمال تغییرات در بافر (از طریق mutex) یعنی از این به بعد بافر مال منه.
                  - اخذ بایت از بافر.
                  - اعلام اینکه دیگه بافر مال من نیست. آزاد کردن mutex.

                  مکانیسم فوق رو میشه با استفاده از mailbox هم پیاده کرد ولی اغلب مواردی رو که ما اینجا پیاده کردیم داخل اون پیاده سازی شده هست.

                  دیدگاه


                    #24
                    پاسخ : راه اندازی rtx kernel در کیل

                    ممنون و ادامه سوالات
                    در تابع
                    os_sem_init (semaphore1, 1
                    ارگومان دوم تعداد token ها گفته شده
                    اهمیت ارگومان دوم چیه ؟( ندیدم جایی استفاده بشه همیشه token رو به سمافور بر میگردونیم و اصلا اون نمود نداره)
                    ببخشید ایا از تمام توابع اینتراپتی (تایمر وusart و...) میشه با task ارتباط بر قرار کرد
                    تو help کیل نوشته بود که fiq اصلا نمیتونه با task ها ردو بدل اطلاعات کنه
                    www.tehranelec.com

                    دیدگاه


                      #25
                      پاسخ : راه اندازی rtx kernel در کیل

                      نوشته اصلی توسط reza_agha

                      - صبر کردن برای اینکه حداقل یک بایت در بافر قرار بگیره. (sem_wait)..
                      خوب اگه اولویت یک تسک که منتظر ازاد شدن mutex است بالاتر باشه به محض ازاد شدن متوجه میشه که ازاد شده و مشکل این طوری حل نمیشه؟
                      دیگه نیازی به ارسال سمافور براش نیست!؟
                      www.tehranelec.com

                      دیدگاه


                        #26
                        پاسخ : راه اندازی rtx kernel در کیل

                        ببینین به صورت تئوری هر زمانی که کنترل اجرا از یک تسک گرفته میشه و یا بهش برگردونده میشه عملیاتی در زمینه انجام میشه که اصطلاحا بهش context-switch گفته میشه. این عملی زمانگیره. بنابراین بهتره یک تسک اگر میخواد شرایطی رو چک کنه تا به کارش ادامه بده از مکانیسم های rtx استفاده کنه تا وقت میکرو بهتر مصرف بشه.

                        ضمنا راجع به استفاده از یک تسک با اولویت بالاتر ممکنه در اینجا جواب بده اما ما راه حل کلی رو مد نظر قرار میدیم. ضمنا ممکنه دوتا تسک با اولویت بالاتر پاشون وسط بیاد.

                        البته در rtx ضعفی وجود داره که نمیشه برای and چند mutex و semaphore کاری انجام داد (بر خلاف windows ).

                        در مورد سمافور یا mutex یا event باید اینو در نظر گرفت که وقتی برای هر کدوم صبر میکنیم یعنی اینکه اگر شرایط مورد نیاز برای اون مورد وجود نداشت تا زمان مورد نظرمون تسک در حالت suspend باقی بمونه. این شرط برای mutex داشتن تعلق و برای سمافور داشتن مقداری غیر صفر هست. بنابراین یک سمافور مثل کانتری میمونه که تعدادش مشخص کننده تعداد تسکهاییه که میتونه از حالت wait دربیاره. پارامتر دوم مشخص میکنه مقدار اولیه این سمافور چند باشه که عموما صفر هست. ولی اینکه غیر صفر باشه یا نه مسلما به منطق برنامه شما بستگی داره.

                        دیدگاه


                          #27
                          پاسخ : راه اندازی rtx kernel در کیل

                          راستی یک پی دی اف با حال و مختصر هم دیدم شاید به کار بیاد:

                          http://www.eng.auburn.edu/~nelsovp/courses/elec5260_6260/Chapter6%20RL-ARM%20Real-Time%20Executive%20%28RTX%29.pdf

                          دیدگاه

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