اطلاعیه

Collapse
No announcement yet.

چطور اولویت وقفه ها رو تنظیم کنم؟

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

    #16
    پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

    شرمنده که با این اطلاعات ناقصم جواب میدم درست و غلط بودنش پایه ... فقط میتونم حدسیاتم رو بگم!

    خوب واحد Boudrate بیت در ثانیه است ، اگه بگیم 9600 بیت در یک ثانیه ارسال میشه پس 8 بیت توی حدود 834 میکرو ثانیه ارسال میشه خوب تا این جا 834 میکرو ثانیه طول میکشه تا 8 بیت اطلاعات از بافر بره توی UDR بعد یک کلاک طول میکشه که فلگ RXC یک بشه پس از اون دو کلاک هم طول بکشه تا اطلاعات رو بخونیم از داخل UDR که اگر بگیم فرکانس میکرو 8 مگ باشه پس 834 میکرو + 375. میکرو ثانیه طول میکشه تا اطلاعات دریافت بشه و فلگ هم یک بشه

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

    دیدگاه


      #17
      پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

      زمان اجرای وقفه شما بستگی تام به عملیاتی که داره توش انجام میشه. و مهمتر از همه طرز مدیریت اطلاعات دریافتی. حتی با یک روش کلی و پیاده سازی های متفاوت این زمان میتونه بالا و پایین بشه. ولی دو تا مسئله هست. اولا چون سرعت 9600 انتخاب کردین بطور تقریبی هر 1.2 میلی ثانیه یکبار ممکنه این وقفه صدا زده بشه. بنا براین اگر فرض کنیم که فقط داده ها رو در داخل یک بافر حلقوی قرار بدیم؛ این کار رو عمدتا میشه با حداکثر زمانی در حدود 100 سیکل ساعت انجام داد. یعنی روی سرعت 8 مگا هرتزی میشه در حد 12.5 میکرو ثانیه. البته برای شرایط کمی پیچیده شاید بهتر باشه کمی بار وقفه رو زیاد کرد و از یک ماشین حالت وضعیت برای پردازش اولیه اطلاعات استفاده کرد. که حتی در این شرایط هم (لااقل در پیاده سازی هایی که من انجام دادم) بیش از 200 سیکل یا 25 میکرو ثانیه در 8 مگا هرتز نشد.
      ولی بهتره بیشتر توضیح بدین که چه اطلاعاتی دارین از وقفه تون دریافت میکنین. یا مثلا اصل پروتکل رو قید کنین.

      دیدگاه


        #18
        پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

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

        نوشته اصلی توسط mojtaba_led
        خوب واحد Boudrate بیت در ثانیه است ، اگه بگیم 9600 بیت در یک ثانیه ارسال میشه پس 8 بیت توی حدود 834 میکرو ثانیه ارسال میشه
        در ارسال 8 بیتی حداقل دو بیت اضافه هم به عنوان start bit و stop bit ارسال می شوند که با نرخ ارسال 9600 حدود 1.04 میلی ثانیه زمان می برد.

        نوشته اصلی توسط Robo-amir
        اگه بخوام بدترین شرایط رو در نظر بگیرم 500میلی ثانیه
        دارم از USART دیتا میگیرم . هر وقت یه دیتای کامل(8بیتی) برسه میره به وقفه
        Boudrate=9600 / Data bit=8 / Parity=None / Stop bit=1 / Flow control=None
        یعنی تقریبا هر دیتای کامل که بخواد برسه و وقفه فعال بشه چقدر طول میکشه؟
        اگر وظیفه روتین وقفه شما تنها ارسال و دریافت اطلاعات باشد و بی جهت در روتین وقفه برای سپری شدن زمان یا وقوع شرایط خاصی منتظر نماند، 500 میلی ثانیه زمان بسیار بزرگی است که بعید است مشکل خاصی ایجاد کند. اما اگر میزان Load ناشی از سایر وقفه ها برای CPU به حدی باشد که زمانبندی پاسخگویی به وقفه سریال دچار اختلال شود، ممکن است قبل از خواندن اطلاعات قبلی، بایت بعدی روی بایت قبلی نوشته شود و بنابراین اطلاعات از دست برود. اما در برنامه های معمول به شرط رعایت عدم انتظار طولانی در روتین وقفه ها و همچنین زیاد نبودن تعداد وقفه ها نسبت به توان پردازشی CPU، معمولا مشکلی بوجود نمی آید.
        اوژن: به معنای افکننده و شکست دهنده است
        دانایی، توانایی است-Knowledge is POWER
        برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
        وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
        قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
        اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
        ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

        دیدگاه


          #19
          پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

          سلام

          به صورت پابرهنه وارد شدم ببخشید.

          دو راه حل بد :
          1- از xmega استفاده کن
          2- برنامه هات را به صورت سیستم عاملی مثلا فمتو بنویس(مجله نویز)

          دیدگاه


            #20
            پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

            به نظر من که تو وقفه زیاد موندن درست نیست
            یه فلگ رو تو وقفه تایمر یک کن و زود بیا بیرون
            بعدا تو حلقه اصلی اگه دیدی فلگ یک شده بیا 3 ثانیه کار رو انجام بده و فلگ رو صفر کن

            دیدگاه


              #21
              پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

              نوشته اصلی توسط uni_ahmadi
              ای بابا! حتما یه چیزی میدونم که میگم دیگه!تو دیتا شیت مگا32 تو بخش تایمرها دیدم که وقفه تایمر بالاترین اولویتو داره! در ثانی خود وقفه که مهم نیست زمانش!زیر برنامه ای که توی وقفه تایمرم اجرا میشه 3ثانیه طول میکشه، من میخوام اگه این وسط وقفه خارجی فعال شد، میکرو، زیربرنامه وقفه تایمرو ول کنه و بره سراغ وقفه خارجی و زیر برنامه اون،بعدا برگرده سراغ تایمر ...
              سلام

              من حدث می زنم دوست عزیزمان مشکلش حل نشده،یه راهکار پیشنهاد میدم درصورتی که اصرار به استفاده همین نوع برنامه نویسی داری می تونی استفاده کنی.

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

              دیدگاه


                #22
                پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

                ممنون از راهنمایی همگی
                نوشته اصلی توسط رضا آقازاده
                زمان اجرای وقفه شما بستگی تام به عملیاتی که داره توش انجام میشه. و مهمتر از همه طرز مدیریت اطلاعات دریافتی. حتی با یک روش کلی و پیاده سازی های متفاوت این زمان میتونه بالا و پایین بشه. ولی دو تا مسئله هست. اولا چون سرعت 9600 انتخاب کردین بطور تقریبی هر 1.2 میلی ثانیه یکبار ممکنه این وقفه صدا زده بشه. بنا براین اگر فرض کنیم که فقط داده ها رو در داخل یک بافر حلقوی قرار بدیم؛ این کار رو عمدتا میشه با حداکثر زمانی در حدود 100 سیکل ساعت انجام داد. یعنی روی سرعت 8 مگا هرتزی میشه در حد 12.5 میکرو ثانیه. البته برای شرایط کمی پیچیده شاید بهتر باشه کمی بار وقفه رو زیاد کرد و از یک ماشین حالت وضعیت برای پردازش اولیه اطلاعات استفاده کرد. که حتی در این شرایط هم (لااقل در پیاده سازی هایی که من انجام دادم) بیش از 200 سیکل یا 25 میکرو ثانیه در 8 مگا هرتز نشد.
                ولی بهتره بیشتر توضیح بدین که چه اطلاعاتی دارین از وقفه تون دریافت میکنین. یا مثلا اصل پروتکل رو قید کنین.
                اینم برنامه :
                ================================================== =======================




                /************************************************** ***
                Chip type : ATmega8A
                Program type : Application
                AVR Core Clock frequency: 11.059200 MHz
                Memory model : Small
                External RAM size : 0
                Data Stack size : 256
                ************************************************** ***/
                #include <mega8.h>
                #include <delay.h>
                #include <string.h>
                #include <stdio.h>

                #define Enter 0x0D //ENTER 13
                #define Line_F 0x0A //Line Feed 10
                #define CtrlZ 0x1A //ctrl+Z 26
                #define Wait_For_Ok_ms 4000 //4 Second
                #define RX_BUFFER_SIZE 250

                // Declare global variables
                bit f_start = 1;
                bit rx_buffer_overflow; // This flag is set on USART Receiver buffer overflow
                bit f_Recive = 0 ;
                unsigned int rx_wr_index,rx_rd_index,rx_counter;
                unsigned int Temp_counter = 0;
                // "---------------------------------------";
                char rx_buffer[RX_BUFFER_SIZE]; // USART Receiver buffer
                char Recive_Buffer[RX_BUFFER_SIZE];
                char Reply_SM[]= {'+','C','M','T ','I',':',' ','"','S','M&#0 39;,'"','\0'}; //\+CMTI: "SM"\ //+CMTI: "SM",9
                char Reply_OK[]= {'O','K','\0'}; //\OK\;
                char Reply_RING[]= {'+','C','L','I ','P',':',' ','\0'}; //\+CLIP: \ //+CLIP: "+989353809804"
                char Reply_CallReady[]={'C','a','l',' l',' ','R','e','a',& #039;d','y','\0'}; //\Call Ready\;

                flash unsigned char Call[]="ATD 09353809804;";
                flash unsigned char ATE0[]="ATE0";
                flash unsigned char AT[]="AT";
                flash unsigned char Read_SMS[]="AT+CMGR=1";
                flash unsigned char Del_SMS[]={'A','T','+',' C','M','G','D', 'A','=','"',&#0 39;D','E','L',' ','A','L','L',& #039;"','\0'}; //|AT+CMGDA="DEL ALL"|

                void RX_Analysis(void);


                #ifndef RXB8
                #define RXB8 1
                #endif

                #ifndef TXB8
                #define TXB8 0
                #endif

                #ifndef UPE
                #define UPE 2
                #endif

                #ifndef DOR
                #define DOR 3
                #endif

                #ifndef FE
                #define FE 4
                #endif

                #ifndef UDRE
                #define UDRE 5
                #endif

                #ifndef RXC
                #define RXC 7
                #endif

                #define FRAMING_ERROR (1<<FE)
                #define PARITY_ERROR (1<<UPE)
                #define DATA_OVERRUN (1<<DOR)
                #define DATA_REGISTER_EMPTY (1<<UDRE)
                #define RX_COMPLETE (1<<RXC)

                // USART Receiver interrupt service routine
                interrupt [USART_RXC] void usart_rx_isr(void) //<CR><LF><response><CR>< LF>
                {
                char status,data;
                status=UCSRA;
                data=UDR;
                if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
                {
                rx_buffer[rx_wr_index]=data;
                if( (rx_buffer[rx_wr_index] == Line_F)&&(rx_buffer[rx_wr_index-1] == Enter) ) //<CR><LF>
                {
                if(f_start == 1) //<CR><LF><response>
                {
                //Clear_Buffer(rx_buffer);
                rx_wr_index=(RX_BUFFER_SIZE -1); //means : rx_wr_index = 0
                f_start=0;
                }
                else //f_start == 0 //<response><CR><LF>
                {
                rx_buffer[rx_wr_index]='\0'; //second <LF>=' '
                rx_buffer[--rx_wr_index]='\0'; //second <CR>=' '

                //copy to Recive
                f_Recive = 1 ;//RX_Analysis();

                f_start = 1;
                }
                //----------------------------------------------------------
                } //end if <ENTER><LILE FEED>
                if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
                if (++rx_counter == RX_BUFFER_SIZE)
                {
                rx_counter=0;
                rx_buffer_overflow=1;
                };
                };
                }

                //************************************************** **
                void main(void)
                {
                .
                .
                .
                .
                // Global enable interrupts
                #asm("sei&quot

                //================================================== =
                while (1)
                {
                .
                .
                .
                .
                if(f_Recive == 1)
                {
                #asm("cli&quot
                f_Recive = 0;
                strcpy(Recive_Buffer , rx_buffer);
                #asm("sei&quot
                RX_Analysis();
                }
                }




                ================================================== =======================
                1-اول کار اومدم سریال رو وقفشو خاموش کردم
                2-یه کپی ازش گرفتم تو Recive_Buffer
                3-وقفه سریال فعال
                4-پردازش -> RX_Analysis

                خالا این وسط تو زمانی که داره Recive_Buffer پردازش میشه اگه چیزی هم بیاد میره تو rx_buffer
                فقط میترسم بازم زمان پردازش و عملیاتام که خیلی هم زیادن rx_buffer رو از دست بدم !!!
                زمان تنها واحد حقیقی اندازه گیریه
                زمان وجود ماده رو اثبات میکنه
                بدون زمان هیچکدوم ما وجود نخواهیم داشت
                زمان یکتاست

                دیدگاه


                  #23
                  پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

                  روشی که تو پست بالا استغاده کردم معقول هست اساتید ؟

                  نوشته اصلی توسط رضا آقازاده
                  اولا چون سرعت 9600 انتخاب کردین بطور تقریبی هر 1.2 میلی ثانیه یکبار ممکنه این وقفه صدا زده بشه. بنا براین اگر فرض کنیم که فقط داده ها رو در داخل یک بافر حلقوی قرار بدیم؛ این کار رو عمدتا میشه با حداکثر زمانی در حدود 100 سیکل ساعت انجام داد. یعنی روی سرعت 8 مگا هرتزی میشه در حد 12.5 میکرو ثانیه.
                  یعنی اگه زیر برنامه ی وقفم تا قیا از 1.2 میلی ثانیه تموم شه مشکلی نیست دیگه ؟ اگه بحث زمان رو بزاریم کنار فضا چی ؟
                  آیا طولانی شدن وقفه احتیاج به پشته ی بیشتری هم داره ؟

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


                  نوشته اصلی توسط رضا آقازاده
                  ولی بهتره بیشتر توضیح بدین که چه اطلاعاتی دارین از وقفه تون دریافت میکنین. یا مثلا اصل پروتکل رو قید کنین.
                  در حال دریافت اطلاعات از یه ماژول SIM900 هستم

                  ممنون


                  زمان تنها واحد حقیقی اندازه گیریه
                  زمان وجود ماده رو اثبات میکنه
                  بدون زمان هیچکدوم ما وجود نخواهیم داشت
                  زمان یکتاست

                  دیدگاه


                    #24
                    پاسخ : چطور اولویت وقفه ها رو تنظیم کنم؟

                    یه سئوال دیگه هم در مورد وقفه ی سریال دارم که همین جا مطزح می کنم !
                    از لحظه ای که وقفه ایی رو فعال میکنیم بلافاصله آمادگی دریافت وقفه رو داره ؟(مخصوصا در مورد وقفه ی سریال)

                    مثلا این رو ببینید :

                    #asm("cli&quot
                    printf("%p" , Str_Buffer);
                    #asm("sei&quot
                    xxx

                    در قسمت xxx میخوام بافر وقفه رو بررسی کنم ! آیا چیزی رو این وسط از دست نمیدم؟
                    علت این کارمم اینه که نمیخوام در زمانی که دارم چیزی ارسال میکنم هیچ چیز دزیافت نشه !

                    ممنون
                    زمان تنها واحد حقیقی اندازه گیریه
                    زمان وجود ماده رو اثبات میکنه
                    بدون زمان هیچکدوم ما وجود نخواهیم داشت
                    زمان یکتاست

                    دیدگاه

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