اطلاعیه

Collapse
No announcement yet.

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

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

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

    با سلام
    من همین 1 هفتس شروع کردم کار با arm و از همین تاپیک ها وارسال هایی که افراد با تجربه تو انجمن زده بودن برای شروع کمک گرفتم.
    چند سوال داشتم در مورد مدیریت حافظه.
    بچه های دانشگاهمون و یکی از اساتید مراجعه کردم کسی اطلاعی نداشت. براشون جدید بود. تو اینترنت هم گشتم ولی چون یکم تخصصیه راحت پیدا نمی شه. یک سرنخ های کوچیکی تو user manual میکروکنترلر پیدا کردم.
    می خوام با میکرو کنترلر lpc2103 کار کنم اونم تو شبیه ساز پروتئوس. با keil. بدون این برنامه های از قبل نوشته شده پیچیده.

    دوستان من انتظار پاسخ کامل ندارم. اگه یک اشاره کنید که لپ کلامو بفهمم(مثل اثبات طولانی که فقط چند نکته کوچیک داره) یا یک منبع سریح معرفی کنید ممنون می شم.

    1_ سرعت خوندن از روی حافظه فلش چه قدره؟ با رم فرق می کنه؟ سرعت خوندن , نه نوشتن.(در datasheet و user manual چیزی نبود) اگه سرعت خوندن از فلش میکروکنترلر بیشتر از حافظه رم هستش چه تکنیکی وجود داره که برنامه رو بعد از بارگذاری از حافظه فلش بندازیم تو حافظه رم و خظ اجرای برنامه رو ببریم رو رم؟ یعنی برنامه لود بشه و اجرا بشه. دقیقا شبیه همون چیزی که سیستم عامل میاد یک فایل exe رو بازگذاری می کنه روی رم. در مورد ram memmory allocation مشکلی ندارم تست کردم کار کرد. فقط heap رو تنظیم کردم و از تابع malloc() استفاده کردم.

    2_برای پروگرم کردن فلش نوشته بود می تونین به روش IAP استفاده کنیم. من تو اینترنت دیدم یکسری برنامه های بزرگ و هدر های حجیم و پر اضافات بودن که همچین کاری کنن ولی من می خوام اولا یک چیزی یاد بگیرم دوما چیزی بنویسم که دقیقا مناسب یک کار تخصصی خاص که می خوام برنامشو بنویسم باشه. نه یک چیز جامع. (یکبار نشستم تو C CONSOL از 0 رابط کاربری گرافیکی مثل Windows 3 نوشتم. مثل گرافیک bios ـ 2000 خط شد)
    اصلا من مرض دارم می خوام چرخو از اول بسازم. :rolleyes:
    من چه طور می تونم روی flash بنویسم؟ تو codevisionavr که برای نوشتن رو EEPROM فقط کافی بود تعریف کنیم متغیر eprom و مثل بقیه متغیر ها از روش بخونیم و بنویسیم و سیستم خودش کاراشو می کرد. اینجا باید چیکار کرد؟ register خاصی داره؟ یا باید معمولی رو آدرس حافظه بنویسیم؟

    3_ چه الگوریتمایی برای تخصیص حافظه و مدریتش وجود داره؟ یعنی یک تابع بنویسم مثل malloc() برام بیاد حافظه فلش رو بلوک بندی کنه و بلوک های استفاده شده و خالی رو بدونه و هروقت خواستم چند بلوکو آزاد کنه یا چند بلوک بهم بده. برای هر دسته بلوک هم اگر لازم شد یک اسم مثل فایل در نظر بگیره. بعدم اگر لازم داشتم بزنم حافظه رو دیفرگ کنه.

    4_ من heap و stack رو می دونم تو سیستم pc چی هستن ولی نمی فهمم وقتی میکروکنترلر سیستم عامل نداره این 2 چه معنی دارن؟
    یک تنظیم سخت افزاریه؟ یا توی برنامه startup یکسری برنامه شبهه سیستم عامل گذاشتن؟ یعنی چی که حتما باید heap تعیین کنیم که بتونیم allocation انجام بدیم؟؟؟ ثانیا حافضه stack در سیستم های pc خودش یکجور heap سطح پایین تر allocate شده توسط سیستم عامل است.اصلا کل حافظه ram به غیر از بخش اصلی که مربوط به سیستم عامل می شه heap است.
    حالا ایناشو دیگه واقعا نفهمیدم چرا stack یکسری تنظیمات داره؟ این تنظیمات دیگه چیه؟6 تا تنظیم داره تو keil قسمت startup که نوشته فلان فلان mode.
    stack ... mode دیگه چیه؟ اصلا کلا حافظه رو میدادن دست خود کاربر , خودم یک برنامه واسه مدیریتش می نوشتم منظم تر می شد.

    5_من لازم دارم یک سری lookup table بزرگ جهت انجام محاسبت سریع ریاضی و یکسری الگو های 2 بعدی یا چند بعدی مثل تصویر بریزم داخل حافظه فلش ( حالا فراخوانیش به رم که کاری نداره )
    مثلا این اطلاعات رو میام تو کامپیوتر با یک برنامه ای می سازم و میریزم تو یکسری فایل با پسوند BIN . حالا می خوام این فایل هارو کنار برامه اصلی با پروگرامر بریزم توی حافظه فلش میکروکنترلر که اولا آدرسشو داخل برنامه داشته باشم دوما این اطلاعات حجیم نیفتن روی برنامه اصلی.
    چه باید کرد؟ کسی نظری تجربه ای چیزی داره؟ یک راه حل ساده اینه که بیایم یک دونه متغیر تعریف کنیم و تو یک هدر بزاریم ولی فکر کنم اگه اطلاعات فقط 20kb رو بزارم توش تو موقع کپی پیست که یک دور سیستم هنگمی کنه و شاید complie هم یک ساعتی طول بکشه. بعد اگه بخوام دیباگ کنم دیگه وقت نمی شه.

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

    سلام
    1- چه اهمیتی داره؟ اینا مسائلی هستش که برای سازنده مهمه نه ما! ما فقط قطعاتی که لازممون میشه رو می خریم(با توجه به انتظاراتی که ازش داریم). انتظارش هم میره که اطلاعات درست و کاملی گیرت نیاد. چون اینا باید جزو اطلاعات سکرت شرکت باشه و اونا هم نمی خوان این چیزا رو بگن. البته شاید با ایمیل زدن به شرکت مربوطه یا پرسیدن سوال در فرومشون پاسخ این سوالات رو بگیرد(البته بازم فکر نکنم کامل باشه).
    2- EEPROM توی سری AVR محصولات اتمل یه قسمت جدای از حافظه فلش هستش. مثل یه پریفرال
    3- شاید لازم باشه یه سری اطلاعات راجب ساختمان داده ها جمع آوری کنید و بخونید. (Data structures)
    4- Stack که کارش ذخیره یه نوع متغیر و مقادیر مربوط به یه تابع و آدرس و... هستش ولی heap برای اختصاص یه قسمت از حافظه به صورت دینامیکی هستش. شما ممکنه وسط برنامه نیاز به یه مقدار از حافظه داشته باشید. اصلا این دو موضوع دو مبحث جدا هستن. گوگل کنید و توضیحات مربوط به این دو رو بخونید.
    در مورد تنظیمات به help کیل مراجعه کن. اونجا حتما نوشته که چیکار میکنن. اگه موردی بود بعد اینجا بپرس.(اگه سوادمون برسه جوابتون رو میدیم)

    5- در مورد این قسمت بیشتر توضیح بدید. درست و واضح توضیح بدید که چیکار می خوایید بکنید.

    دیدگاه


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

      1_ اهمیتش برای من سرعته. مثلا اگر خوندن از روی فلش با فرکانس 100MHz بشه 2 کلاک و از روی رم بشه 1 کلاک , اونوقت برنامه که خط به خط از روی فلش اجرا می شه به ازای هر خط اجرا باید اول نمی دونم 2 یا 4 بایت رو از فلش برداره و execute کنه. اونوقت اگر سرعت خوندن از روی فلش بیشتر از رم باشه معقوله که برنامه رو ببریم تو رم اجرا کنیم.
      من تنها ایده ای که دارم اینه که کل بخش برنامه رو از آدرس 0 تا قبل از این که به 4 بایت 0xFF برسیم رو ببریم تو رم. یک چیزی تو C بود به نام اجرای تابع از روی آدرس خط تابع. خوب بعد بیایم برنامه رو از همون آدرسی که تو رم گذاشتیم اجرا کنیم ولی اینبار یک متغییر flag رو عوض کنیم که تعیین می کنه اطلاعات از روی فلش بره رو رم. حالا دوباره برنامه startup باید اجرا بشه تا برسه به همون برنامه که برنام رو میندازه تو رم ولی چون flag غیر فعاله دیگه بقیه برنامه عادی اجرا می شه.
      البته چند مسئله هست اولا می شه 2 بار startup اجرا بشه؟ سوما در خطوط زبان ماشین یک برنامه اشاره گر ها به خود آدرش ها به صورت دقیق اشاره می کنند یا میزان شیفت آدرس خط برنامه رو تعیین می کنند؟ اگر به صورت شیفت باشه مشکلی نیست. ولی اگر به مقدار مطلق آدرس ها اشاره کنند حتما به آدرس های flash اشاره خواهند کرد و برنامه دیر یا زود دوباره بر می گرده رو فلش.

      2_بله خودم متوجه هستم. البته در نظر بگیرین که حافظه flash یک نوع خاصی از EEPROM هستش.
      حالا چه طور با IAP (in aplication programming) بایت به بایت بریزم رو فلش؟

      4_بله کامل درسته ولی سیستم عامل میاد از کل حافظه سیستم به غیر جایی که مل خودشه که می شه heap یک تیکه حافظه رو اختصاص می ده به stack یک برنامه exe . یعنی یک تیکه از حافظه دینامیکی (که حافظه دینامیک تغریبا کل حافظه سیستم رو شامل میشه )برای stack یک برنامه اختصاص یافته می شه بعد برنامه بازم می تونه حافظه از سیستم درخواست کنه. گوگل کرده بودم.
      در واقع یک تابع که اجرا می شه یکسری متغیر local اول از رم allocate می شن و استفاده می شن ولی فرقش با allocate گلوبال اینه که همون جایی که تابع قبلی بود allocate می شن. و وقتی تابع خارج شد کل اون حافظه free می شه. ولی در سطح پایین در در نظر گرفته شده که این حافظه مال برنامه exe مورد نظره و کسی حق دسترسی بهش نداره.
      این heap و stack فقط 2 تا اصطلاح هستن. یا می شه گفت روش استفاده از حافظه. واقعیت اینه که کل حافظه سیستم دینامیکی هستش و همشون به صورت یک heap بزرگ از دید سیستم عامل هستن.
      تو help چیزی درباره stack و startup نبود!!!!

      5_شما درباره روش های محاسبات ریاضی با lookup table اطلاع دارین؟ تو گوگل بزنین بهترین و کامل ترین اطلاعاته. چیز خاصی نیست. فقط درصدی از محاسبات ریاضی رو به صورت حفظی به خورد سیستم می دیم که سرعت محاسبه بیشتر بشه. مثلا ما انسان ها 100 عدد از جدول ضرب رو حفظ می کنیم. البتته بعدا مضارب بیشتری هم حفظ می شیم. وقتی می گم 2*2 شما نمیای مثل ALU ـ یک 2 بزاری و یک 2 دیگه بزاری شیفت بدی و بعد با هم جمع کنی بشه 4. ما از روی حافظه درجا مقدارو برمی داریم.
      حالا کامپیوتر جدول سینوس و لگاریتم و نمایی و ... رو می تونه حفظ کنه. برای افضایش دقت هم می شه حافظه بیشتری رو اختصاص داد هم می شه از درون یابی استفاده کرد با مرتبه 2 به بالا. حالا می تونیم سینوس رو با دقت یکسان تو 1 کلاک حساب کنیم.
      حالا من برای کار گرافیکی هم یکسری تصویر لازم دارم . درواقع اینم یک جور lookup table هستش. چند بعدی هم می تونه یک تابع چند متغیره باشه.
      همه اینارو مثلا برای lpc2103 در حد 20Kb درمیارم. بعد میام در PC اینارو با یک برنامه با فرمتی که خودم لازم دارم می سازم و میریزم تو یک فایل BIN و حالا می خوام این بانک اطلاعاتی رو بریزم تو میکروکنترلر. با همون ترتیب. آدرس خونه اولشو که داشته باشم آدرس بقیه خونه ها رو هم دارم.

      دیدگاه


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

        1- حقیقتش من که تا حالا توی امبدد کار میکردم گاهی این موضوعات برام اهمیت نداشته. کسی رو هم ندیدم که براش مهم باشه. منظورم این نیست که کار شما بی ارزشه. تورو خدا الان نیاین بگین که ناامیدم کردین و از این جور حرفا. واقعا این موضوع هیچ اهمیتی واسه یه امبدد کار نداره. مگه اینکه شما الان یه مشکلی داشته باشید و بخوایید حلش کنید که بازم احتمالش رو خیلی کم می دونم و حتی اگه همچین موضوعی باشه ما اینجوری حلش نمیکنیم.

        2- نگفتم که چه نوعیه، گفتم یه چیز جداست. این یعنی اینکه شما اگه بخوای روش بنویسی زیاد مشکلی نداری، مشکل اینجاست که میکروهای ARM توی کشور EEPROM نداره و شما باید یه جداگانه ش(نمونه اکسترنال) رو نصب کنید. اگه هم می خوای رو خود همین حافظه فلش که داری روش برنامه رو می خونی، بنویسی موضوع خیلی پیچیده میشه. شاید بحث بوتلودر پیش بیاد.

        3- برای پروگرم کردن حافظه فلش روش های متفاوتی وجود داره. چرا این روش(IAP) رو انتخاب کردین؟

        4- ما به سیستم عامل کاری نداریم. اینجا Stack یه وظیفه داره که انجامش میده. ما هم بهش کاری نداریم. ما اگه لازم باشه فقط با heap سر و کار داریم. اصلا شما فکر کن ما Stack نداریم.

        5- بله، بسیار. موضوع بسیار پرکاربردی خصوصا برای کتابخانه نویسی هستش.

        دیدگاه


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

          هدف من داشتن بیشترین سرعت پردازش همراه توانایی پردازَ بعضی چیزای پیچیده با ارزانترین میکروکنترلر هاست.
          البته کارایی که می خوام با میکروکنترلر انجام بدم شاید بگین FPGA یا مدار الکترونیکی بهتر انجام بده ولی مزیت برنامه نویسی و انعطاف پذیری میکروکنترلر یکچیز دیگست. و در ضمن سادگی.
          البته مجبورم از حداکثر پتانسیل و توانایی میکروکنترلر استفاده کنم. در بعضی موارد هم شاید میکروکنترلر به کلی از FPGA یا مدار الکترونیکی بسیار ارزان تر و بهتر عمل کنه.
          فعلان پروژه خاصی در نظر ندارم که با میکروکنترلر راه بندازم ولی می خوام یاد بگیرم از حداکثر پتانسیل میکروکترلر استفاده کنم.(منظورم ARM)
          قبلان که با AVR کار می کردم تا سرحد مرگ ازش کار می کشیدم. flash رو تا ته پر می کردم و از حداکثر سرعت پردازشش استفاده می کردم. البته همش جهت تست.

          1_من تو شبیه ساز Proteus سرعت خوندن از فلش و رم رو تست کردم. خیلی ساده 2 تا متغیر تعریف کردم. یکی کنستانت که دقیقا می ره تو حافظه فلش. و یکی local که دقیقا رفت تو خونه اول رم.(تو نمایشگر حافظه رم و فلش شبیه ساز Proteus دیدم) بعد یک چشمک زن تعریف کردم که 17 بار از روی فلش برداره و جمع و تفریق کنه و دفعه بعد 17 بار از روی رم. نتیجه رو بریزه تو بافر IO. البته متغیر ها رو volatile تعریف کردم که تو کامپایلر تو کارم دخالت نکنه.
          با درنظر گرفتن زمان انجام محاسبه که درواقع چند ریجیستر همزمان با هم کار می کنن و در وسط کار میریزن رو رم و دوباره می خونن و جمع می کنن و ...
          نتیجتا تغریبا زمان انجام محاسبات از روی متغییر کنستانت که درواقع روی فلش بود 3-4 برابر زمان محاسبات با متغیر روی رم شد.
          من سرعت کار CPU رو از 10MHz به 60MHz رسوندم زیاد تغییری نکرد.
          پس با در نظر گرفتن انجام کار های دیگه به غیر از خوندن از فلش , باید سرعت خوندن فلش حدودا حداقل بیشتر از 3 برابر سرعت خوندن از رم باشه.
          بهتره به صورت عملی تست بشه. اونم نه با این متغیر ها بلکه خود برنامه از روی رم اجرا بشه.
          پس یعنی شما شاید بتونی با اجرای برنامه از روی رم حداقل 2 برابر سرعت برنامه رو افزایش بدی.

          2_ در نظر دارین که program کردن یعنی صرفا نوشتن بایت به بایت روی حافظه فلش نه چیز دیگر. خوب منم می خوام رو فلش بنویسم. ولی حین اجرای برنامه. روش های خارج برنامه فقط به درد update کردن یا عوض کردن کد برنامه می خوره. من می خوام اطلاعاتی رو در حافظه فلش ضبت کنم در حین اجرای برنامه. مثل hard disk کامپیوتر PC . من تو user manual خوندم یه چیزیای گفته ولی یکم برام مبهمه. (خیلی مبهمه) :angry:
          کسی می تونه شرح بده چه طور IAP راه بندازم؟

          4_ پس منظور شما اینه که stack config خیلی مهم و تاثیر گذار نیست؟ پس چیه؟ چرا گذاشتنش؟ من بازم سرچ می کنم ببینم به کجا می رسم.

          5_حالا به نظر شما چه طور بیام این بانک اطلاعاتی رو به برنامه فلش که همون فایل HEX هستش اضافه کنم؟
          یک راه حل به نظرم رسید و اون این که بیام یک بار فایل HEX تولید شده رو با یک برنامه console باز کنم ببینم توش چیه. اگر دقیقا همون چیزیه که می ره تو فلش میکروکنترلر شاید بشه بیام بازش کنم و به تهش اطلاعاتمو اضافه کنم و دوباره ببندمش بدم به پروگرامر بریزه تو میکرو. آدرسش هم می شه یک جوری نوشت. مثلا یک متغیر تعریف می کنم : const chat*="PUT FLASH POINTER HERE" و بعدش بیام تو برنامه console اینو پیدا کنم و 4 بایت اولشو عوض کنم و آدرس lookup table های اضافه شده رو تزریق کنم.

          دیدگاه


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

            نوشته اصلی توسط Aryan_M
            هدف من داشتن بیشترین سرعت پردازش همراه توانایی پردازَ بعضی چیزای پیچیده با ارزانترین میکروکنترلر هاست.
            البته مجبورم از حداکثر پتانسیل و توانایی میکروکنترلر استفاده کنم. در بعضی موارد هم شاید میکروکنترلر به کلی از FPGA یا مدار الکترونیکی بسیار ارزان تر و بهتر عمل کنه.
            فعلان پروژه خاصی در نظر ندارم که با میکروکنترلر راه بندازم ولی می خوام یاد بگیرم از حداکثر پتانسیل میکروکترلر استفاده کنم.(منظورم ARM)
            سلام
            در این صورت برای استفاده از حداکثر توان پردازشی میکرو می توانید با اسمبلی کد بزنید که بهینه باشد.
            فيلم آموزشي ميکروکنترلر LPC1768
            فيلم آموزشي تکميلي و پيشرفته ميکروکنترلر LPC1768
            فيلم آموزش کاربردی زبان سی در میکروکنترلر ARM
            فیلم آموزش مقدماتی میکروکنترلر LPC1788 به زودی ...

            دیدگاه


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

              نوشته اصلی توسط mzarkoob
              سلام
              در این صورت برای استفاده از حداکثر توان پردازشی میکرو می توانید با اسمبلی کد بزنید که بهینه باشد.
              فرمایش شما درسته ولی سادگی و سرعت عمل هم برای من مهمه. مثلا وقت ندارم 1 هفته وقت بزارم رو یک برنامه اسمبلی بنویسم.
              اصلا اسمبلی بلد نیستم. من برقم . من و چه به این چیزا... :rolleyes:
              در ضمن اگر برنامه اسمبلی هم باشه باز هم با انتقال کد برنامه به رم سرعت بیشتر خواهد شد.
              زبان C به نظر من بهینه است. البته کارای ساده تری هم هست که سرعتو افزایش بدیم.

              کسی هست بتونه پروگرمینگ به روش IAP رو توضیح بده؟
              همینم یکی بتونه برام توضیح بده ممنون می شم.

              دیدگاه


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

                نوشته اصلی توسط Aryan_M
                1_ سرعت خوندن از روی حافظه فلش چه قدره؟ با رم فرق می کنه؟
                چیری در حد 1 الی 9 مگابیت درثانیه .مثلا الان هارد های جامد تا 32 مگابیت رو با usb3 ساپرت میکنه . بلی با رم فرق میکنه . رم ها پارالل هستند و فلش ها سریال
                مثلا با سرعت 100 مگابیت برثانیه در یک میکرو 32 بیتی با هر 2 پالس میتونی 32 بیت رو از رم تو ریجستر AH بخونی .که میشه 1.6 گیگا بیت برثانیه . البته دقت کن با این سرعت فقط میتونی بخونی حالا بعد خوندن دیتا رو باید پردازش کنی اون دیگه بحث سرعت نیست .



                نوشته اصلی توسط Aryan_M
                سرعت خوندن , نه نوشتن.(در datasheet و user manual چیزی نبود) اگه سرعت خوندن از فلش میکروکنترلر بیشتر از حافظه رم هستش چه تکنیکی وجود داره که برنامه رو بعد از بارگذاری از حافظه فلش بندازیم تو حافظه رم و خظ اجرای برنامه رو ببریم رو رم؟ یعنی برنامه لود بشه و اجرا بشه. دقیقا شبیه همون چیزی که سیستم عامل میاد یک فایل exe رو بازگذاری می کنه روی رم. در مورد ram memmory allocation مشکلی ندارم تست کردم کار کرد. فقط heap رو تنظیم کردم و از تابع malloc() استفاده کردم.
                سرعت خوندن با نوشتن هیچ فرقی نداره . برای بار گذاری برنامه از فلش یا هارد جانبی یا cdrom تو sdram هم هیچ تکنیک خاصی نداره . فقط از هارد میخونی تو حافظه و با دستورات پرش میپری توآدرس حافظه مورد نظر

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


                بقیه بمونه برا بعد



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

                دیدگاه


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

                  نوشته اصلی توسط aliila
                  چیری در حد 1 الی 9 مگابیت درثانیه ...
                  پس این حرف شما آزمایش منو تو Proteus تعیید می کنه. البته من تو ویکیپدیا دیدم فلش تا فلش سرعتشون فرق می کنه. بستگی به نحوه ساخت سلول ها و پروتکل ارتباطی...
                  پس یعنی من فقط برنامه رو از فلش بریزم تو رم و خط برنامه رو بیارم رو رم درست می شه دیگه؟
                  حالا مشکل من اینجاست که نمی دونم خطوط برنامه اصلی بعد از startup از کجا شروع می شن؟ یعنی کجا رو باید بیارم؟
                  اگر کل فلش رو بیارم (البته به غیر بانک های اطلاعاتی) اونوقت STARTUP دوباره اجرا می شه.
                  دوم در زبان C برای اندختن خط برنامه در نقطه آدرس مورد نظر باید چیکار کنیم؟ من فقط بلدم یک تابع رو با پوینترش فراخوانی کنم.
                  یک مشکل ثالث هم هست این که حالا اگر شاید برنامه من خیلی بزرگ شد از حجم رم ممکنه بیشتر بشه یا اونقدر رم بگیره که جایی برای STACK و HEAP نمونه. اونوقت مجبورم فقط توابعی که زیاد اجرا می شن رو بریزم تو رم.
                  این 2 تا الگوریتم رو می شه یکم باز تر توضیح بدین؟
                  البته در نظر داشته باشین که من می خوام یک حافظه مثلا 32Kb رو مدیریت کنم. البته شاید یک حافظه جانبی هم اضافه کردم که مثلا شاید حد اکثر شد چند مگا بایت. یک الگوریتم خفن نباشه...
                  من نمی دونم تو این دانشگاه درندشت فردوسی که از کره ماه قابل رویته یک نفر پیدا نمی شه که الگوریتم های مدیریت حافظه رو بلد باشه یا حد اقل بدونه که کی می دونه یا کجا می شه این اطلاعاتو بدست اورد. (منهای اینترنت که خود اینترنت هم نمی دونه این اطلاعات کجاست. درست Allocate نشدن)
                  یکجور جهل مرکب در این ضمینه در دانشگاه حاکمه.

                  دیدگاه


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

                    سوال شماره 5 حل شد.
                    راه حلشم سادست. فایل HEX تولید شده توسط کامپایلر رو می شه خیلی راحت دستکاری کرد و اطلاعات مورد نیاز رو بهش اضافه کرد.
                    فرمت فایل intel HEX رو می تونید از wikipedia ببینین خیلی سادست.
                    http://en.wikipedia.org/wiki/Intel_HEX
                    برای نمونه من فایل hex رو با notepad باز کردم و 8 بایت رو بهش اضافه کردم و در برنامه اون 8 بایت اضافه شده در موقعیت مورد نظر قرار گرفت.
                    حالا برای تعمیم فقط کافیه بیام اطلاعات مورد نیاز رو به مبنای 16 دربیارم و اون هدر و فوتر های فرمت intel hex رو بهش اضافه کنم و به انتهای فایل hex تولید شده توسط کامپایلر اضافه کنم.
                    شاید به درد شما هم بخوره. می تونید در فایل HEX تولید شده دستی تغییرات بدین. فقط با notepad و یک ماشین حساب.

                    دیدگاه


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

                      نوشته اصلی توسط Aryan_M
                      سوال شماره 5 حل شد.
                      راه حلشم سادست. فایل HEX تولید شده توسط کامپایلر رو می شه خیلی راحت دستکاری کرد و اطلاعات مورد نیاز رو بهش اضافه کرد.
                      فرمت فایل intel HEX رو می تونید از wikipedia ببینین خیلی سادست.
                      http://en.wikipedia.org/wiki/Intel_HEX
                      برای نمونه من فایل hex رو با notepad باز کردم و 8 بایت رو بهش اضافه کردم و در برنامه اون 8 بایت اضافه شده در موقعیت مورد نظر قرار گرفت.
                      حالا برای تعمیم فقط کافیه بیام اطلاعات مورد نیاز رو به مبنای 16 دربیارم و اون هدر و فوتر های فرمت intel hex رو بهش اضافه کنم و به انتهای فایل hex تولید شده توسط کامپایلر اضافه کنم.
                      شاید به درد شما هم بخوره. می تونید در فایل HEX تولید شده دستی تغییرات بدین. فقط با notepad و یک ماشین حساب.
                      خوب چرا دستی وارد فایل هگز میکنید؟!
                      تو برنامه های پروگرمر معمولا این گزینه هست که یه فایل رو تو آدرس خاصی از حافظه پروگرم کنه! ببینید فایل اصلی تا کجای حافظه رو گرفته بعد این فایل بین رو به انتهای اون پروگرم کنید.(اصلا این فایل رو انتهای حافظه بریزید که هر دفعه لازم نباشه میکرو رو کامل پاک کنید و دوباره....) تست نکردم تا حالا ولی فکر میکنم جواب بده.

                      در مورد سرعت خوندن از فلش! الان میکرو ها واحد شتاب دهنده برای لود کردن دستورات دارن که مشکل سرعت پایین فلش رو حل میکنه و نیازی به کپی کردن روی رم نیست! این همه پایپ لاین و این حرف ها رو برای همین گزاشتن که درگیر این مسایل نشید دیگه!
                      [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                      دیدگاه


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

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

                        دیدگاه


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

                          نوشته اصلی توسط shahinbahari
                          خوب چرا دستی وارد فایل هگز میکنید؟!
                          تو برنامه های پروگرمر معمولا این گزینه هست که یه فایل رو تو آدرس خاصی از حافظه پروگرم کنه! ببینید فایل اصلی تا کجای حافظه رو گرفته بعد این فایل بین رو به انتهای اون پروگرم کنید.(اصلا این فایل رو انتهای حافظه بریزید که هر دفعه لازم نباشه میکرو رو کامل پاک کنید و دوباره....) تست نکردم تا حالا ولی فکر میکنم جواب بده.

                          در مورد سرعت خوندن از فلش! الان میکرو ها واحد شتاب دهنده برای لود کردن دستورات دارن که مشکل سرعت پایین فلش رو حل میکنه و نیازی به کپی کردن روی رم نیست! این همه پایپ لاین و این حرف ها رو برای همین گزاشتن که درگیر این مسایل نشید دیگه!
                          البته منظور من این بود که این روش دستی رو تعمیم می دم با یک برنامه ساده که با C console می نویسم یک فایل حجیم رو به انتهای فایل hex اضافه می کنم.
                          من تو keil گشتم همچین چیزی که یک فایل bin رو به ته hex یا هرجای دیگش اضافه کنه پیدا نکردم.

                          این واحد های شتاب دهنده که من زیاد اطلاعی ندارم شاید بیان سرعت اجرای برنامه رو زیاد کنن ولی نهایتا میکرو هر کاری بکنه از حافظه فلش سریع تر از 2 کلاک نمی تونه اطلاعات 32 بیتی برداره.(فرض بر این که ریجیستر هایی فقط در حال خوندن کد از فلش باشن) حالا روش thumb 16 رو ایجاد کردن که دستورات 16 بیتی بخونه که سرعت پردازش بیشتر بشه ولی اگه این وسط اومد یک آدرس که 32 بیتیه یا یکسری اعداد دیگه مورد نیاز 32 بیتی اونوقت دوباره همون 2 کلاک می شه.
                          تو دیاشیت نوشته بود روش thumb16 می تونه سرعت رو تا 60% افزایش بده. خوب این دلیلشم اینه که 60% اوقات با کد دستور سروکار داره که می شه 16 بیتی نوشت و 40% اوقات با اعداد و آدرس های 32 بیتی سروکار داره.
                          حالا ممکنه یک برنامه چون با اعداد داخل فلش بیشتر سروکار داره میزان افزایش سرعت روش thumb 16 ـ30% بشه.
                          حالا برای این که تمام مشکلات حل بشن کافیه کد برنامه بره تو رم که سرعت 100% افزایش پیدا کنه.
                          اگر thumb هم بکنیم که دیگه حافظه کمتری هم اشغال می شه.

                          دیدگاه


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

                            مسئله شماره 1 فکر می کنم به همین راحتی قابل حل نباشه.
                            وقتی تو keil کد ماشین برنامه رو می دیدم دیدم که وقتی از flash چیزی خونده می شه , تاخیر 1 کلاکی دسترسی به flash تو خود خط برنامه گذاشته شده.
                            و دستورات خوندن از فلش با رم فرق داره.
                            پس عملا برای انتقال برنامه از فلش به رم باید یک کامپایلر جدید نوشت که کد مخصوص رم ایجاد کنه.
                            فقط کاری که می شه کرد اینه که هرچی متغیر و اطلاعات خالص و pointer داریم قبل برنامه بریزیم تو رم. و حتما هم از روش thumb 16 استفاده کنیم.
                            حالا اگه دوستان نظر یا راه حل دیگه ای دارن بگن ببینیم چی می شه.

                            چقدر پاک کردن صورت مسئله راحته :biggrin:

                            دیدگاه


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

                              نوشته اصلی توسط داود رهایی
                              اطلاعاتتون غلط هست
                              سرعت هاردهای جامد خیلی خیلی بیشتره
                              و USB3 هم تا حدود 5 گیگابیت بر ثانیه سرعت داره
                              در ضمن ساختار فلش معمولن پارالل هست
                              5 گیگا بیت سرعت تئوری usb3 است .کامپیوتر که دارین .فلش درایو هم که دارین .یک فابل از فلش به هارد کپی بزن .حداکثر سرعت 9 MB/s خواهد بود .
                              در ضمن فلش ها کالا سریال هستند .

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

                              دیدگاه

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