PDA

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



Mehran.GH
شنبه 22 دی 1386, 02:30 صبح
با سلام خدمت دوستان

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

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

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

با تشکر

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

یه ... ...

Mehran.GH
یک شنبه 23 دی 1386, 20:29 عصر
با عرض پوزش از اینکه سوال را اینقدر مبهم بیان کردم.
داستان این است که برای مدیریت حافظه ابزاری که در اختیار داشتم Memory Bean است که مطابق تصویر اول حافظه ها و پارامترهای مورد نظر تعریف شده و در مرحله بعدی از توابع Code Warrior استفاده می کنیم (خطوط قرمز رنگ تصویر مربوط تعریف حافظه خارجی است )


http://i1.tinypic.com/7xikdxc.jpg

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


http://i17.tinypic.com/8fxg3zn.jpg


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

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

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

یه ... ...