اطلاعیه

Collapse
No announcement yet.

هنگ میکرو پس از تعریف متغیر محلی

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

    هنگ میکرو پس از تعریف متغیر محلی

    سلام
    میکرویی که استفاده میکنم STM32F104RB با 128K Flash و 20k RAM هستش روی هدر برد دیسکاوری



    همونطور که مشخصه من از 44 درصد از حافظه فلش و 10 درصد از رم رو اشغال کردم برنامه مشکلی نداشت اما از اینجا به بعد متغیر های محلی مثلا از نوع کاراکتر که در تابع اصلی تعریف میکنم با هر بار راه اندازی بمحض فعال شدن برنامه میکرو رو به هنگ میبره ... !
    وقتی پاکشون میکنم گلوبال تعریفشون میکنم مشکل حل میشه !
    رشته آرایه و داستان سرریز نه ها یک کاراکتر مثل char a=0 هم که اضافه کنم این اتفاق میفته، ممکنه دو آدرس رو هم بیفته!
    یه چیز دیگه اینکه من متغیرها رو اینطوری با یک معرف و جلو هم با کاما ودر آخر سمی کالن تعریف کنم مشکلی داره؟:

    ;char a=0,b=0, ... c=0,d=0
    یا حتما باید این شکلی باشه:
    ;char a=0;char b=0;char c=0
    اینجا کاما ها و سمی کالن ها برا من که زیاد خوانا نمایش داده نمیشه ... در مدل دوم بین هر عبارت یک سمی کالنه ، به هر کدام از حالات فوق میشه نوشت و برنامه ایرادی نمیگیره من مثل مدل اول تعریف کردم همه رو


    1- محددیتی در تعریف تعداد متغیر محلی در تابع اصلی یا تعداد خط کد با توجه به اطلاعات فوق وجود داره؟
    2- چطور میشه با دیباگ kEIL فهمید مشکل از کجاست حقیقت حرفه ای نیستم و با Keil تازه شروع کردم.
    فایل .map رو نتونستم ارسال کنم اینجا کسی خواست بفرماد براش بفرستم.
    سپاس
    جدیدترین ویرایش توسط m.aziz; ۱۰:۰۹ ۱۴۰۱/۰۹/۳۰.

    #2
    پاسخ : هنگ میکرو پس از تعریف متغیر محلی

    قابلیت ssa کامپایلرت پیش فرض فعاله ... این مشکل هم با ssa وقتی که ساختارش رو درست رعایت نکنیم بوجود میاد .


    برای اطلاعات بیشتر در مورد ssa

    دیدگاه


      #3
      پاسخ : هنگ میکرو پس از تعریف متغیر محلی

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

      دیدگاه


        #4
        پاسخ : هنگ میکرو پس از تعریف متغیر محلی

        دوست عزیز موضوعی که اشاره شد مربوط به بهینه سازی هایی هست که کامپایلر در لایه های آخر کامپایل ایجاد میکنه .
        شما یکبار تمام optimization ها رو غیر فعال کن ببین بازهم همین مشکل بوجود میاد یانه .
        ( کامپایلرها چیزی که ایجاد میکنن با فعال بودن بهینه سازی الزاما ارتباطی به کد شما نداره )

        نهایتا اگر مطمئنید روند های ۱۱ لایه بهینه سازی و ساختارشون رو رعایت کردید ؛

        یک بخش کوچک از main و یک روتین یا فانکشن ( بعنوان نمونه ) که حین فراخوانی دچار مشکل با متغیر محلی میشه رو قرار بدید شاید روند کلی فراخوانی اتون مشکل داره .
        جدیدترین ویرایش توسط Amie.s.m; ۱۷:۳۳ ۱۴۰۱/۱۰/۰۱.

        دیدگاه


          #5
          پاسخ : هنگ میکرو پس از تعریف متغیر محلی

          سلام مجدد
          امی جان الان به کدها تا چند روز آینده که از سفری که لحظاتی دیگه در پیشه انشا... برگردم دسترسی ندارم اما تو word شبیه بهش رو پیاده کردم اینه:

          از لحاظ SSA و مرز قلمروی اجرا در شروط مشکلی داره بنظرت؟این نوع یکبار اجرا کردن کد رو بارها در خطوط بالاتر انجام دادم مشابه همین و مشکلی نبود.
          اینم عکس تنظیمات برنامه در تب C:

          سپاس از همراهیت
          جدیدترین ویرایش توسط m.aziz; ۱۸:۵۲ ۱۴۰۱/۱۰/۰۱.

          دیدگاه


            #6
            پاسخ : هنگ میکرو پس از تعریف متغیر محلی

            خواهش

            دوست عزیز شبه کد یا الگوریتم زیاد بدرد عیب یابی نمیخوره بخصوص که شما اینجا اینتراپت هم داری و ظاهرا تایمرت مقادیر متفیر time-counter رو تغییر میده .
            در سیستم ssa مقادیر متغیرها حین فراخوانی توابع و زیر برنامه ها نباید به شکل خارجی تغییر کنه .
            و چون بصورت کلی تا اونجایی که من از شبه کد شما متوجه شدم مثل خیلی کیسهای دیگه مشابه از volatile قبل از نام متغیر استفاده نکردی به محظ فعال شدن بهینه سازی کامپایلر ( که در تنظیمات شما فعاله و لول 3 هستش ) روند اجرا دچار اشکال میشه . در معادل اسمبلی اش نگاه کنی کامپایلر با فرض اینکه متغیرهای شما مقدار دهی اولیه شدن وضعیت این نوع متغیرها رو در حلقه دیگه چک نمیکنه و با مقدار پیش فرض جایگزینش میکنه .

            با volatile نحوه ترجمه برنامه نوشته شده توسط کامپایلر تغییر میکنه ... هیچ فضایی هم از رم یا فلش اشغال نمیکنه .
            هرجا رجیستر ، متغیر و مشابهاتش ممکنه به شکل پیش بینی نشده ( در اینتراپت ها بلا استثنا این اتفاق میفته ) تغییر کنه باید پیشوند volatile قبل از نام متغیر و اشاره گر و رجیستر بیاد .

            در تنظیمات کامپایلر همونطور که قبلا گفته شد اگر بهینه سازی رو غیر فعال کنید ( بخش optimization رو صفر بگذارید ... کیل تا ۱۱ مرحله بهینه سازی داره ) به احتمال زیاد مشکلتون رفع میشد ... که البته به معنی درست بودن روند برنامه نویسی نیست ، برای دیباگ کردن کاربرد داره .

            دیدگاه


              #7
              پاسخ : هنگ میکرو پس از تعریف متغیر محلی

              بله درسته، متاسفانه به کد دسترسی ندارم از ظهر به اینور، وگرنه فایل میفرستادم و گزینه بهینه سازی رو تغییر میدادم ، این عکسه هم که ارسال کردم از برنامه keil دیگست چون میدونستم تنظیماتش با اون برنامه یکیه اسکرین شات کردم ، ظرف روزهای آتی که برگشتم تست میکنم و ارتباط میگیرم اینجا، تشکر
              جدیدترین ویرایش توسط m.aziz; ۲۱:۴۶ ۱۴۰۱/۱۰/۰۱.

              دیدگاه


                #8
                پاسخ : هنگ میکرو پس از تعریف متغیر محلی

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

                دیدگاه

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