نمایش نتایج 1 تا 4 از 4

نام تاپیک: سوال درباره روش مدیریت حافظه به صورت دینامیک در پردازنده DSP

  1. #1
    کاربر تازه وارد
    تاریخ عضویت
    دی 1384
    محل زندگی
    Germany
    پست
    77

    سوال درباره روش مدیریت حافظه به صورت دینامیک در پردازنده DSP

    با سلام خدمت دوستان

    درباره مشکلی که با آن برخورد کرده ام مایل بودم از راهنمایی و تجربیات دوستان استفاده کنم.

    مشکل: در حین کار بر روی سیستمی که از پردازنده DSP 56F8357 استفاده شده به این مشکل برخورد کرده ام که کد تولید شده برای تابع memCalloc در محیط Codewarrior بسیار بزرگ بوده و عملا مجبور به تخصیص حافظه به صورت استاتیک شده ام .

    سوال: چه روشهایی برای تعریف و تخصیص حافظه خارجی به صورت دینامیک وجود دارد؟

    با تشکر

  2. #2
    با عرض ادب:
    مطمئن نیستم سوالتان را درست متوجه شده باشم اما اتفاقی که معمولا می افتد برعکس است. بدین صورت که داده های بزرگ خود را(مانند آرایه ها و ...) وقتی در کد به صورت استاتیک تعریف می کنید٬ فضایی برای آن ها در سگمنت داده ی کد در نظر گرفته می شوند که موجب بزرگ شدن کد نهایی می شود. برای پرهیز از این امر٬ به داده ها هنگام اجرا به صورت دینامیک با دستوراتی مانند malloc فضا اختصاص داده می شود و بعد از هر استفاده حافظه تخصیص داده شده آزاد می گردد. این موجب می شود کد کوچک تر شود ولی حافظه مربوطه در heap هنگام اجرا مورد نیاز می شود.
    اگر منظور شما این است که چطور حافظه کاری سیستم خود را انتخاب کنید٬ کامپایلرها معمولا این امکان را به کاربر می دهند که اگر چنانچه چند حافظه مختلف روی یک سیستم در دسترس است٬ هر سگمنت (کد٬ داده٬ پشته و...) روی کدام حافظه قرار بگیرند. مثلا ممکن است بخواهید سگمنت کد روی promباقی بماند ولی heap که جایی است که به صورت دینامیک در آن فضا تخصیص داده می شود روی چیپ DDR RAM خارجی قرار بگیرد.
    علاوه بر این ها برخی دیگر از کامپایلر ها این اجازه را می دهند که هنگام تعریف یک داده(درون کد) مشخص کنید که داده مربوطه روی کدام حافظه قرار می گیرد.
    پیاده سازی دو مورد اخیر کاملا به کامپایلر شما بستگی دارد و باید به مستندات مربوطه رجوع کنید.

    یه ... ...
    one of the main causes of the fall of the Roman Empire was that, lacking zero, they had no way to indicate successful termination of their C programs. -- Robert Firth

  3. #3
    کاربر تازه وارد
    تاریخ عضویت
    دی 1384
    محل زندگی
    Germany
    پست
    77
    با عرض پوزش از اینکه سوال را اینقدر مبهم بیان کردم.
    داستان این است که برای مدیریت حافظه ابزاری که در اختیار داشتم Memory Bean است که مطابق تصویر اول حافظه ها و پارامترهای مورد نظر تعریف شده و در مرحله بعدی از توابع Code Warrior استفاده می کنیم (خطوط قرمز رنگ تصویر مربوط تعریف حافظه خارجی است )




    یکی از توابعی که من استفاده کردم در تصویر دوم مشخص شده برای تعریف بافرهایی که در بخشی از برنامه نیاز دارم.
    (بافرها باید در حافظه خارجی تعریف شوند!)





    حالا مشکل من اینجاست که همین تابع memCallocٍEM بعد از کمپایل شدن کد بزرگ تولید می کند که برای استفاده در فلاش DSP مشکل ایجاد می کند. (فقط همین تابع) بنابراین من مجبور شدم فعلا برای تست آدرس ثابت برای تعریف بافرها به کار ببرم اما نهایتا بدلیل اینکه ممکن است نیاز به تعریف همزمان چند بافر باشد (همچنین پاک شدن بعضی در حین برنامه و تعریف جدید) بنابراین به مدیریت حافظه نیازدادم که تخصیص بافر را به صورت دینامیک خودش انجام دهد.

    یک ایده این بود که ماژولهای Code Warror را مطابق نیازم تغییر بدهم طوری که کد غیر ضروری در مرحله کامپیل تولید نکند اما این ماژولها بسیار پیچیده بوده و ویرایش آنها فقط خرابکاری به بار آورد! , حالا من به چه روش دیگری می توانم این مکانیزم تعریف بافر را انجام دهم که جوابگوی نیاز باشد (چند بافر بتواند تعریف و در حین اجرا حدف و یا مجددا تعریف شود). چه روشی در این طور مواقع توصیه می شود.
    ممنون

  4. #4
    با عرض ادب:
    متاسفانه من code warrior را فقط در یک پروژه کوچک با یک میکروکنترلر freescale استفاده کرده ام و تجربه زیادی روی آن ندارم اما یک مطلب کلی:
    خروجی کامپایلر و/یا مشخصات باینری تولید شده نهایی را نگاه کرده اید؟ آیا سگمنت کد است که فضای زیادی به خود اختصاص می دهد؟ ممکن است به خاطر این باشد که با اضافه کردن این دستور یک کتابخانه(library) حجیم جدید استفاده شده. برای حل این مشکل آیا پارامترهای بهینه سازی(optimization) برای حذف کدهای اضافی هنگام کامپایل فعال شده اند؟

    یه ... ...
    one of the main causes of the fall of the Roman Empire was that, lacking zero, they had no way to indicate successful termination of their C programs. -- Robert Firth

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •