Перейти к содержанию
    

проблема при работе из FLASH

Подскажите, пожалуйста, в чем может быть проблема... использую 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
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно попробовать использовать мои рабочие командные файлы, которые я описал здесь. Затем можно попробовать увеличить размер стека, если предыдущий шаг не поможет. Удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас посмотрел, вижу что во FLASH записывается все нормально, а то, что лежит уже в RAM представляет собой "надерганные" куски кода из FLASH. Как такое может быть? Из-за этого программа в произвольных местах уходит в никуда.

 

Копирую из FLASH следующей функцией MemCopy(&g_text_load_start, &g_text_load_end, &g_text_run_start);

 

Enthusiast, у Вас код расположен во FLASH, и в RAM Вы грузите только часть функций, а я бы хотел в RAM грузить все. Благо проект достаточно маленький и в RAM помещается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно где-то данные и код лежат по одним адресам. У меня было такое - вызывал memset для области памяти где лежал код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас посмотрел, вижу что во FLASH записывается все нормально, а то, что лежит уже в RAM представляет собой "надерганные" куски кода из FLASH. Как такое может быть? Из-за этого программа в произвольных местах уходит в никуда.

 

Копирую из FLASH следующей функцией MemCopy(&g_text_load_start, &g_text_load_end, &g_text_run_start);

 

Enthusiast, у Вас код расположен во FLASH, и в RAM Вы грузите только часть функций, а я бы хотел в RAM грузить все. Благо проект достаточно маленький и в RAM помещается.

Разумеется, что хозяин - барин, однако почему бы тогда просто не скопировать все функции из флэши в ОЗУ тем способом, который использовал я? На мой взгляд, этот способ довольно прост и работает на практике. Успехов!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте!

 

Возник еще один вопрос.

Программа увеличилась в размерах, и теперь не умещается в область 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++;

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...