اطلاعیه

Collapse
No announcement yet.

سوال مدیریت حافظه

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

    #16
    پاسخ : سوال مدیریت حافظه

    یک سوال،
    شما چرا میخواین کد رو از روی رم اجرا کنید؟به نظر من اگه سرعت براتون مهمه برین سراغ LPC1768/1769
    میشه داخل keil شبیه سازیش کرد.
    کامپایلر نویسی برای ARM هم کار راحتی نیست. اگه میخواین تاخیر ها برداشته بشن به نظرم داخل فایل تنظیمات پروژه تو Keil میشه اونارو تنظیم کرد ( برای ١٧٦٨ میشد)

    دیدگاه


      #17
      پاسخ : پاسخ : سوال مدیریت حافظه

      نوشته اصلی توسط PLASMA
      یک سوال،
      شما چرا میخواین کد رو از روی رم اجرا کنید؟به نظر من اگه سرعت براتون مهمه برین سراغ LPC1768/1769
      میشه داخل keil شبیه سازیش کرد.
      کامپایلر نویسی برای ARM هم کار راحتی نیست. اگه میخواین تاخیر ها برداشته بشن به نظرم داخل فایل تنظیمات پروژه تو Keil میشه اونارو تنظیم کرد ( برای ١٧٦٨ میشد)
      من این همه توضیح دادم چر می خوام برنامه رو از توی رم اجرا کنم. 3-4 پاراگراف بیشتر توضیح دادم.
      این که شما میگی برم از میکرو lpc1768 استفاده کنم مثل اینه که یک نفر می خواد یک موتور رو تعمیر کنه یکی بیاد بگه بورو یکی جدید بگیر.
      سرعت lpc1768 که خیلی بیشتر از lpc2103 نیست. قیمتشم 2-3 برابره.
      من نمی خوام از lpc2103 یک lpc1768 بسازم. می خوام هر میکرویی که کار می کنم از حداکثر توانش استفاده کنم.
      منظور شماا رو نفهمیدم از این که می گید lpc1768 قابل شبیه سازیه. خوب همه میکروکنترل های سری NXP در keil قابل شبیه سازی هستن.
      من که نگفتم می خوام کامپایلر بنویسم. گفتم نیاز به کامپایلر نویسی داره و من این کارو نمی کنم.

      می شه در مورد برداشتن تاخیر خوندن از فلش در تنظیمات پروژه یک توضیحی بدین؟

      دیدگاه


        #18
        پاسخ : سوال مدیریت حافظه

        سرعت میکرو فقط به مگاهرتز نیست و به دستور العمل هایی که در ثانیه اجرا میکنه هم بستگی داره. اگه اشتباه نکنم
        این عدد تو آرم ٧ برابر ٠/٩ و در کورتکس ام٣ برابر ١.٢٥ هستش (به میلیون)
        من به خاطر این گفتم که این میکرو منسوخ شده. البته با این حال هنوز به اندازه کافی (شاید 10 سال) تو بازار هست ولی با این حال دلتون نمیخواد که با آخرین دستاورد های آرم کار کنید؟ ولی باز میل خودتونه
        تو فایل استارت پ یه سری تنظیمات هست که اون جا میتونید تنظیم کنید، البته برای این میکرو رو نمیدونم.
        برای بوت شدن از روی رم فقط مشکل محدودیت حافظه دارین، یعنی برای این که یک برنامه 32 کیلویی رو بخواین اجرا کنید باید چند بار کد رو کپی کنید و این مشکل سازه. پیشنهاد من اینه که فعلا تاخیر ها رو بیخیال بشین و تمرکزتون رو بذارین رو لود کردن کد از رم،
        بعد میتونید رو تاخیر ها هم کار کنید. منم میخوام همین کار شما رو انجام بدم و یک بوتلودر مثل UBoot بنویسم که کد رو مثلا از کارت حافظه (sd) روی اس دی رم لود کنه و ازش بوت بشه و چون میخوام با سخت افزار درگیر نشم با 1768 و حافظه داخلی انجامش بدم.

        دیدگاه


          #19
          پاسخ : پاسخ : سوال مدیریت حافظه

          نوشته اصلی توسط PLASMA
          سرعت میکرو فقط به مگاهرتز نیست و به دستور العمل هایی که در ثانیه اجرا میکنه هم بستگی داره. اگه اشتباه نکنم
          این عدد تو آرم ٧ برابر ٠/٩ و در کورتکس ام٣ برابر ١.٢٥ هستش (به میلیون)
          من به خاطر این گفتم که این میکرو منسوخ شده. البته با این حال هنوز به اندازه کافی (شاید 10 سال) تو بازار هست ولی با این حال دلتون نمیخواد که با آخرین دستاورد های آرم کار کنید؟ ولی باز میل خودتونه
          بله خودم مطلع هستم که سرعت پردازش به چی بستگی داره. اگه نمی دونستم که اینهمه زور نمی زدم کد برنامه تو رم اجرا بشه.
          شما نگران نباش منسوخ نمی شه. هرچیزی کاربرد خودشو داره. این میکرو در سری پردازنده های 32 بیتی از قیمت و کارایی خوبی برخورداره و فقط وقتی ممکنه منسوخ بشه که یک تکنیک جدید یا پردازنده های مثلا 64 بیتی یا 48 بیتی تو این فاز و قیمت بیان بازار.
          کی گفته میکروکنترلر های 8 بیتی منسوخ شدن؟
          اگر کسی تونست یک میکروکنترلر 2 هزار تومنی(البته الان قیمتشو نمی دونم) 32 بیتی یا به بالا بریاره اونوقت میکروهای 8 بیتی منسوخ شدن.
          با میکرو های 8 بیتی می شه چیزایی ساخت که خیلی ارزون در بیان و کارایی مورد نطر رو هم داشته باشن.
          هرچیزی جای خودش ارزشمنده.
          در ضمن من می خوام بعدا رو 1768 هم کار کنم فعلان می خوام از مزیت شبیه ساز proteus و lpc2103 استفاده کنم و تکنیک های مختلف قابل اجرا رو تست کنم.

          نوشته اصلی توسط PLASMA
          تو فایل استارت پ یه سری تنظیمات هست که اون جا میتونید تنظیم کنید، البته برای این میکرو رو نمیدونم.
          برای بوت شدن از روی رم فقط مشکل محدودیت حافظه دارین، یعنی برای این که یک برنامه 32 کیلویی رو بخواین اجرا کنید باید چند بار کد رو کپی کنید و این مشکل سازه. پیشنهاد من اینه که فعلا تاخیر ها رو بیخیال بشین و تمرکزتون رو بذارین رو لود کردن کد از رم،
          بعد میتونید رو تاخیر ها هم کار کنید. منم میخوام همین کار شما رو انجام بدم و یک بوتلودر مثل UBoot بنویسم که کد رو مثلا از کارت حافظه (sd) روی اس دی رم لود کنه و ازش بوت بشه و چون میخوام با سخت افزار درگیر نشم با 1768 و حافظه داخلی انجامش بدم.
          منم دقیقا می خوام همین کارو کنم.
          اولا که باید از ترجمه کد به صورت thumb استفاده کرد که حجم حافظه خیلی کمتری اشغال میشه.
          دوما شاید بشه به جای کل برنامه فقط بخشی رو به رم ببریم. این که بیایم چند بار کد و در برنامه از فلش بریزیم تو رم فقط سرعت رو کاهش می ده بجاش باید فقط بخشی که بیشتر اجرا می شه مثل توابع پرکاربرد رو به رم برد. توابع ریاضی یا گرافیکی یا ارتباطی از این دسته می شن.

          من اصلا نمی دونم دقیقا بوت لودر چیه. همون startup هستش؟
          چه نیازی به بوت لودر هست برای اجرای برنامه روی رم؟ فقط ما کافیه بدونیم کد برناممون از کجا تا کجاست و بریزیمش توی رم و خط برنامه رو ببریم اونجا.
          که من همین 2 مورد رو نمی دونم چه طور بفهمیم برنامه کجاست و چه طور خط برنامه رو ببریم رو رم. البته با اسمبلی باید راحت باشه. من دقیقا نمی دونم این کد اسمبلی رو چه طور بنویسم.
          ولی من دیدم کد تولید شده توسط keil برای متغیر های موجود در ram و flash خیلی فرق می کرد.

          دیدگاه


            #20
            پاسخ : سوال مدیریت حافظه

            یافتم یافتم.... :wow: :wow: :wow: :wow: :wow: :wow:
            برای انداختن کد برنامه رو یک موقعیت خاص باید از همون نحوه فراخوانی تابع با اشاره گر استفاده کنید. :nice:
            یک نمونه ساده رو اینجا می زارم:
            () (*(void (*)()(0x00000555))
            خیلی ساده اول آدرس رو cast می کنیم به () (*) void و بعد آدرس خط برنامه داخل این pointer رو با دستور () (p*) اجرا می کنیم. این پرانتز خالی به خاطر اینه که کامپایلر انتظار یک تابع داره با ورودی و خروجی ولی ما خالی میزاریم.
            وقتی کد ماشین تولید شده رو دیدم از دستور BX با ریجیستر R0 ترجمه کرده بود که دقیقا همون چیزیه که لازم داریم.

            ولی افسوس که فقط در کدینگ ARM کار می کنه و هرجور با Thumb 16 می نویسم کار نمی کنه. :cry2:
            تو حالت thumb یک چیز دیگه ترجمه می کنه. یک دستور اجقوجق. اونطور که دیدم کامپایلر یک چیزایی فهمیده بود. مثلا نوشته :
            __ARM_common_call_via_r0_(0x00000360) - part #1
            __ARM_common_call_via_r0_(0x00000360) - part #2

            و بعدش می ره تو یک لیست کد های ARM32 که به کد BX با ریجیستر r0 می رسه و این ریجیستر هم درست عمل می کنه و مارو می بره رو خط مورد نظر که اینجا 0x00000555 هستش. ولی وقتی رو این خط می رسه همه دستوراتو غاطی می کنه و غلط غولوط ترجمه می کنه. :sad:
            اونطور که دیدم بعد از این که ارجاع داده می شه به یک کد ARM32 از اونجا به بعد همه برنامه رو ARM32 تر جمه می کنه در صورتی که برنامه thum16 هستش. نمی دونم چرا ولی شاید شرکت NXP یا ARM تا بحال همچین چیزی به نظرشون نرسیده بود. یک باگ عظیم هست. شایدم مشکل از keil باشه.
            شایدم فقط میکروی lpc21xx اینطوری باشن.

            حالا من اومدم برنامه رو در ARM MODE با دیباگر trace keil راه انداختم دیدم نقطه شروع مورد نظرم خط چنده و با این دستور یک حلقه ساختم. البته این حلقه 3 کلاک می گیره در مقابل while که 1 کلاک می گیره.
            من یک برنامه هم نوشتم از heap 0 0x400 تا بایت گرفتم و کد های برنامه رو از همون جایی که تابع main اجرا می شد تا آخر جایی که مال برنامه نوشته شده توسط منه رو کپی کردم تو همون آدرس داخل heap بعد هم متغییر flag که گلوبال هستش رو 1 کردم که این بخش دوبره اجرا نشه و خط برنامه رو انداختم رو همون آدرس داده شده توسط malloc ولی خطوط رو برام اجرا نکرد و error زیر رو داد:
            access violation at 0x400000040 : no execute/read premition
            تمام خطوط برنامه در شبیه ساز keil درست فرستاده شدند. البته تو شبیه ساز proteus غلط فرستاده شدند.
            یعنی چی!!!!!!!!
            اینم source برنامه:
            http://www.parsgig.com/f/Kp2B9

            دیدگاه


              #21
              پاسخ : سوال مدیریت حافظه

              خدارو شکر!
              مثل این که این کار تو کایل پیش بینی شده (البته فقط برای توابع خود پروژه جواب میده)
              The RamFunction program demonstrates how to define a function that
              executes in RAM. This may be useful for IAP Flash programming or to
              improve to the performance with slow external Flash devices.
              شاید این به دردتون بخوره:
              http://infocenter.arm.com/help/index...s/ka11306.html
              من امتحان کردم و جواب میده
              راستی من تا این جا تونستم که مثل بوتلودر خود NXP آدرس شروع برنامه رو تغییر بدم و با بوتلودر به آدرسش پرش کنم (البته بیشترش رو از رو بوتلودر انجام دادم)

              دیدگاه


                #22
                پاسخ : سوال مدیریت حافظه

                ---
                اگر روزی بفهمی همه چیزایی که از بچگی تا حالا بهت گفتن بی اساس یا دروغه چه حالی میشی؟
                کارمندان نابکار، از دزدان و آشوبگران بیشتر به کشور آسیب میآ‌رسانند

                دیدگاه


                  #23
                  پاسخ : سوال مدیریت حافظه

                  نوشته اصلی توسط PLASMA
                  خدارو شکر!
                  مثل این که این کار تو کایل پیش بینی شده (البته فقط برای توابع خود پروژه جواب میده)
                  The RamFunction program demonstrates how to define a function that
                  executes in RAM. This may be useful for IAP Flash programming or to
                  improve to the performance with slow external Flash devices.
                  شاید این به دردتون بخوره:
                  http://infocenter.arm.com/help/index...s/ka11306.html
                  من امتحان کردم و جواب میده
                  بسیار ممنون. :applause: :nice:
                  این دقیقا همون چیزیه که دنبالش بودم. thumb 16 هم توش کار می کنه.
                  من کل برناممه c رو ریختم رو رم. فقط اون دکمه رو زدم که بره تو رم. از main و هر تابع دیگه.

                  چند سوال:
                  این 3 تا گزینه فرقشون چیه؟
                  code const
                  zero initialize
                  other
                  حدس می زنم منظورش از const یعنی کد برنامه که در flash قرار می گیره. ولی چرا گزینه ram داره؟! به نظرم zero initialize هم باید مقصد کد برای بارگذاری در رم باشه. وقتی هر 2 رو تعیین می کنم warning می ده:
                  no section matches pattern prj2.o(ZI

                  مشکل من اینجاست که نمی دونم چه قدر از برنامه به این رم اختصاص داده می شه؟ شاید باید هربار یک نگاهی به برنامه تولیدی بندازم ببینم چه قدر رم اشغال کرده.
                  توابع از پیش تعریف شده هدر ها مثل malloc و متاسفانه توابع ریاضی از flash اجرا می شن.
                  همینم خیر و برکته.
                  یک مسئله دیگه هم هست این که در اجرای برنامه در ram همه کدینگ به صورت thumb هستش!!! اصلا arm نمی شه.

                  مسئله شماره 1 من رو هم آقای پلاسما حل کردن
                  مسئله stack و heap رو در example های keil مطالب خوبی پیدا کردم فکر نکنم نیازی به کمک بچه های انجمن داشته باشم دیگه.


                  حالا کسی IAP بلده؟

                  دیدگاه


                    #24
                    پاسخ : سوال مدیریت حافظه

                    Const/Code منظورش کد شما هستش و چون هدف اجرا از رم هست گزینه IRAM هم داره.
                    IAP مثالش تو LPCWARE هست میتونید پیدا کنید.
                    فقط شما میدونید چجوری میشه به صورت مستقیم تو رم نوشت؟ من خیلی وقته دنبالشم (اصلا میشه؟)

                    دیدگاه


                      #25
                      پاسخ : سوال مدیریت حافظه

                      نوشته اصلی توسط Aryan_M
                      یافتم یافتم.... :wow: :wow: :wow: :wow: :wow: :wow:
                      برای انداختن کد برنامه رو یک موقعیت خاص باید از همون نحوه فراخوانی تابع با اشاره گر استفاده کنید. :nice:
                      با سلام
                      دوست عزیز این مساله به این راحتی ها که شما فکر میکنید نیست . این مساله خیلی فراتر از استفاده از اشاره گر ها است .
                      بهتون توصیه میکنم به راه حل دیگه ای فکر کنید . شما در حقیقت دارید یک سیستم عامل مینویسید که اگر دست تنها باشید ممکن چند سال مطالعه و تحقیق و تمرین لازم داشته باشه ( یک 5 سالی رو در نظر بگیر)
                      القصه
                      قبل ادامه بهتره مطالب زیر رو یک مطالعه کنید

                      1-آفست و سگمنت و صفحهآ‌بندی
                      2- حافظه مجازی‏
                      3- حافظه نهان‏
                      4- صفحهآ‌بندی محلی و صفحهآ‌بندی سراسری

                      و
                      الگوریتم جایگزینی صفحه

                      1-اخیراً استفاده نشده
                      2-الگوریتم FIFO
                      3-الگوریتم دومین شانس
                      4-الگوریتم ساعت
                      5- اخیراً کمتر استفاده شده
                      6- الگوریتم تصادفی
                      7-کمتر استفاده شده
                      8- الگوریتم سالخوردگی

                      تنها موردی که همه آدما یقین دارن خدا در حقش زیاد لطف کرده
                      داشتن عقله زیادتر از دیگر آدم ها است

                      دیدگاه


                        #26
                        پاسخ : سوال مدیریت حافظه

                        تکذیب می کنم. سرعت اونفدر تغییر نکرد. همش اشتباه چاپی بود.

                        اصلا در شیه سازی keil ـ arm و thumb سرعتشون فرقی نداره!!!!!!!!!!!!!!!

                        باید تو واقعیت تست بشن.

                        نوشته اصلی توسط PLASMA
                        Const/Code منظورش کد شما هستش و چون هدف اجرا از رم هست گزینه IRAM هم داره.
                        IAP مثالش تو LPCWARE هست میتونید پیدا کنید.
                        فقط شما میدونید چجوری میشه به صورت مستقیم تو رم نوشت؟ من خیلی وقته دنبالشم (اصلا میشه؟)
                        این که کاری نداره . فقط آدرسو داشته باش و روش بنویس. اصلا لازمم نیست heap یا stack باشه. البته نمی دونم بشه روی اطلاعات اصاصی چیزی نوشت.
                        اینم کدش:
                        (یک عددی) = ((volatile unsigned int *)(address))*
                        من قبلا با این دستور همینجوری چند بایت ریختم تو رم. چیز خاصی نیست. حالا اگر چیز مرطب خواستین هم که حتما خودتون می دونید با malloc می شه آدرس گرفت و روش نوشت.
                        با سلام
                        دوست عزیز این مساله به این راحتی ها که شما فکر میکنید نیست . این مساله خیلی فراتر از استفاده از اشاره گر ها است .
                        بهتون توصیه میکنم به راه حل دیگه ای فکر کنید . شما در حقیقت دارید یک سیستم عامل مینویسید که اگر دست تنها باشید ممکن چند سال مطالعه و تحقیق و تمرین لازم داشته باشه ( یک 5 سالی رو در نظر بگیر)
                        القصه
                        قبل ادامه بهتره مطالب زیر رو یک مطالعه کنید
                        نه من کل یک سیستم عامل کامل و پیچیده رو نمی نویسم. تا الان که بیشتر چیزایی که لازم داشتم از 5 مورد تو خود keil آماده هستن.
                        این دستور که با آدرس نوشتم دقیقا به همین راحتی بود.
                        یعنی پریدن از یک خط به خط دیگه. چیز پیچیده ای نیست . شاید سوء تفاهم شده. من همین چیز ساده رو لازم داشتم.
                        بستگی داره کامپایلر چی ترجمه کنه که در کدینگ arm برام درست ترجمه کرد و در کدینگ thumb در آخرین مرحله از jump غاطی می کنه.
                        مشکل thumb رو نمی دونم چه طور حل کنم. شاید باید کد assembly نوشت.
                        حالا که دیگه اصلا به دستور jump احتیاجی ندارم چون که خود keil برام گذاشته.

                        در مورد allocate کردن حافظه flash باید اول رو روش program کردن IAP کار کنم و بعدم خودم یک الگوریتم در حد نیازم در میارم.
                        گفتم می خوام 32kb تا حداکثر چند مگابایت رو allocate کنم.
                        همیشه لازم نیست آدم بره کلی مطالعه کنه تا الگوریتم حل مسئله رو یاد بگیره. خیلی وقتا الگوریتم مورد نیاز رو می شه با یکزره فکر بدست اورد.
                        این مطالب برای من که دانشجو برقم یکم زیاده.
                        همیشه مسائل راه حل ساده و کارآمد دارند تا این که بریم یک عالمه مطالعه کنیم.

                        دیدگاه


                          #27
                          پاسخ : سوال مدیریت حافظه

                          سلام و خسته نباشید....ماشالله خیلی حرفه ای حرف می زنید....متاسفانه من در حد و حدود شما نیستم , ولی یک مشکلی دارم . من چند وقته که کار با LPC1768 رو شروع کردم....متاسفانه نیاز دارم که چند تا متغیر رو مثل eeprom نگهداری کنم و نمیخوام از eeprom خارجی استفاده کنم....من قبلا از avr استفاده میکردم و چنین مشکلی نداشتم....کسی میتونه خیلی ساده و خلاصه با یک مثال به من یاد بده که 2 یا 3 تا متغیر رو چطوری روی فلش ذخیره کنم و یا اون رو تغییر بدم....ممنون میشم ...خدا امواتتون رو بیامرزه.....بازم ممنونم
                          << از درخت تنومند کرنش مخواه, تعظیم او با شکستنش یکیست... >>
                          www.MashhadMicro.IR

                          دیدگاه

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