QuadMan 0 30 апреля, 2011 Опубликовано 30 апреля, 2011 · Жалоба Подскажите, пожалуйста, в чем может быть проблема... использую CCS 4 и TMS320F2812 Сделал проект для запуска из RAM, через CCS он отлично запускается и работает. Сделал его же для запуска из FLASH (при загрузке из FLASH, все копируется в RAM и работает оттуда). Но стали возникать неожиданные глюки - вылет по неопределенным адресам. Помнится мне, что когда проект был маленький, около 4-х кб, все работало (сейчас он занимает 7 кб, т.е. почти на пределе H0 SARAM). Есть у меня подозрение, что при загрузке из FLASH ему просто не хватает памяти. Но как такое может быть, я не пойму. (Естественно, если этот же проект прошить в FLASH, чтобы он с нее и работал, не копируя себя в RAM, все работает нормально). Спасибо! Может быть cmd файлы помогут: RAM.cmd MEMORY { PAGE 0: /* Program Memory */ RAM_L0 : origin = 0x008000, length = 0x001000 /* on-chip RAM block L0 */ OTP : origin = 0x3D7800, length = 0x000800 /* on-chip OTP */ BEGIN : origin = 0x3F8000, length = 0x000002 /* RAM Entry Point */ RAM_H0 : origin = 0x3F8002, length = 0x001FFE /* on-chip RAM block H0 */ BOOT_ROM : origin = 0x3FF000, length = 0x000FC0 /* Boot ROM available if MP/MCn=0 */ RESET : origin = 0x3FFFC0, length = 0x000002 /* part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) */ VECTORS : origin = 0x3FFFC2, length = 0x00003E /* part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) */ PAGE 1: /* Data Memory */ RAM_M0 : origin = 0x000000, length = 0x000400 /* on-chip RAM block M0 */ RAM_M1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */ RAM_L1 : origin = 0x009000, length = 0x001000 /* on-chip RAM block L1 */ PAGE 2: /* External Data Memory */ ZONE_2 : origin = 0x080000, length = 0x080000 /* XINTF zone 2 */ ZONE_6 : origin = 0x100000, length = 0x080000 /* XINTF zone 6 */ } /* ================================================================================ ========================================= */ SECTIONS { /* Code */ entrypoint : > BEGIN, PAGE = 0 ramfuncs : > RAM_L0, PAGE = 0 .text : > RAM_H0, PAGE = 0 .cinit : > RAM_L0, PAGE = 0 CodeStartSect : > RAM_L0, PAGE = 0 SysFuncSect : > RAM_L0, PAGE = 0 /* Data */ .stack : > RAM_M0, PAGE = 1 .esysmem : > RAM_M1, PAGE = 1 .ebss : > RAM_L1, PAGE = 1 .econst : > RAM_L1, PAGE = 1 /* I */ /* Reset */ .reset : > RESET, PAGE = 0, TYPE = DSECT } FLASH.cmd: MEMORY { PAGE 0: /* Program Memory */ RAM_L0 : origin = 0x008000, length = 0x001000 /* on-chip RAM block L0 */ ZONE_2 : origin = 0x080000, length = 0x080000 /* XINTF zone 2 */ OTP : origin = 0x3D7800, length = 0x000800 /* on-chip OTP */ FLASH_J : origin = 0x3D8000, length = 0x002000 /* on-chip FLASH */ FLASH_I : origin = 0x3DA000, length = 0x002000 /* on-chip FLASH */ FLASH_H : origin = 0x3DC000, length = 0x004000 /* on-chip FLASH */ FLASH_G : origin = 0x3E0000, length = 0x004000 /* on-chip FLASH */ FLASH_F : origin = 0x3E4000, length = 0x004000 /* on-chip FLASH */ FLASH_E : origin = 0x3E8000, length = 0x004000 /* on-chip FLASH */ FLASH_D : origin = 0x3EC000, length = 0x004000 /* on-chip FLASH */ FLASH_C : origin = 0x3F0000, length = 0x004000 /* on-chip FLASH */ FLASH_A : origin = 0x3F6000, length = 0x001F80 /* on-chip FLASH */ CSM_RSVD : origin = 0x3F7F80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */ FL_BEGIN : origin = 0x3F7FF6, length = 0x000002 /* Part of FLASHA. Used for "boot to Flash" bootloader mode. */ CSM_PWL : origin = 0x3F7FF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */ RAM_H0 : origin = 0x3F8000, length = 0x002000 /* on-chip RAM block H0 */ BOOT_ROM : origin = 0x3FF000, length = 0x000FC0 /* Boot ROM available if MP/MCn=0 */ RESET : origin = 0x3FFFC0, length = 0x000002 /* part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) */ VECTORS : origin = 0x3FFFC2, length = 0x00003E /* part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) */ PAGE 1: /* Data Memory */ RAM_M0 : origin = 0x000000, length = 0x000400 /* on-chip RAM block M0 */ RAM_M1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */ RAM_L1 : origin = 0x009000, length = 0x001000 /* on-chip RAM block L1 */ FLASH_B : origin = 0x3F4000, length = 0x002000 /* on-chip FLASH */ PAGE 2: /* External Data Memory */ ZONE_2 : origin = 0x080000, length = 0x080000 /* XINTF zone 2 */ ZONE_6 : origin = 0x100000, length = 0x080000 /* XINTF zone 6 */ } /* ================================================================================ ========================================= */ SECTIONS { /* Code */ entrypoint : > FL_BEGIN, PAGE = 0 csmpasswds : > CSM_PWL, PAGE = 0 csm_rsvd : > CSM_RSVD, PAGE = 0 SysFuncSect : > FLASH_A, PAGE = 0 ramfuncs : LOAD = FLASH_A, PAGE = 0 RUN = RAM_L0, PAGE = 0 LOAD_START(_g_ramfunc_load_start), LOAD_END (_g_ramfunc_load_end), RUN_START (_g_ramfunc_run_start) .text : LOAD = FLASH_C, PAGE = 0 RUN = RAM_H0, PAGE = 0 LOAD_START(_g_text_load_start), LOAD_END (_g_text_load_end), RUN_START (_g_text_run_start) /* .text : > FLASH_C, PAGE = 0 */ .cinit : > FLASH_C, PAGE = 0 CodeStartSect : > FLASH_A, PAGE = 0 FLASH_ML_Sect : > FLASH_A, PAGE = 0 FLASH_LoaderSect : > FLASH_H, PAGE = 0 LOAD_START(_g_flash_l_load_start), LOAD_END (_g_flash_l_load_end) FLASH_Loader1Sect : > FLASH_I, PAGE = 0 FLASH_Loader2Sect : > FLASH_J, PAGE = 0 /* Data */ .stack : > RAM_M0, PAGE = 1 .esysmem : > RAM_M1, PAGE = 1 .ebss : > RAM_L1, PAGE = 1 .econst : LOAD = FLASH_B PAGE = 1 RUN = RAM_L1, PAGE = 1 LOAD_START(_g_econst_load_start), LOAD_END (_g_econst_load_end), RUN_START (_g_econst_run_start) /* Reset */ .reset : > RESET, PAGE = 0, TYPE = DSECT } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Enthusiast 0 1 мая, 2011 Опубликовано 1 мая, 2011 · Жалоба Можно попробовать использовать мои рабочие командные файлы, которые я описал здесь. Затем можно попробовать увеличить размер стека, если предыдущий шаг не поможет. Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
QuadMan 0 3 мая, 2011 Опубликовано 3 мая, 2011 · Жалоба Сейчас посмотрел, вижу что во FLASH записывается все нормально, а то, что лежит уже в RAM представляет собой "надерганные" куски кода из FLASH. Как такое может быть? Из-за этого программа в произвольных местах уходит в никуда. Копирую из FLASH следующей функцией MemCopy(&g_text_load_start, &g_text_load_end, &g_text_run_start); Enthusiast, у Вас код расположен во FLASH, и в RAM Вы грузите только часть функций, а я бы хотел в RAM грузить все. Благо проект достаточно маленький и в RAM помещается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yura_K 0 3 мая, 2011 Опубликовано 3 мая, 2011 · Жалоба Возможно где-то данные и код лежат по одним адресам. У меня было такое - вызывал memset для области памяти где лежал код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Enthusiast 0 4 мая, 2011 Опубликовано 4 мая, 2011 · Жалоба Сейчас посмотрел, вижу что во FLASH записывается все нормально, а то, что лежит уже в RAM представляет собой "надерганные" куски кода из FLASH. Как такое может быть? Из-за этого программа в произвольных местах уходит в никуда. Копирую из FLASH следующей функцией MemCopy(&g_text_load_start, &g_text_load_end, &g_text_run_start); Enthusiast, у Вас код расположен во FLASH, и в RAM Вы грузите только часть функций, а я бы хотел в RAM грузить все. Благо проект достаточно маленький и в RAM помещается. Разумеется, что хозяин - барин, однако почему бы тогда просто не скопировать все функции из флэши в ОЗУ тем способом, который использовал я? На мой взгляд, этот способ довольно прост и работает на практике. Успехов! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
QuadMan 0 30 мая, 2011 Опубликовано 30 мая, 2011 · Жалоба Здравствуйте! Возник еще один вопрос. Программа увеличилась в размерах, и теперь не умещается в область RAM_H0. В RAM-версии часть функций перенес в RAM_LO, часть в RAM_H0. Теперь хотелось бы загружаться из FLASH, но копируя ВСЮ программу в RAM - часть в H0, часть в L0. Можно ли это сделать? Сейчас в cmd файле у меня такое объявление: .text : LOAD = FLASH_D, PAGE = 0 RUN = RAM_H0, PAGE = 0 LOAD_START(_g_text_load_start), LOAD_END (_g_text_load_end), RUN_START (_g_text_run_start) а при загрузке копируется в RAM так: src = &g_text_load_start; dst = &g_text_run_start; size = &g_text_load_end - &g_text_load_start; while(size-- > 0) *dst++ = *src++; Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться