Цитата(Itch @ Apr 1 2008, 18:25)

Программирую Blackfin'ы в VDSP 5.0 и задался вопросом. Можно ли как-то автоматизированно поместить часть кода во внешнюю SDRAM, а часть - куда получится? Т.е. например есть у меня в проекте какая-нибудь большая библиотечка типа ucGUI, и хочу я, чтобы она не занимала место в быстрой набортной памяти а спокойно лежала себе в SDRAM. Вроде можно в исходниках перед объявлениями переменных и функций писать section ("sdram0"), но делать это для всей ucGUI, в которой очень много функций, мягко говоря, геморно. Так вот, можно ли как-то задать в ldf файле или еще где сразу список файлов, подлежащих депортации на внешние просторы SDRAM? Ну или другой подход - может просто задать критичным участком кода жесткую привязку к внутренней памяти, а все остальное пойдет куда получится?
Analog использует такую фигню: пишет файл priority.asm
и включает его в проект. Каждый модуль, получает приоритет в отношении
размещения во внутренней памяти. В первую очередь во внутрь размещаются модули
с высоким приоритетом - с малыми числами priority
Пример:
/* #######################################################
*
* Critical C-Runtimes Execution Blocks used by the stack
*
* #######################################################
*/
.extern ___memcpy;
.priority ___memcpy, "..\..\..\..\..\libc\runtime\_memcpy.s", 4000;
.extern ___memcpy2;
.priority ___memcpy2, "..\..\..\..\..\libc\runtime\_memcpy2.s", 4000;
.extern ___float32_div;
.priority ___float32_div, 3999;
.extern ___float32_to_unsigned_int32;
.priority ___float32_to_unsigned_int32, 2022;
.extern ___float32_mul;
.priority ___float32_mul, 2304;
/* #######################################################
*
* Critical VDK Execution Blocks used by the stack
*
* #######################################################
*/
.extern _tmk_TimerISR;
.priority _tmk_TimerISR , 2397;
.extern _tmk_DispatchDPCs;
.priority _tmk_DispatchDPCs, 2391;
.extern _TMK_AcquireMasterKernelLock;
.priority _TMK_AcquireMasterKernelLock, 2406;
.extern _TMK_ReleaseMasterKernelLock;
.priority _TMK_ReleaseMasterKernelLock, 2403;
.extern _tmk_ExceptionHandler;
.priority _tmk_ExceptionHandler, 2262;
.extern _tmk_SwitchContext_ISR;
.priority _tmk_SwitchContext_ISR, 2220;
.extern _tmk_SwitchContext_Runtime;
.priority _tmk_SwitchContext_Runtime, 2286;
.extern _PostSemaphore__3VDKF11SemaphoreID;
.priority _PostSemaphore__3VDKF11SemaphoreID, 2274;
.extern _PendSemaphore__3VDKF11SemaphoreIDUi;
.priority _PendSemaphore__3VDKF11SemaphoreIDUi, 2256;
.extern _GetThreadID__3VDKFv;
.priority _GetThreadID__3VDKFv, 2367;
.extern TMK_GetUptime;
.priority TMK_GetUptime , "..\..\..\Timer_BF.asm" , 2370;
/* ##########################################################
*
* Critical Device Driver Execution Blocks used by the stack
* This is applicable only for the BF537 on-chip MAC driver.
*
* ##########################################################
*/
#ifdef __ADSPBF537__
.extern _EnterCriticalRegion;
.priority _EnterCriticalRegion, "ADI_ETHER_BF537.c", 2337;
.extern _FlushInvArea;
.priority _FlushInvArea, "ADI_ETHER_BF537.c", 720;
.extern _QueueNewFrames;
.priority _QueueNewFrames, "ADI_ETHER_BF537.c", 2280;
.extern _EtherInterruptHandler;
.priority _EtherInterruptHandler, "ADI_ETHER_BF537.c", 729;
.extern _DmaErrorInterruptHandler;
.priority _DmaErrorInterruptHandler, "ADI_ETHER_BF537.c", 732;
.extern _QueueFrames;
.priority _QueueFrames, "ADI_ETHER_BF537.c", 2202;
.extern _ProcessCompletion;
.priority _ProcessCompletion, "ADI_ETHER_BF537.c", 2094;
.extern _FlushArea;
.priority _FlushArea, "ADI_ETHER_BF537.c", 2292;
.extern _RdPHYReg;
.priority _RdPHYReg, "ADI_ETHER_BF537.c", 2334;
.extern _AppendPending;
.priority _AppendPending, "ADI_ETHER_BF537.c", 2199;
.extern _RxInterruptHandler;
.priority _RxInterruptHandler, "ADI_ETHER_BF537.c", 2163;
.extern _TxInterruptHandler;
.priority _TxInterruptHandler , "ADI_ETHER_BF537.c", 2085;
.extern _adi_pdd_Read;
.priority _adi_pdd_Read, "ADI_ETHER_BF537.c",1929;
.extern _adi_pdd_Write;
.priority _adi_pdd_Write, "ADI_ETHER_BF537.c", 2151;
#endif /* __ADSPBF537__ */
и т.д. и т.п.