اطلاعیه

Collapse
No announcement yet.

ریست شدن میکرو

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

    #16
    پاسخ : ریست شدن میکرو

    نوشته اصلی توسط امیر . م
    بنا به فرمایش شما کلا بحث Stack Overflow منتفی میشه. درسته؟؟؟؟ oo:
    البته که شما در رابطه با سرریز متغییر صحبت کردید که با سرریز پشته قدری متفاوت است.
    درضمن وقتی شما با یک زبان سطح بالا برنامه نویسی میکنید ، خود کامپایلر مقداری از sram را به عنوان پشته میگیرد و با سرریز آن به شما خطا میدهد . پس این امکان هم وجود ندارد
    راه اندازي ماژول 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 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
    انشالله به زودي تاپيک ها به روز رساني خواهد شد،

    دیدگاه


      #17
      پاسخ : ریست شدن میکرو

      فرض بگیریم که کامپایلر اعلام کند که مقدار پشته x بایت تخمین زده میشود.
      اگر محل قرارگیری ماتریس فرضی ما نزدیک محل قرارگیری پشته باشد و شما تعدادی بایت بیشتر از تعداد بایت درنظر گرفته شده برای آن ماتریس مقدار دهی کنید ، آیا مقادیر موجود در پشته تغییر نمیکنه ؟ و اگر این مقادیر تغییر کنه ایا بخشی از آدرسهای ذخیره شده در پشته با مقادیر بی ربط ما جایگزین نمیشه؟ بعد حتما میکرو کار خودش رو به درستی ادامه میده. نه؟

      دیدگاه


        #18
        پاسخ : ریست شدن میکرو

        نوشته اصلی توسط امیر . م
        فرض بگیریم که کامپایلر اعلام کند که مقدار پشته x بایت تخمین زده میشود.
        اگر محل قرارگیری ماتریس فرضی ما نزدیک محل قرارگیری پشته باشد و شما تعدادی بایت بیشتر از تعداد بایت درنظر گرفته شده برای آن ماتریس مقدار دهی کنید ، آیا مقادیر موجود در پشته تغییر نمیکنه ؟ و اگر این مقادیر تغییر کنه ایا بخشی از آدرسهای ذخیره شده در پشته با مقادیر بی ربط ما جایگزین نمیشه؟ بعد حتما میکرو کار خودش رو به درستی ادامه میده. نه؟
        باز هم این مربوط به سرریز پشته نمیشود . در اکثر کامپایلرها چون کامپایلر از مقدار پشته باخبر است ( x بایت ) و جای پشته آخر sram است پس درصورتی که شما بخواهید مقداری را در x بایت آخر sram قرار دهید ، کامپایلر به شما خطا میدهد .
        درضمن انجمن جایی برای اشتراک آموخته هاست و برای کل کل کردن مناسب نیست.(چون نه شما از همه چیز اطلاع دارید نه من و به همین دلیل است که میگم باید آموخته هامون رو به اشتراک بگذاریم تا دانشمون کاملتر شود.)
        بعد حتما میکرو کار خودش رو به درستی ادامه میده. نه؟
        راه اندازي ماژول 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 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
        انشالله به زودي تاپيک ها به روز رساني خواهد شد،

        دیدگاه


          #19
          پاسخ : ریست شدن میکرو

          راستی اشتباه برداشت نشه منظورم از اینکه کامپایلر خطا میده ، خطا در زمان کامپایل است و با خطا در زمان اجرا (که ریست شدن میکرو مصداق یک خطا در زمان اجراست) متفاوت است
          راه اندازي ماژول 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 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
          انشالله به زودي تاپيک ها به روز رساني خواهد شد،

          دیدگاه


            #20
            پاسخ : پاسخ : ریست شدن میکرو

            حق با شماست که اینجا جای کل کل نیست و از این بابت عذر میخوام. اما ببینید کامپایلر نمیتونه تمــــــام شرایط رو پیش بینی کنه. اگر دقت کنید تو فایل map همیشه میزنه مقدار تخمینی پشته ، نمیزنه مقدار دقیق پشته .
            کما اینکه شما هستید که مقدار RStack , CStack رو تعیید میکنید ، نه کامپایلر. پس اگر میزان پشته رو شما کم یا لب مرزی تعیید کنید احتمال Stack Overflow زیاد میشه و این مساله اجتناب ناپذیره. من نمیدونم چرا شما اینجوری جبهه گرفتین که StackOverflow باعث خرابکاری و در خیلی مواقع ریست شدن نمیشه.
            در ضمن کامپایلر موقعی که تعداد بایتی بیشتر از اندازه ماتریست استفاده کنی خطا نمیده ، چون من خودم وقتی که میخواستم تو مدل حافظه Large یه ماتریس به اندازه 50 کیلو بگیرم و نشد ، اومدم دو تا ماتریس که یکی 32 کیلو و بعدی 20 کیلو بود رو پشت سر هم گرفتم و تو اولی تا 50 کیلو کار کردم. بدون اینکه کامپایلر خطا و یا حتی warning بده.
            این برنامه نویسه که باید حواسش جمع باشه نه کامپایلر.

            دیدگاه


              #21
              پاسخ : ریست شدن میکرو

              جناب RubeuS
              من فکر میکنم این فقط یه موضوع ساده هستش که یه نفر از بین شما دوتا داره اشتباه میکنه(یا شما یا امیر) و به نظرم باید این موضوع معلوم بشه که کی درست میگه. بنابر این فکر کنم بهتر هستش که ادامه بدین. خدایی نکرده کسی که نمی خواد کسی دیگه رو اذیت کنه یا خیتش کنه. فقط باید جواب معلوم بشه تا مثلا یه نفر بی سواد و آماتور مثل من بدونه که دقیقا جواب چیه.
              و در مورد آقا امیر هم باید بگم که ایشون یکی از افراد با سواد و تاپ اینجا هستن. خصوصا شهرت ایشون مربوط به کامپایلر قدرتمند IAR میشه که نشون میده ایشون یه فرد آماتور و ساده مثل من نیست. ایشون نخواست خدایی نکرده توهین کنه. خلاصه آقا باید بگم که اتفاقا همین جر و بحث های علمی خوبه! تا باشه از این جر و بحث ها! :nerd:

              دیدگاه


                #22
                پاسخ : پاسخ : ریست شدن میکرو

                نوشته اصلی توسط امیر . م
                حق با شماست که اینجا جای کل کل نیست و از این بابت عذر میخوام. اما ببینید کامپایلر نمیتونه تمــــــام شرایط رو پیش بینی کنه. اگر دقت کنید تو فایل map همیشه میزنه مقدار تخمینی پشته ، نمیزنه مقدار دقیق پشته .
                کما اینکه شما هستید که مقدار RStack , CStack رو تعیید میکنید ، نه کامپایلر. پس اگر میزان پشته رو شما کم یا لب مرزی تعیید کنید احتمال Stack Overflow زیاد میشه و این مساله اجتناب ناپذیره. من نمیدونم چرا شما اینجوری جبهه گرفتین که StackOverflow باعث خرابکاری و در خیلی مواقع ریست شدن نمیشه.
                در ضمن کامپایلر موقعی که تعداد بایتی بیشتر از اندازه ماتریست استفاده کنی خطا نمیده ، چون من خودم وقتی که میخواستم تو مدل حافظه Large یه ماتریس به اندازه 50 کیلو بگیرم و نشد ، اومدم دو تا ماتریس که یکی 32 کیلو و بعدی 20 کیلو بود رو پشت سر هم گرفتم و تو اولی تا 50 کیلو کار کردم. بدون اینکه کامپایلر خطا و یا حتی warning بده.
                این برنامه نویسه که باید حواسش جمع باشه نه کامپایلر.
                خواهش میکنم

                این مساله خیلی برام جالب بود به خاطر همین برای تست رو کامپایلر کدویژن ، کدهای زیر رو زدم و کامپایل کردم و همچنین دونه دونه دستورات ماشینش رو چک کردم :read: ،که به مساله جالبی برخوردم و اینکه بله کدویژن اصلا ایرادی در قبال نوشتن و دسترسی مستقیم ما به پشته نمیگیرد :eek: و اگر ما تصادفا در جایی از پشته دست ببریم و تغییرش بدیم دو حالت بوجود می آید:
                1- بعد از return از تابعی که آدرس بازگشت call اون رو دستبردیم به جایی که برنامه داخلش نوشتیم پرش کنیم ، که از اونجا برنامه مون اجرا و ادامه پیدا میکنه که باعث ریست شدن نمیشه.
                2- بعد از return از تابعی که آدرس بازگشت call اون رو دستبردیم به جایی که برنامه داخلش ننوشتیم پرش کنیم ، چون در حالت عادی مقدار هگز اون قسمتهای از فلش که برنامه داخلش نیست 0xFFFF است ،پردازنده به یک invalide opcode بر میخورد که فکر میکنم در این حالت ریست میکند.

                این هم تست در کدویژن:
                کد:
                void f()
                {
                  char *p;
                  p=(char *)0x85F;
                  *p=0xaa;
                  #asm("NOP")
                  #asm("in r0,$3D")   //r0<---SPL
                  #asm("out $15,r0")   //PORTC<---r0
                  #asm("in r0,$3E")   //r0<---SPH
                  #asm("out $12,r0")   //PORTD<---r0
                  #asm("NOP")
                }
                void main()
                { 
                  #asm("in r0,$3D")   //r0<---SPL
                  #asm("out $1B,r0")   //PORTA<---r0
                  #asm("in r0,$3E")   //r0<---SPH
                  #asm("out $18,r0")   //PORTB<---r0
                  f();
                
                }
                جالبیش اینه که در حالت اولیه کدویژن مقدار sp که بالای پشته ( top of stack) اشاره میکند را خانه آخر حافظه sram میگیرد یعنی در حالت اولیه sp=0x085F است(مراجعه شود به صفحه 15 دیتاشیت مگا32) که مقدار دسیمال آن برابر 2143 است که من قبلا فکر میکردم کلا sram دارای 2048 خانه است ولی در اصل sram دارای 2048 خانه مفید برای متغییر هاست که stack هم جز این 2048 خانه میشود. :nice:

                البته نمیشه گفت مشکل کامپایلره ، و در اصل مقایسه من یعنی برنامه نویسی روی avr و برنامه نویسی روی پردازنده های دیگه که قابلیت نصب سیستم عامل دارند و دارای حالات کاربر سرپرست هستند، اشتباه است چون سیستم عامل از این دسترسی ها جلوگیری میکند و exception می دهد، نه کامپایلر.

                ممنون از تذکرتون ، البته فکر میکنم این دوستمون که تاپیک رو زدن تا الان مشکلشون حل شده :mrgreen:

                البته من منظورتونو از CStack و RStack متوجه نشدم. ( C و R مخفف چی هستند؟ )

                در ضمن یک چیزی اصلا تو کتم نمیره و اون هم مشخص کردن مقدار stack در کامپایلره که با این اوصاف که گفتم اصلا این کار یک عمل بیهوده است(همین مشخص کردن منو به این اشتباه انداخت که میتونه کامپایلر مانع دسترسی به حافظه پشته شود. در حالت دیفالت در کد ویژن زمانی که در صفحه کانفیگ چیپ مگا 32 رو انتخاب می کنیم کامپایلر مقدار 512 بایت را پیشنهاد میدهد که قادر به تغییر اون بین 8 تا 2040 بایت هستیم)
                البته حدس من بر این است که در زمان کامپایل اگر احیانا خدای نکرده مقدار رجیستر sp از مقدار 2143 منهای StackSize کمتر شد کامپایلر بفهمه و وارنینگ بده. پس اگر چنین باشد پس سرریز پشته باعث وارنینگ میشود و مشکل ریست شدن ایشون نمیتونه به خاطر سرریز پشته باشد (چون بشون وارنینگ میداد و بلاخره میفهمید یه جا برنامش میلنگه)
                راه اندازي ماژول 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 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                دیدگاه


                  #23
                  پاسخ : ریست شدن میکرو

                  البته اینم بگم که من بارها و بارها درون همین ویندوز خودمون خواستم با سی در جایی که نباید دستکاری کنم،دستکاری کنم. که به مرور زمان با بالا رفتن ورژن های سیستم عامل بهتر از اینکار مقابله میشه. البته نوشتن درون پشته سیستمی فقط آدرس های return های فرآیند خودمون رو خراب میکنه چون با پراسس سویچ (process switch) محتویات پشته درون PCB خود همون فرایند ذخیره میشه.

                  که اگر بخواهید جایی که اختیارش رو نداریم دست ببریم ارور میده و نمیزاره (البته میشه دورش زد :mrgreen ولی بعدش یک ارور به محتوی فوش ناموسی میده و کلا هنگ میکنه :icon_razz: :mrgreen:
                  راه اندازي ماژول 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 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                  انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                  دیدگاه


                    #24
                    پاسخ : ریست شدن میکرو

                    آقای rozeh عزیز شما لطف دارین ولی مطمئن باشید من خیــــــــــلی کمتر از اونی که شما فکر میکنید بلدم و قطعا شکسته بندی و این نیست. مطمئن باشید.

                    و اما برسیم سروقت Rubeus عزیز :twisted:
                    من تو مشخصاتتون دیدم که دانشجوی کامپیوتر هستید . حدس زدم که احیانا میکروی ناچیز ما رو دارین با پردازنده های ARM و کامپیوتر ها مقایسه میکنید.
                    من چند سالی میشه که کد ویژن کار نمیکنم. نمیخوام کامپایلر خوبی نیست یا ضعیفه یا ... .چون با XMega کار میکردم و مقدار رمی که میخواستم بیشتر از 64 کیلو بود مجبور شدم برم سراغ IAR که تنها گزینه من برای این کار بود. چون پوینتر آدرسش 24 بیتی هست و صد البته که این تغییر دو صد خشنود هستم :nerd: به قول شاعر که میگه :
                    خمیر مایه دکان شیشه گری سنگ است عدو شود سبب خیر اگر خدا خواهد

                    توی IAR ، دو فضا غیر از فضای داده داریم. یکی RSTACK یا همان Return Stack که آدرسهای برگشت توابع در اون ریخته میشه و دیگری Code Stack یا CSTACK که یکسری از متغیرها مثل متغیرهای local و static در اون ذخیره میشن.

                    دیدگاه


                      #25
                      پاسخ : ریست شدن میکرو

                      نوشته اصلی توسط امیر . م
                      آقای rozeh عزیز شما لطف دارین ولی مطمئن باشید من خیــــــــــلی کمتر از اونی که شما فکر میکنید بلدم و قطعا شکسته بندی و این نیست. مطمئن باشید.

                      و اما برسیم سروقت Rubeus عزیز :twisted:
                      من تو مشخصاتتون دیدم که دانشجوی کامپیوتر هستید . حدس زدم که احیانا میکروی ناچیز ما رو دارین با پردازنده های ARM و کامپیوتر ها مقایسه میکنید.
                      من چند سالی میشه که کد ویژن کار نمیکنم. نمیخوام کامپایلر خوبی نیست یا ضعیفه یا ... .چون با XMega کار میکردم و مقدار رمی که میخواستم بیشتر از 64 کیلو بود مجبور شدم برم سراغ IAR که تنها گزینه من برای این کار بود. چون پوینتر آدرسش 24 بیتی هست و صد البته که این تغییر دو صد خشنود هستم :nerd: به قول شاعر که میگه :
                      خمیر مایه دکان شیشه گری سنگ است عدو شود سبب خیر اگر خدا خواهد

                      توی IAR ، دو فضا غیر از فضای داده داریم. یکی RSTACK یا همان Return Stack که آدرسهای برگشت توابع در اون ریخته میشه و دیگری Code Stack یا CSTACK که یکسری از متغیرها مثل متغیرهای local و static در اون ذخیره میشن.
                      میتونم بپرسم تفاوت عمده و اصلی IAR و کدویژن چیه؟
                      (زبانشون که هر دو سی هست . میمونه یکسری کتابخونه که اصلیش یک کتاب خونه برای شناسوندن آدرس ثبات ها و یک سری دیفاین های اصلیه و مثلا شناسوندن روتین وقفه خاص تا کامپایلر کدهاش رو بریزه در جای مناسب.) تو این موارد چه فرقی باهم دارن؟اطلاع دارید با GCC یا winavr چه فرقی دارن؟ :question:
                      دلیلش چیه که میگید کوچ کردن از کدویژن به iar براتون خیر بوده ؟(البته شنیدم کدهای آبتیمایزشده ی بهتری تولید میکنه :agree: ولی غیر اون خصوصیت دیگه ای داره؟)

                      درضمن من آشنایی چندانی با IAR ندارم ،این کامپایلر دارای IDE خاصی است؟ تو چه محیطی کد براش مینویسید.

                      راه اندازي ماژول 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 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                      انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                      دیدگاه


                        #26
                        پاسخ : ریست شدن میکرو

                        برای توضیحات در مورد IAR میتونی به این دو تاپیک مراجعه کنی و اونجا از مطالبی که دوستان مخصوصا استاد کی نژاد مطرح کردن استفاده کنی :
                        http://www.eca.ir/forum2/index.php?topic=41476.0
                        http://www.eca.ir/forum2/index.php?topic=50648.0

                        برای دانلود آخرین ورژن IAR هم میتونی به آدرس زیر بری (برو به پاسخ 32)
                        http://www.eca.ir/forum2/index.php?topic=52164.30

                        در مورد GCC یا همون WinAVR هم تاپیک جامعی هست :
                        http://www.eca.ir/forum2/index.php?topic=41050.0

                        IAR یه کامپایلر پولی هست و حدود 3 میلیون اگر اشتباه نکنم قیمتش هست. اما AVRGCC مجانی و OpenSource هست.بزرگان از نظر قدرت برنامه نویسی و حجم کد و سرعت کد و بهینه سازی اون اول IAR بعد GCC و اون آخر آخرا :whistling هم CodeVision.(البته کامپایلرهای دیگه ای هم مثل MiKroC ویا ImageCraft و چند تا دیگه هم هستند اما بیشتر از اینا تو ایران استقبال شده. حالا چرا نمیدونم)

                        یکی از بزرگترین مزیتهای IAR قابلیت برنامه نویسی به زبان ++C هست.

                        دیدگاه


                          #27
                          پاسخ : ریست شدن میکرو

                          دوستان مثل اینکه از موضوع اصلی خارج شدیم
                          هنوز مشکل پا برجاست.
                          چه عوامل نرم افزاری-برنامه نویسی-باعث هنگ کردن و ریست میکرو میشه؟ :angry:

                          مثلا من چند سال پیش با ATmega64 یک مشکل داشتم و آن این بود که هنگامی که یک رله را فعال می کرد باید یک عبارتی را روی ال سی دی کاراکتری نشان می داد و گاهی وقتها همین جا هنگ می کرد.برای برنامه نویسی از کدویژن استفاده کرده بودم و برای راه اندازی ال سی دی از کتابخا نه کدویژن.
                          با یک تغییر کوچک در کتابخانه ال سی دی کدوِیژن مشکل حل شد. :nerd:

                          دیدگاه


                            #28
                            پاسخ : ریست شدن میکرو

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

                            دیدگاه


                              #29
                              پاسخ : ریست شدن میکرو

                              نوشته اصلی توسط Mr.X
                              دوستان مثل اینکه از موضوع اصلی خارج شدیم
                              هنوز مشکل پا برجاست.
                              چه عوامل نرم افزاری-برنامه نویسی-باعث هنگ کردن و ریست میکرو میشه؟ :angry:
                              من و دوست عزیزمون Rubeus این همه راحجع بهش توضیح دادیم بعد شما میگید بحث از مسیرش خارج شد و عوامل هنگ و ریست میکرو چیه!!!!! :eek:

                              دیدگاه


                                #30
                                پاسخ : ریست شدن میکرو

                                نوشته اصلی توسط امیر . م
                                شما رله رو چجوری درایو میکردی؟ به احتمال خیلی زیاد دو سر بوبین رله دیود نمیزاشتی. درسته؟ چون اگر رله درست درایو بشه باعث هنگ میکرو نمیشه.
                                دیود داشت اما چون بعدش یک تاخیر 500 میلی ثانیه با دستور delay بود و در کتابخانه ال سی دی یک جایی میکرو باید منتظر دریافت سیگنال از ال سی دی می ماند این اتفاق می افتاد
                                البته این موضوع ما چند سال پیشه الان سالهاست از کدویژن استفاده نمی کنم.

                                دیدگاه

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