اطلاعیه

Collapse
No announcement yet.

مشکل در وقفه سریال

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

    #31
    پاسخ : مشکل در وقفه سریال

    اولا من نمیدونم با وجود اینتراپت شما چه اصراری دارید حتما از get استفاده کنید ...
    ثانیا اگر میخواید این کار رو بگنید با متغیر نمیشه . باید اینتراپت سریال رو هر جا لازم دارید disable کنید و دوباره enable کنید . گرچه من اصلا این کار رو به شما توصیه نمی کنم
    Don't hesitate to ask any question ..

    دیدگاه


      #32
      پاسخ : مشکل در وقفه سریال

      با سلام
      دوست عزیز توضیح میدم امیدوارم تفاوت gets با اینتراپت و چرایی کار نکردنش روشن شه
      ما مفهومی داریم به اسم blocking و none blocking، اینا چیه؟
      توی بلاکینگ برنامه به تابع یا مکان خاصی که برسه ننتظر میمونه تا وظیفه محوله انجام شه، مثلا gets منتظر میمونه تا به یه جمله ختم شده به اینتر برسه، یا جمله ای به طول ارایه ای که براش تعریف شده، بیاد، تا این اتفاق نیافته تابع اونجا گیر می کنه، مکانیزم پیاده سازی تابع بلاکینگ هم ساده هست، یه حلقه که تا شرطش براورده نشه توش گیر میکنه،
      نان بلاکینگ دقیقا بر عکس هست، یعنی تابع فراخوانی شده میره و سریع بر میگرده، در حالی که هنوز ممکنه وظیفش انجام نشده باشه، این توابع باید به کمک کد هایی که بر میگردونن به فراخوانندشون (اون که صداشون میکنه ) بفهمونن که الان تو چه وضعیتی هستن، وظیفه قبلی انجام شد یا هنوز انجام داره میشه ، مکانیزم هم این جوره که شما این تابع رو تو وایل اصلی برنامه همش صدا می کنید و در هر دفعه مقدار برگشتی میگه تو چه وضعیتی قرار داره
      روش اول سادست، برنامه خطیه اما توسعه کد سخته، یعنی برنامه یزرگ نمیشه باهاش زد، روش دوم کمی سخت تره و تجربه می خواد وگرنه کد باگ دار میشه

      خب این یه تعریف بود، حالا شما باید فکر کنی کدوم رو می خوای، gets بذارم و کد رو بلاک کنم، یا نان بلاک بزنم، روش اول که هیچی سادست، اما روش دوم شما همون مکانیزم بافر رو که اینجا گفتن رو پیاده می کنی و بعد این بافر رو تو یه تابع چک می کنی با مقدار مورد نظر اگه برابر بود 1 وگرنه 0 ریترن میکنی، توضیح زیاده من فقط سر نخ رو میدم، تاپیک جدا میطلبه،

      اما جواب اصلی سوال شما
      استفاده همزمان از gets و وقفه امکان پذیر نیست، چرا؟ وقفه یوزارت اگه جواب داده نشه دست از سر سی پی یو ور نمیداره، ههی وقفه میده، اصولا وقفه باید بهش رسیدگی شه وگرنه هی میاد، توی دیتا شیت نوشته رسیدگی به وقفه یوزارت با خوندن رجیستر دریافت انجام میشه یا اینکه فلگ مربوطه دستی صفر شه، خب حالا سناریوی شما اینطوره، وقفه میاد شما میگی فلان متغیر تو وقفه 1 شه، بعد میام تو وایل اصلی gets می کنم اگه اون یک بود، خب نمیشه، وقفه نمیذاره برنامه جلو بره هی میاد، اگه قراره gets کنیم اصلا وقفه باید خاموش باشه، سناریوی دو شما gets. رو تو وقفه میذارم، این کار سی پی رو میکشه، قاعده kiss میگه keep isr short and simple حالا تو روتین وقفه gets بذاریم که حلقه هست؟ اوپس تازه اضافه کنیم که هر وقفه فقط یک کاراکتر داره پس اولین وقفه میاد تو gets منتظر جمله ای هست که فقط کاراکتر اولش با وقفه اومده و تا اومدن وقفه دوم وقفه اول روتینش به انتها نرسیده و بوووم،،،،برنامه کار نمی کنه
      شما باید در هر وقفه فقط همون کاراکتر رو بخونی و تمام، یه پردازش کوچولو هم اشکال نداره اما kiss باید رعایت شه تا قبل وقفه بعدی کار این یکی تموم شه، مثلا بهترین کار همون گذاشتن تو بافر هست و پردازش بافر تو وایل اصلی ، پس gets و وقفه دو راه مختلف نیل به یک هدف هستند.، یکی برای کاربرد بلاکینگ و دیگری برای کاربرد بلاکینگ و نان بلاکینگ، این دو روش یعنی gets و وقفه توامان قابل استفاده نیستند، امیدوارم موضوع روشن شده باشد
      The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

      دیدگاه


        #33
        پاسخ : مشکل در وقفه سریال

        نوشته اصلی توسط hessam2013
        با سلام
        دوست عزیز توضیح میدم امیدوارم تفاوت gets با اینتراپت و چرایی کار نکردنش روشن شه
        ما مفهومی داریم به اسم blocking و none blocking، اینا چیه؟
        توی بلاکینگ برنامه به تابع یا مکان خاصی که برسه ننتظر میمونه تا وظیفه محوله انجام شه، مثلا gets منتظر میمونه تا به یه جمله ختم شده به اینتر برسه، یا جمله ای به طول ارایه ای که براش تعریف شده، بیاد، تا این اتفاق نیافته تابع اونجا گیر می کنه، مکانیزم پیاده سازی تابع بلاکینگ هم ساده هست، یه حلقه که تا شرطش براورده نشه توش گیر میکنه،
        نان بلاکینگ دقیقا بر عکس هست، یعنی تابع فراخوانی شده میره و سریع بر میگرده، در حالی که هنوز ممکنه وظیفش انجام نشده باشه، این توابع باید به کمک کد هایی که بر میگردونن به فراخوانندشون (اون که صداشون میکنه ) بفهمونن که الان تو چه وضعیتی هستن، وظیفه قبلی انجام شد یا هنوز انجام داره میشه ، مکانیزم هم این جوره که شما این تابع رو تو وایل اصلی برنامه همش صدا می کنید و در هر دفعه مقدار برگشتی میگه تو چه وضعیتی قرار داره
        روش اول سادست، برنامه خطیه اما توسعه کد سخته، یعنی برنامه یزرگ نمیشه باهاش زد، روش دوم کمی سخت تره و تجربه می خواد وگرنه کد باگ دار میشه

        خب این یه تعریف بود، حالا شما باید فکر کنی کدوم رو می خوای، gets بذارم و کد رو بلاک کنم، یا نان بلاک بزنم، روش اول که هیچی سادست، اما روش دوم شما همون مکانیزم بافر رو که اینجا گفتن رو پیاده می کنی و بعد این بافر رو تو یه تابع چک می کنی با مقدار مورد نظر اگه برابر بود 1 وگرنه 0 ریترن میکنی، توضیح زیاده من فقط سر نخ رو میدم، تاپیک جدا میطلبه،

        اما جواب اصلی سوال شما
        استفاده همزمان از gets و وقفه امکان پذیر نیست، چرا؟ وقفه یوزارت اگه جواب داده نشه دست از سر سی پی یو ور نمیداره، ههی وقفه میده، اصولا وقفه باید بهش رسیدگی شه وگرنه هی میاد، توی دیتا شیت نوشته رسیدگی به وقفه یوزارت با خوندن رجیستر دریافت انجام میشه یا اینکه فلگ مربوطه دستی صفر شه، خب حالا سناریوی شما اینطوره، وقفه میاد شما میگی فلان متغیر تو وقفه 1 شه، بعد میام تو وایل اصلی gets می کنم اگه اون یک بود، خب نمیشه، وقفه نمیذاره برنامه جلو بره هی میاد، اگه قراره gets کنیم اصلا وقفه باید خاموش باشه، سناریوی دو شما gets. رو تو وقفه میذارم، این کار سی پی رو میکشه، قاعده kiss میگه keep isr short and simple حالا تو روتین وقفه gets بذاریم که حلقه هست؟ اوپس تازه اضافه کنیم که هر وقفه فقط یک کاراکتر داره پس اولین وقفه میاد تو gets منتظر جمله ای هست که فقط کاراکتر اولش با وقفه اومده و تا اومدن وقفه دوم وقفه اول روتینش به انتها نرسیده و بوووم،،،،برنامه کار نمی کنه
        شما باید در هر وقفه فقط همون کاراکتر رو بخونی و تمام، یه پردازش کوچولو هم اشکال نداره اما kiss باید رعایت شه تا قبل وقفه بعدی کار این یکی تموم شه، مثلا بهترین کار همون گذاشتن تو بافر هست و پردازش بافر تو وایل اصلی ، پس gets و وقفه دو راه مختلف نیل به یک هدف هستند.، یکی برای کاربرد بلاکینگ و دیگری برای کاربرد بلاکینگ و نان بلاکینگ، این دو روش یعنی gets و وقفه توامان قابل استفاده نیستند، امیدوارم موضوع روشن شده باشد
        سلام
        واقعا ازتون ممنونم
        بالاخره تو این تاپیک یکی یه جواب درست و حسابی و علمی داد
        بالاخره فهمیدم چرا وقتی gets رو تو وقفه میزاشتم کار نمیکرد یا چرا وقتی یه متغیر و تو وقفه یک میکردم و تو وایل از gets استفاده میکردم باز هم نمیشد
        فقط من یه سوال دارم من قبلا از gets استفاده میکردم و توی کدویزارد وقفه ها رو فعال میکردم و کد های ایجاد شده توسط کدویزارد رو هم در برنامه میزاشتم چرا اون موقع مشکلی در کارکرد gets پیش نمیومد چون شما گفتید اگه بخوایم از gets استفاده کنیم باید وقفه خاموش باشه آیا علتش این بود که تو وقفه اطلاعات رو در یک ارایه نمیریختم?
        اطلاعاتتون فوق العادس خوشحال میشم بیشتر از اطلاعاتتون استفاده کنم

        دیدگاه


          #34
          پاسخ : مشکل در وقفه سریال

          راستی نمیشه همون سناریوی اول که با اومدن وقفه یک متغیر رو 1 کنم و تو وایل چک کنم و هر وقت یک بود از gets استفاده کنم و فلگ رو هم صفر کنم تا دیگه نره تو وقفه ? ایا این شدنیه?

          دیدگاه


            #35
            پاسخ : مشکل در وقفه سریال

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

            دیدگاه


              #36
              پاسخ : مشکل در وقفه سریال

              خواهش می کنم،
              در مورد اول اصولا امکان نداره، وقفه اگه بهش پاسخ داده نشه به محض خروج از isr دوباره وقفه میده و کد قفل میشه، دوباره امتحان کنید با برنامه ساده و خودتون تجربه کنید، احتمال میدم وقفه فعال نبوده تو کدی که ذکر کردید، مثلا sei صدا نشده بود
              سوال دوم: بله امکان داره و شدنی هست اما به نظرم اصولی نیست، لینک زیر توضیحات کاملی درباره نحوه کار با یوزارت با وقفه داده، امیدوارم مفید باشه

              http://www.avrfreaks.net/forum/tut-soft-using-usart-interrupt-driven-serial-comms?page=all
              The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

              دیدگاه


                #37
                پاسخ : مشکل در وقفه سریال

                نوشته اصلی توسط ali.ra
                شدنی هستش اما یک تغییر بدید و اون هم این که وقتی کاراکتر دریافتی نال بود متغیر رو یک کنید نه همیشه
                ایده خوبی برای کار با رشته هست اگه فرستنده نال رو ارسال کنه، که معمولا ارسال نمیکنه اما اگه ماهیت دیتا رندوم باشه نال هم میتونه جزیی از دیتا باشه که جواب گو نیست
                The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                دیدگاه


                  #38
                  پاسخ : مشکل در وقفه سریال

                  وقتی داده ها داره به صورت سریال میاد اکه نال بیاد نمی شه کفت وسط داده ها بوده و به هر حال مهم اینه که چون نال هم داریم انتها داده ها gets گیر نمی کنه
                  التماس دعا

                  دیدگاه

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