Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7x
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Daria
Здравствуйте. Такая проблема - Во время очередного компилирования кода, 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.
Во время работы когда-то правила линковочные файлы, может, дело не в размере кода, а просто что-то неправильно написала?
Вот линковочные файлы. laughing.gif
Подскажите, кто-нибудь! help.gif
aaarrr
Цитата(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 исходного режима.
Daria
Цитата(aaarrr @ Apr 27 2010, 21:57) *
Правильно понимаете.
Посмотрите, откуда и почему процессор вылетает в исключение.

А в файлах все в порядке?smile.gif
Daria
Такая проблема.
не выпоняется команда на запись во 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
в чем может быть дело?
aaarrr
Цитата(Daria @ May 5 2010, 21:54) *
в чем может быть дело?

Например, Вы пытаетесь запустить команду, выполняя при этом программу из флеш. Во время работы с EFC (после записи FCR и до установки FRDY) любые обращения к флеш должны быть исключены.
Daria
Цитата(aaarrr @ May 5 2010, 20:58) *
Например, Вы пытаетесь запустить команду, выполняя при этом программу из флеш. Во время работы с EFC (после записи FCR и до установки FRDY) любые обращения к флеш должны быть исключены.

Но я так понимаю, что в режиме release, программа исполняется из flash. Как быть? unsure.gif Запретить все прерывания, остановить pdc... что еще?smile.gif
aaarrr
Цитата(Daria @ May 5 2010, 22:43) *
что еще?smile.gif

Еще перенести EFC_PerformCommand (или его часть от записи EFC_FCR и ниже) в RAM.
Daria
Цитата(aaarrr @ May 5 2010, 23:46) *
Еще перенести EFC_PerformCommand (или его часть от записи EFC_FCR и ниже) в RAM.

А как? Я непонятливая laughing.gif
aaarrr
Уложить функцию в отдельную секцию, саму секцию в скрипте линкера определить в RAM. Точную последовательность не напишу, ибо IAR'ом не пользуюсь, но уверен, что данный пласт проблем не обойден в мануале.
Daria
Цитата(aaarrr @ May 6 2010, 11:46) *
Уложить функцию в отдельную секцию, саму секцию в скрипте линкера определить в RAM. Точную последовательность не напишу, ибо IAR'ом не пользуюсь, но уверен, что данный пласт проблем не обойден в мануале.

Никак не могу найтиsad.gif А методом тыка не получаетсяsad.gif
Сергей Борщ
Цитата(Daria @ May 6 2010, 11:50) *
Никак не могу найтиsad.gif А методом тыка не получаетсяsad.gif
Раньше было ключевое слово __ramfunc, поищите его в описании компилятора. А тут пример, какую минимально необходимую часть кода надо выносить в ОЗУ.
Daria
Цитата(Сергей Борщ @ 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 не помещается unsure.gif
Что нужно изменить?
Daria
Цитата(Сергей Борщ @ May 6 2010, 13:46) *
Раньше было ключевое слово __ramfunc, поищите его в описании компилятора. А тут пример, какую минимально необходимую часть кода надо выносить в ОЗУ.

С большим опазданием хочу высказать огромное спасибо Сергею biggrin.gif Долго не могла попасть на форум, ошибка IPS Driver Error. Поэтому моя благодарность задержалась на целый месяц laughing.gif
А вообще, действительно, __ramfunc - и все очень просто, и вовсе не надо править линковочные файлы
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.