اطلاعیه

Collapse
No announcement yet.

at 91 sam7x interrupt

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

    at 91 sam7x interrupt

    سلام من میخوام یک برنامه بنویسم که یک متغیر از نوع float یا double رو توی main تغییر بده و هروقت وقفه خارجی رخ داد این متغیر float یا double رو توی روتین وقفه تغییراتی بدم و ارسال کنم ولی انتقال به وقفه صورت نمیگیره
    اگر متغیر از نوع int باشه مشکلی پیش نمیاد ولی اگر متغیر از نوع float یا double باشه برنامه درست کار نمی کنه
    لطفا کمکم کنید

    #2
    پاسخ : at 91 sam7x interrupt

    نوشته اصلی توسط imanhelmi
    سلام من میخوام یک برنامه بنویسم که یک متغیر از نوع float یا double رو توی main تغییر بده و هروقت وقفه خارجی رخ داد این متغیر float یا double رو توی روتین وقفه تغییراتی بدم و ارسال کنم ولی انتقال به وقفه صورت نمیگیره
    اگر متغیر از نوع int باشه مشکلی پیش نمیاد ولی اگر متغیر از نوع float یا double باشه برنامه درست کار نمی کنه
    لطفا کمکم کنید
    متغییر رو به صورت Global تعریف کردی یا local؟
    اگه local باشه نبایدم کار کنه ولی اگه global باشه مشکلی نداره و باید کار کنه
    ترجیحا برنامتو بزار تا بررسی کنم
    زندگی یعنی امید و حرکت
    کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
    سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
    برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
    به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

    دیدگاه


      #3
      پاسخ : at 91 sam7x interrupt

      سلام global تعریف شده
      اگر int باشه درست کار میکنه ولی اگر double باشه کار نمی کنه

      دیدگاه


        #4
        پاسخ : at 91 sam7x interrupt

        Volatile قبل از متغییر بذارید ببینیم درست میشه یا نه.
        اگه نشد خبر بدید.

        دیدگاه


          #5
          پاسخ : at 91 sam7x interrupt

          سلام. مرسی راهنماییتون درست بود volatile گذاشتم درست شد :nice:

          دیدگاه


            #6
            پاسخ : at 91 sam7x interrupt

            اصلا volatile مربوط به تعیین حوزه دسترسی دیتا آبجکت نمیشه.

            همون که جناب ایمانی فر فرمودند درسته ، در صورتی که دیتاآبجکت به صورت Global اعلان بشه میشه تو روتین وقفه بهش دسترسی داشت.

            درصورتی یک extern کنارش بزارید میتونید تو روتین وقفه ای که در فایل دیگه ی پروژه قرار دارد هم بهش دسترسی پیدا کنید.

            البته اگه خیلی نیاز دارید که داخل main اعلان بشه . باید یک اشاره گر global هم اعلان بشه و به اون اشاره داده بشه و از طریق اشاره گر بهش دسترسی پیدا کنید.


            کلمه ی کلیدی volatile جهت توصیه برنامه نویس به کامپایلر برای عدم پتیمایز کردن دیتا آبجکت استفاده میشه. ولاغیر
            راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
            کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
            نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
            http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
            انشالله به زودي تاپيک ها به روز رساني خواهد شد،

            دیدگاه


              #7
              پاسخ : at 91 sam7x interrupt


              اینکه چرا Volatile مشکل ایشون رو حل کرد اینه:


              http://www.eca.ir/forum2/index.php?t...1494#msg301494

              دیدگاه


                #8
                پاسخ : at 91 sam7x interrupt

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

                اینکه چرا Volatile مشکل ایشون رو حل کرد اینه:


                http://www.eca.ir/forum2/index.php?t...1494#msg301494
                خیر مشکل ایشون همون طور که از پست اول پیداست ، دسترسی به دیتاآبجکتیه که دسترسیش در روتین وقفه محدوده و نمیشه دسترسی پیدا کرد.
                اون پست هم حرفش چیزه دیگه است
                volatile مربوط به بهینه سازی کامپایلر میشه

                ------------------------------------------------------------------------------
                البته فکر کنم مشکلشون حل شده باشه .
                درهر صورت اگر فکر میکنید ، بنده اشتباه میکنم ، من به شما احترام میزارم و حرفتون را قبول میکنم. شما درست میفرمایید
                راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                دیدگاه


                  #9
                  پاسخ : at 91 sam7x interrupt

                  آقایون بحث رو به خاطر منم شده تموم کنید :biggrin:
                  با سپاس از همکاری شما :mrgreen:
                  زندگی یعنی امید و حرکت
                  کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                  سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                  برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                  به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                  دیدگاه


                    #10
                    پاسخ : at 91 sam7x interrupt

                    حالا که بحث داغ شد بیشتر توضیح میدم
                    این برنامه قراره در داخل main تعداد تعداد زیادی دیتا رو با فرکانس بالا دریافت کنه و همه دیتا ها رو با هم جمع کنه و همچنین تعداد دیتا ها هم باید با هم جمع بشن دیتا های ورودی 32bit هستند پس مجموع دیتاها عدد بزرگی میشه .
                    هر وقت وقفه اتفاق بیفتد باید مجموع دیتا و تعداد دیتا در روتین وقفه برهم تقسیم شه که میانگین دیتا بدست بیاد و جواب به بیرون ارسال شه
                    حالا اگه این متغیر global و doulbe تعریف بشه تو وقفه هیچ اتفاقی نمی افته و صفر ارسال میشه اگر global و int تعریف بشه درست کار میکنه ولی نمیتونه کل اعداد رو جمع کنه و اشباع میشه
                    ولی اگر یک متغیر volatile double تعریف کنم همه چیز درست کار میکنه!

                    دیدگاه


                      #11
                      پاسخ : at 91 sam7x interrupt

                      نوشته اصلی توسط ImanH
                      حالا که بحث داغ شد بیشتر توضیح میدم
                      این برنامه قراره در داخل main تعداد تعداد زیادی دیتا رو با فرکانس بالا دریافت کنه و همه دیتا ها رو با هم جمع کنه و همچنین تعداد دیتا ها هم باید با هم جمع بشن دیتا های ورودی 32bit هستند پس مجموع دیتاها عدد بزرگی میشه .
                      هر وقت وقفه اتفاق بیفتد باید مجموع دیتا و تعداد دیتا در روتین وقفه برهم تقسیم شه که میانگین دیتا بدست بیاد و جواب به بیرون ارسال شه
                      حالا اگه این متغیر global و doulbe تعریف بشه تو وقفه هیچ اتفاقی نمی افته و صفر ارسال میشه اگر global و int تعریف بشه درست کار میکنه ولی نمیتونه کل اعداد رو جمع کنه و اشباع میشه
                      ولی اگر یک متغیر volatile double تعریف کنم همه چیز درست کار میکنه!
                      دوست عزیز
                      من می دونستم که همین طوره و شما متغییر رو گلوبال تعریف کردید. کار شما درسته. متاسفانه این موضوع به علت عدم آشنایی با عملکرد کامپایلرها پیش میاد. این یه عملکرد طبیعی از کامپایلر هستش.
                      سعی کنید هر وقت که متغییری دارید که توی روتین وقفه میفته رو با volatile تعریف کنید(اکثرا واسه روتین وقفه پیش میاد).
                      RubeuS تازه کار هستش(به عبارتی تجربه نداره).

                      دیدگاه


                        #12
                        پاسخ : at 91 sam7x interrupt

                        سلام
                        در واقع Volatile به کمپایلر اجازه بهینه کردن رو نمیده ! و معمولا زمانی از این نوع استفاده میکنیم که

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

                        موفق باشید

                        دیدگاه


                          #13
                          پاسخ : at 91 sam7x interrupt

                          نوشته اصلی توسط پیمان ذوالنوری
                          سلام
                          در واقع Volatile به کمپایلر اجازه بهینه کردن رو نمیده ! و معمولا زمانی از این نوع استفاده میکنیم که

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

                          موفق باشید
                          Rohalamin جان دستت درد نکنه امروز همین نکته ای که گفتی به کارم اومد منتها با AVR و کدویژن
                          کلافم کرده بوده ولی یه آن یاده این تاپیک افتادم و Volatile که بهش اشاره کرده بودی
                          ممنون :job:
                          زندگی یعنی امید و حرکت
                          کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                          سؤالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                          برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                          به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                          دیدگاه


                            #14
                            پاسخ : at 91 sam7x interrupt

                            سلام
                            دوستان من میخوام وقفه خارجی رو با لبه بالا رونده فعال کنم اما اطلاعات کافی ندارم لطفا راهنمایی کنید... :smile:
                            اگر یه مرجع آموزشی دارید واسه ما تازه کارا هم قرار بدید هرچی گشتم چیزه بدردبخوری پیدا نکردم. اگه مرجع انگلیسی هم دارید که چه بهتر :biggrin:

                            دیدگاه


                              #15
                              پاسخ : at 91 sam7x interrupt

                              لطفا اگه ممکنه زود جواب بدید وقتم خیلی کمه :angry:

                              دیدگاه

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