|
|
  |
AT91SAM7x, проблемы с распределением памяти |
|
|
|
Apr 27 2010, 17:43
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Здравствуйте. Такая проблема - Во время очередного компилирования кода, IAR вдруг стал выдавать ошибку Error[lp011]:section placement failed: unable to allocate space for section with a total bytes in [0x00200100 - 0x20ffff]. Программу гружу в режиме Debuge. правильно ли понимаю, что ругается на слишком длинный код для RAM? Код занимает уже 61кВ, RAM в at91sam7x256 - 64 кВ. Пробую прошить вo flash - iar зависает и ругается Prefect Handler: SWI_Handler///+1 symbol not displayed: 0x10a6b8:0xeafffffe Abort Handler. Во время работы когда-то правила линковочные файлы, может, дело не в размере кода, а просто что-то неправильно написала? Вот линковочные файлы. Подскажите, кто-нибудь!
Прикрепленные файлы
flash.txt ( 2.84 килобайт )
Кол-во скачиваний: 102
sram.txt ( 2.21 килобайт )
Кол-во скачиваний: 66
|
|
|
|
|
Apr 27 2010, 18:57
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Daria @ Apr 27 2010, 21:43)  правильно ли понимаю, что ругается на слишком длинный код для RAM? Код занимает уже 61кВ, RAM в at91sam7x256 - 64 кВ. Правильно понимаете. Цитата(Daria @ Apr 27 2010, 21:43)  Пробую прошить вo flash - iar зависает и ругается Prefect Handler: SWI_Handler///+1 symbol not displayed: 0x10a6b8:0xeafffffe Abort Handler. Посмотрите, откуда и почему процессор вылетает в исключение. Сделать это можно проанализировав адрес возврата LR_Abt или, если он испорчен, что более чем вероятно при Prefetch Abort, проанализировав регистр LR исходного режима.
|
|
|
|
|
May 5 2010, 17:54
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Такая проблема. не выпоняется команда на запись во flash. Функции взяла из примера, и раньше все вроде работало, пока работала в режиме Debuge. не знаю. в этом ли дело. но после перехода на режим relese программа стала зависать после записи в регистр команды FMR. При этом, если поставить точку останова на следующей команде после записи в регистр FMR, то после запуска команда выполнится и никаких порблем не возникнет. Вот функци я записи. Код unsigned char CEfc::EFC_PerformCommand( AT91S_EFC *pEfc, unsigned char command, unsigned short argument) { unsigned int status;
// Set FMCN switch (command) {
case AT91C_MC_FCMD_LOCK: case AT91C_MC_FCMD_UNLOCK: #if (EFC_NUM_GPNVMS > 0) case AT91C_MC_FCMD_SET_GP_NVM: case AT91C_MC_FCMD_CLR_GP_NVM: #endif #if !defined(EFC_NO_SECURITY_BIT) case AT91C_MC_FCMD_SET_SECURITY: #endif pEfc->EFC_FMR = (pEfc->EFC_FMR & ~AT91C_MC_FMCN) | FMCN_BITS(lMck); break;
case AT91C_MC_FCMD_START_PROG: case AT91C_MC_FCMD_ERASE_ALL: pEfc->EFC_FMR = (pEfc->EFC_FMR & ~AT91C_MC_FMCN) | FMCN_FLASH(lMck); break; }
pEfc->EFC_FCR = (0x5A << 24) | (argument << 8) | command; do { status = pEfc->EFC_FSR; } while ((status & AT91C_MC_FRDY) == 0);
return (status & (AT91C_MC_PROGE | AT91C_MC_LOCKE)); } Если поставить точку останова на status = pEfc->EFC_FSR;потом запустить снова - никаких проблем, массив запишется во flash. если не ставить, то iar будет ругаться Abort Handler. Скорость FMCN_FLASH(mck) ((((mck) / 2000000) * 3) << 16) mck 48МГц, FWS=1 в чем может быть дело?
|
|
|
|
|
May 10 2010, 09:04
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(Сергей Борщ @ May 6 2010, 13:46)  Раньше было ключевое слово __ramfunc, поищите его в описании компилятора. А тут пример, какую минимально необходимую часть кода надо выносить в ОЗУ. Спасибо, это мне поможет. Но вот такой еще вопрос - раньше я располагала константные массивы данных во flash следующим образом - в icf фале Код define symbol __ICFEDIT_region_ROM_end__ = 0x13FFFF;
define region MYINFOSEG1_region = mem:[from 0x13EBFF to 0x13FFFF];
place in MYINFOSEG1_region {section .MYINFOSEG1_section}; в своем сишном файле Код _Pragma(location= "/.MYINFOSEG1_section/") const unsigned int massive A={55,6,6,9... и т.д.} все вроде было нормально. Теперь припрошивке проекта во flash. массив стал располагаться в ОЗУ, а во flash не помещается Что нужно изменить?
|
|
|
|
|
Jun 26 2010, 18:22
|
Местный
  
Группа: Участник
Сообщений: 229
Регистрация: 24-02-08
Пользователь №: 35 345

|
Цитата(Сергей Борщ @ May 6 2010, 13:46)  Раньше было ключевое слово __ramfunc, поищите его в описании компилятора. А тут пример, какую минимально необходимую часть кода надо выносить в ОЗУ. С большим опазданием хочу высказать огромное спасибо Сергею  Долго не могла попасть на форум, ошибка IPS Driver Error. Поэтому моя благодарность задержалась на целый месяц  А вообще, действительно, __ramfunc - и все очень просто, и вовсе не надо править линковочные файлы
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|