اطلاعیه

Collapse
No announcement yet.

UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

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

    UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

    سلام به همه.
    دوستان عزیز و استادان Keil و STM لطفا کمک کنند:
    من توی کیل برای چیپ STM32F103RBT یه کد نوشتم که مرتب کار میکنه!
    حجم کد بالا رفته و مجبور شدم که سطحoptimization رو به O1 تغییر بدم تا حجم کد کم بشه!!!
    وقتی که این تغییر رو میدم، برنامه از سرویس اینتراپتها بازگشت نمیکنه و سرویس اینتراپت هی تکرار میشه و تبدیل میشه به حلقه بینهایت!!!!
    البته این مشکل بیشتر برای اون دسته از اینتراپتها اتفاق میافته که بین دو درخواست متوالی اینتراپت شون، فاصله زمانی کوتاهتری وجود داره!!!
    نظر و راهکار شما چیه؟؟؟
    ...

    _ به دو دلیل کد ایراد نداره:
    a-روی STM32F103ZET و با optimization=O0 درست کار میکنه!
    b_ با حذف بخشهای غیر مرتبط کد و کم کردن حجم آن، روی STM32F103RBT و با optimization=O0 درست کار میکنه!
    _ به داستان Volatile هم ربط نداره! چون با اعمال این qualifier به متغییرهای سراسری و حتی همه متغییرها، بهبودی حاصل نشد!!
    _ بقیه سطوح optimization نیز چک شد، غیر O0 روی هیچ سطحی کار نمیکنه!!

    این توضیح رو هم اضافه کنم، که کد توی یه حلقه بینهایت (شبیه به این while(1) گیر نمیکنه، واین کل سرویس وقفه است که هی تکرار میشه، یعنی شما هر کدی که توی سرویس وقفه نوشتی دائما اجرا میشه و پردازنده هنگ نیست!! یه جورایی انگار که با اجرای وقفه فلگهای وقفه صفر نمیشن!!!

    ؟؟؟؟؟؟؟

    جدیدترین ویرایش توسط ubub; ۲۲:۴۲ ۱۳۹۷/۰۷/۱۷.
    ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙

    #2
    پاسخ : UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

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

    دیدگاه


      #3
      پاسخ : UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

      نوشته اصلی توسط gordany نمایش پست ها
      سلام، من تا حالا چنین مشکلی نداشتم، چنتا سوال دارم اگر پرچم وقفه رو دستی پاک کنی باز هم مشکل وجود داره؟ آیا چنتا وقفه همزمان با هم استفاده شده؟ آیا تابعی وجود داره که هم توی بدنه ی main و هم وقفه فراخوانده شده باشه؟
      مهندس سلام،
      ممنون از پاسختون،
      چندتا وقفه هم زمان ... >> بقیه وقفه ها رو هم که غیر فعال میکردم، فایده نداشت!
      تابعی که هم توی main و هم توی وقفه ... >> حواسم به این مورد هست، و اکثرا سعی میکنم برای وقفه ها توابع اختصاصی بنویسم!
      ...
      اگر پرچم وقفه رو دستی پاک کنی ... >> به ظن خودم این مورد رو تست کردم و اثر نکرد!
      البته از اونجایی که سیستم وقفه این ARM ها خیلی پیچیده است و یک طبقه Pending هم داره، میگم شاید کدی که من برای این منظور نوشتم کارآمد نبوده، شما اگه کدی دارید بذارید، تا تست کنم!!
      یه وفقه روی USART1 هست و یکی روی USB .
      هر دو تاش هم با تغییر سطحoptimization به مشکل میخوره!
      برای راحتی کار، شما روی USART1 کد بذار!
      ...
      ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙

      دیدگاه


        #4
        پاسخ : UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

        از توابع HAL استفاده میکنید؟ من روتین وقفه دریافت سریال رو چک کردم، وقفه ها قبل از اجرای روتین غیر فعال میشن، اگر از HAL استفاده نمیکنید تابع
        __HAL_UART_DISABLE_IT()
        رو از تعریفای HAL پیدا کنید و خودتون بنویسید.

        دیدگاه


          #5
          پاسخ : UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

          نوشته اصلی توسط gordany نمایش پست ها
          از توابع HAL استفاده میکنید؟ من روتین وقفه دریافت سریال رو چک کردم، وقفه ها قبل از اجرای روتین غیر فعال میشن، اگر از HAL استفاده نمیکنید تابع
          __HAL_UART_DISABLE_IT()
          رو از تعریفای HAL پیدا کنید و خودتون بنویسید.
          جناب مهندس خیلی ممنون از همکاریتون،
          نه من از HAL استفاده نمیکنم!
          ولی توابع رو از نت که نگاه کردم، اصل داستان با اونچه که خودم (برای دستکاری اینتراپتها و Pending شون) نوشته بودم یکی بود!
          ...
          تقریبا فهمیدم مشکل کجاست، یه دلیل کشنده داره!!!
          وقتی optimization رو از O0 به O1 تغییر میدی، اون حالت بهینه سازی برای زمان، از دست میره و کامپایلر بهینه سازی رو به منظور کاهش حجم انجام میده، خوب طبیعیه که کدها پیچیده تر میشند و زمان بیشتری برای اجراشون طول میکشه!! در نتیجه توی درخواستهای وقفه با فواصل کوتاه، سرویس وقفه قبل از اتمام، دوباره وقفه میخوره و درجا تکرار میشه!!
          (البته این برداشت من هست، شاید دلیل دیگه ای داشته باشه!!! به هر حال وقتی ارتباط رو با سرعت پائین تری (البته ناکارآمد) راه می اندازم، کار میکنه! (توی همون optimization=O1))
          (هرچندکه من همیشه سعی میکنم بار پردازشی رو توی سرویس وقفه به حداقل برسونم! البته این کار زمانی راهگشا خواهد بود، که شما بتونی حداقل پردازشهای لازم رو روی داده هات قبل از رسیدن اطلاعات جدید انجام بدی، مخصوصا وقتی که طرف دیگر ارتباط دست خودت نیست و سرعت خودش رو داره !!!)
          ...
          تشکر از همه دوستان، باز اگر مطلبی به نظرتون میرسه، دریغ نفرمائید!
          ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙

          دیدگاه


            #6
            پاسخ : UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

            نوشته اصلی توسط ubub نمایش پست ها
            جناب مهندس خیلی ممنون از همکاریتون،
            نه من از HAL استفاده نمیکنم!
            ولی توابع رو از نت که نگاه کردم، اصل داستان با اونچه که خودم (برای دستکاری اینتراپتها و Pending شون) نوشته بودم یکی بود!
            ...
            تقریبا فهمیدم مشکل کجاست، یه دلیل کشنده داره!!!
            وقتی optimization رو از O0 به O1 تغییر میدی، اون حالت بهینه سازی برای زمان، از دست میره و کامپایلر بهینه سازی رو به منظور کاهش حجم انجام میده، خوب طبیعیه که کدها پیچیده تر میشند و زمان بیشتری برای اجراشون طول میکشه!! در نتیجه توی درخواستهای وقفه با فواصل کوتاه، سرویس وقفه قبل از اتمام، دوباره وقفه میخوره و درجا تکرار میشه!!
            (البته این برداشت من هست، شاید دلیل دیگه ای داشته باشه!!! به هر حال وقتی ارتباط رو با سرعت پائین تری (البته ناکارآمد) راه می اندازم، کار میکنه! (توی همون optimization=O1))
            (هرچندکه من همیشه سعی میکنم بار پردازشی رو توی سرویس وقفه به حداقل برسونم! البته این کار زمانی راهگشا خواهد بود، که شما بتونی حداقل پردازشهای لازم رو روی داده هات قبل از رسیدن اطلاعات جدید انجام بدی، مخصوصا وقتی که طرف دیگر ارتباط دست خودت نیست و سرعت خودش رو داره !!!)
            ...
            تشکر از همه دوستان، باز اگر مطلبی به نظرتون میرسه، دریغ نفرمائید!
            سلام
            من قبلا یه بار به چنین مشکلی خوردم و که پس کلی درگیری با برنامه و فعال و غیر فعال کردن وقفه ها متوجه شدم که حافظه stack اورفلو میشه و میکرور هنگ میکنه
            گفتم شاید مشکل شما هم از همین اورفلو شدن استک باشه

            دیدگاه


              #7
              پاسخ : UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

              متاسفانه آپتیمایز کامپایلرها احمقانه عمل میکنه . یک منطق خاصی دره که کعم.لا مشکل سازه ..من همیشه آپتیمایز رو <نون > میکنم .
              تنها موردي كه همه آدما يقين دارن خدا در حقش زیاد لطف کرده
              داشتن عقله زيادتر از دیگر آدم ها است

              دیدگاه


                #8
                پاسخ : UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

                نوشته اصلی توسط aliila نمایش پست ها
                متاسفانه آپتیمایز کامپایلرها احمقانه عمل میکنه . یک منطق خاصی دره که کعم.لا مشکل سازه ..من همیشه آپتیمایز رو <نون > میکنم .
                اگه تو حالت none باشه که حجم برنامه به شدت بالا میره، با این قضیه مشکلی ندارین؟

                دیدگاه


                  #9
                  پاسخ : UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

                  تشکر ویژه از جنابان gordany و M3R-E و aliila

                  نوشته اصلی توسط M3R-E نمایش پست ها
                  سلام
                  من قبلا یه بار به چنین مشکلی خوردم و که پس کلی درگیری با برنامه و فعال و غیر فعال کردن وقفه ها متوجه شدم که حافظه stack اورفلو میشه و میکرور هنگ میکنه
                  گفتم شاید مشکل شما هم از همین اورفلو شدن استک باشه
                  سلام مهندس،
                  ایرادتون محتمل به نظر میرسه! ولی توی کیل، توی فایل Start_UP.S که نگاه میکنم توی همه حالتهای optimization حافظه ستک (400H) و هیپ (200H) مقدارش ثابته و #IF Def و شرطی هم نداره!!
                  پشت بندش هم Initate(); و main(); رو صدا زده!!
                  پس نباید ربطی به این مورد داشته باشه!
                  تازه من فراخوانی توابع تودرتو رو اکثرا محدود میکنم، نهایتا یک یا دو سطح!! و چندان حافظه استکی نیاز نمیشه!!
                  حالا باز اگه راه کار ایمنی برای دستکاری اندازه Stack و Heap میشناسید، بفرمائید من تست کنم!!

                  نوشته اصلی توسط aliila نمایش پست ها
                  متاسفانه آپتیمایز کامپایلرها احمقانه عمل میکنه . یک منطق خاصی دره که کعم.لا مشکل سازه ..من همیشه آپتیمایز رو <نون > میکنم .
                  سلام مهندس،
                  حق با شماست، البته مذخرف تر از optimization برخی کامپایلرها، داستان الکترونیک کار کردن ما مصرف کنندگان علم و فن آوریه!
                  تا میاییم با رفتار یه کامپایلر درست آشنا بشیم و همه گوشه و کناراش رو بشناسیم و توش حرفه ای بشیم، باید به هزار دلیل، کرک و قطعه و بازار و مد روز و ... بذاریمش کنار بریم سراغ یکی دیگه!!!!!

                  راستی دوستان و اساتید گرامی، راهی نداره که این کامپایلر محترم، بخشی از کد رو بیخیال optimization بشه، مثلا یه فایل جداگانه رو یا یه تابع رو؟؟؟؟
                  ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙

                  دیدگاه


                    #10
                    پاسخ : UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

                    احتمالا مشکل از Stack هست، همین مشکلی که گفتید تا از یک اینتراپت در میآید به اینتراپت دیگر وارد می شود، خود باعث پر شدن stack میشود، تا یک زمانی که stack جا داشته باشد مشکلی نیست، بعد آن در arm اینقدر فضا پر میشود تا به یک حافظه که نباید به آن دسترسی پیدا کنید میرسید و اکسپشن تولید میشود، اگر از st cubemx استفاده کنید، که توابع اکسپشن را در کد قرار می دهد، احتمالا باید ببینید که که داخل while(1) میافتد، اگر فضا به اندازه کافی باشد ممکن هست که یک مقدار طول بکشد.
                    و در حالت کلی اگر اینتراپت زیاد صدا زده شود، و تو در تو بشوند stack پر میشود

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



                    شما میتوانید رو هر فایل کلیک راست کنید و جداگانه وضعیت و نوع کامپایل آن را مشخص کنید.

                    دیدگاه


                      #11
                      پاسخ : UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

                      نوشته اصلی توسط ubub نمایش پست ها
                      سلام مهندس،
                      ایرادتون محتمل به نظر میرسه! ولی توی کیل، توی فایل Start_UP.S که نگاه میکنم توی همه حالتهای optimization حافظه ستک (400H) و هیپ (200H) مقدارش ثابته و #IF Def و شرطی هم نداره!!
                      پشت بندش هم Initate(); و main(); رو صدا زده!!
                      پس نباید ربطی به این مورد داشته باشه!
                      تازه من فراخوانی توابع تودرتو رو اکثرا محدود میکنم، نهایتا یک یا دو سطح!! و چندان حافظه استکی نیاز نمیشه!!
                      حالا باز اگه راه کار ایمنی برای دستکاری اندازه Stack و Heap میشناسید، بفرمائید من تست کنم!!
                      متاسفانه با keil کار نکردم ، اما اگه پروژه رو با cube میسازی در قسمت project setting امکان تغییر stack وجود داره
                      در محیط دیباگ iar هم یه قسمت هست که هنگام debug کردن مقدار حافظه stack مصرف شده رو نمایش میده، من از اونجا متوجه شدم که بعد از اجرای چند تابع حافظه stack اورفلو میشه

                      دیدگاه


                        #12
                        پاسخ : UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

                        نوشته اصلی توسط Faateh نمایش پست ها
                        شما میتوانید رو هر فایل کلیک راست کنید و جداگانه وضعیت و نوع کامپایل آن را مشخص کنید.
                        احسنت جناب Faateh ،
                        سلام و درود فراوان!
                        همین مورد رو به کار بردم مشکل مثل باغلوا حل شد!
                        البته خودم چون ابتدا قویا احتمال میدادم که نشه چنین کاری کرد، در این باره یک خط هم سرچ نکرده بودم، بعد فرمایش شما، سرچ کردم و از روش pragma O0 استفاده کردم! لینکش رو برای استفاده بقیه قرار میدم:
                        http://www.keil.com/support/docs/3704.htm
                        Optimization level for one or multiple C functions within a C file: in a C file, if you want to optimize only one or several functions instead of the entire C file, you can use
                          #pragma push /* Save existing optimization level */
                        #pragma O3 /* Optimization level now O3 */
                        int foo(void)
                        {
                        ...
                        }
                        #pragma pop /* Restore original optimization level */

                        In this way only the function foo will have optimization level O3 and the other functions in this C file will remain the default optimization level setting derived from this group or component class.
                        تشکر مجدد از جناب فاتح و همه دوستان گرانقدر!

                        نوشته اصلی توسط Faateh نمایش پست ها
                        احتمالا مشکل از Stack هست، همین مشکلی که گفتید تا از یک اینتراپت در میآید به اینتراپت دیگر وارد می شود، خود باعث پر شدن stack میشود، ...
                        البته جسارتا این مورد صحیح نیست!! (حداقل توی STM32) !!
                        از اونجایی که وقفه جدید از جنس وقفه جاری هست و اولویت یکسانی دارد، اجرای سرویس وقفه قطع نمیشه و تا پایان ادامه مییابد و دستور بازگشت از وقفه نیز صادر میشود!
                        فقط چون توی STM32 برای وقفه ها یک طبقه Pending داریم، وقفه ثانویه ایجاد شده وضعیت Flag اون اینتراپت قبلی رو به Pending تغییر داده، و با بازگشت، به علت Pending بودن، مجددا به وقفه میره!
                        و البته چون با هر بار خروج از وقفه، بخش مربوطه در Stack خالی میشه، این وضعیت میتونه مادامی که عامل ایجاد وقفه وجود داشته باشه، تکرار بشه!
                        جدیدترین ویرایش توسط ubub; ۱۱:۵۱ ۱۳۹۷/۰۷/۲۰.
                        ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙

                        دیدگاه


                          #13
                          پاسخ : UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

                          نوشته اصلی توسط ubub نمایش پست ها
                          وقتی optimization رو از O0 به O1 تغییر میدی، اون حالت بهینه سازی برای زمان، از دست میره و کامپایلر بهینه سازی رو به منظور کاهش حجم انجام میده،
                          سلام مجدد، خوبه که مشکل حل شد، توی تنظیمات کیل دقیقا همونجا که سطح بهینه سازی رو عوض میکنید یه چک باکس وجود داره که میتونید بهینه سازی برای زمان رو اعمال کنید. برای افزایش میزان استک هم کافیه مقدارش رو توی فایل startup.s عوض کنید. اگر فرصت کردید این دو مورد رو هم امتحان کنید لطفا. ممنون

                          دیدگاه


                            #14
                            پاسخ : UBUB؟ توی Keil وقتی optimization رو روی سطح O1 قرار میدم، بازگشت از اینتراپتها مختل میشه!!!

                            نوشته اصلی توسط gordany نمایش پست ها
                            سلام مجدد، خوبه که مشکل حل شد، توی تنظیمات کیل دقیقا همونجا که سطح بهینه سازی رو عوض میکنید یه چک باکس وجود داره که میتونید بهینه سازی برای زمان رو اعمال کنید. برای افزایش میزان استک هم کافیه مقدارش رو توی فایل startup.s عوض کنید. اگر فرصت کردید این دو مورد رو هم امتحان کنید لطفا. ممنون
                            سلام،
                            سمعاً و طاعتا ...
                            ...
                            جناب مهندس مجدد تست کردم، توی سه تا حالت:
                            O1+OTime
                            O1+Stack=1200+Heap=600
                            O1+OTime+Stack=1200+Heap=600
                            هیچ کدوم جواب نداد!!
                            ...
                            البته من این مشکل رو حدود یک ماه پیش برخورد کردم، یادمه همه گزینه های توی تنظیمات، optimization، ورژن بخشهای مختلف و ...، دستکاری و تست کردم، و جواب نداد، ( موقتا با STM32F103ZET کار میکردم...)
                            ...
                            در کل برداشت خودم اینه که همون نحوه تغییر کدها، توی دوتا حالت مختلف optimization ، باعث این مشکل شده بود! و ربطی هم به تغییر مدت زمان اجرای کدها نداشت!
                            هر چند مسلماً تغییر optimization ، موجب تغییر زمان اجرا میشه ولی محدود! (نه اونقدری که من باهاش مواجه شده بودم،)
                            ...
                            من هم خواستم اون پست 5 رو ویرایش کنم که خلق الله رو به اشتباه نندازم!! ولی نشد!! (خدایا منو ببخش )
                            ...
                            ...
                            ممنون و متشکر از پیگیریتون!
                            جدیدترین ویرایش توسط ubub; ۱۳:۴۲ ۱۳۹۷/۰۷/۲۱.
                            ◙◙◙◙◙ میخوام به دوستان یه کتاب معرفی کنم! وقت کردید، بخونید - اسمش هست قرآن، سال نشر 10، نویسنده: خدا . ◙◙◙◙◙

                            دیدگاه

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