Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: arm7, flash vs ram , проц сам резетится
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
buletz
Отлаживаю проц через IAR workbench 4.30, проц LPC2138
короче беда в том, что когдf прошиваю проц в RAM - все работает ОК. Как только прошиваю проц во FLASh, то проц периодически сам резетится.
Шью одну и ту же компиляцию проги.
В чем может быть проблема ?
GetSmart
а попробуй разные компиляции проги ;-(
VAI
Цитата
а попробуй разные компиляции проги ;-(

правильно. Прога настроенная для работы в RAM и настроенная для работы во флэшь - разные.
buletz
в IAR-е есть удобная вещь, это Debug и Release варианты (один и тот же проект, но с разными настройками). Соотв-но у меня Debug - это RAM вариант, а Release- это FLASH вариант.
В RAM и FLASH вариантах у меня подключается разные конфиг. файлы линкера, в которых прописаны области памяти.

Но сами исходники (на си) у меня не отличаются.

Я локализовал проблему - сброс проца наблюдается, если разрешить прерывание по последовательному каналу. И вероятно сброс происходит когда по каналу что-то приходит, т.е. возникает прерывание.

Непонятно одно : при работе из RAM - все нормально, никаких неожиданных сбросов (reset) проца нет!

Не могу логически понять, как это может быть ? МОжет кто сталкивался ?
DASM
А REMAP какой ?
Andy Mozzhevilov
Почитайте поток моего сознания:
http://electronix.ru/forum/index.php?showtopic=20923&hl=
может происходит что-то схожее. UART может наcтраиваться бутлоадером, к примеру, который
успевает стартовать, если внешний пин P0.14 сидит всегда в нуле.
buletz
2DASM: a REMAP это что ?

память конфигурится у меня так:
// Memory Accelerator Module (MAM) definitions
// <o1.0..1> MAM Control
// <0=> Disabled
// <1=> Partially Enabled
// <2=> Fully Enabled
// <i> Mode
// <o2.0..2> MAM Timing
// <0=> Reserved <1=> 1 <2=> 2 <3=> 3
// <4=> 4 <5=> 5 <6=> 6 <7=> 7
// <i> Fetch Cycles
MAMTIM = 0x04;
MAMCR = 0x02;

#ifdef USER_RAM
MEMMAP = 2;
#endif
#ifdef USER_FLASH
MEMMAP = 1;
#endif
SpiritDance
А если оптимизатор в релиз-варианте выключить?
buletz
оптимизация : None (best debug support)
т.е. оптимизации нет

2Andy Mozzhevilov: как я понял, у вас была обратная проблема. Т.е. во flash все работало нормально, а при отладке из RAM были глюки из-за того что переферия конфигурилась неправильно.
У меня получается наоборот, в RAM все ок, а во FLASH спонтанные резеты.

Может возникает какой-нибудь exception?
Типа Undefined instruction, Prefetch abort, Data abort...
не дадите исходник как обрабатывать произвольный exception, а не IRQ ?

У меня стоит следующая процедурка для обработки прерываний
//---------------------------------------------------------------------------------------
#pragma vector=0x18
__irq __arm void IRQ_ISR_Handler (void)
{
void (*interrupt_function)();
unsigned int vector;

vector = VICVectAddr; // Get interrupt vector.
interrupt_function = (void(*)())vector;
(*interrupt_function)(); // Call vectored interrupt function.
}
Andy Mozzhevilov
Цитата(asdjkasdjkalsdjkl @ Mar 23 2007, 20:31) *
оптимизация : None (best debug support)
т.е. оптимизации нет

2Andy Mozzhevilov: как я понял, у вас была обратная проблема. Т.е. во flash все работало нормально, а при отладке из RAM были глюки из-за того что переферия конфигурилась неправильно.
У меня получается наоборот, в RAM все ок, а во FLASH спонтанные резеты.

Может возникает какой-нибудь exception?
Типа Undefined instruction, Prefetch abort, Data abort...


Так проверьте.
На все вектора как минимум затычки типа:
Код
#pragma vector = 0x04
__irq __arm void undef_instr_isr(void)
{
    while(1)
    {
    }
}

#pragma vector = 0x08
__irq __arm void swi_isr(void)
{
    while(1)
    {
    }
}

#pragma vector = 0x0c
__irq __arm void prefetch_abort_isr(void)
{
    while(1)
    {
    }
}

#pragma vector = 0x10
__irq __arm void data_abort_isr(void)
{
    while(1)
    {
    }
}


Вот мой обработчик irq:
Код
typedef void (*PFNCT)(void);

void irq_isr (void)
{
    PFNCT    pfnct;

    pfnct = (PFNCT)VICVectAddr;                      /* Read the interrupt vector from the VIC         */
    while (pfnct != (PFNCT)0)                        /* Handle ALL interrupting devices                */
    {
        (*pfnct)();                                  /* Call ISR for interrupting device               */
        VICVectAddr = 0;                             /* update priority hardware                       */

        pfnct = (PFNCT)VICVectAddr;                  /* Read the interrupt vector from the VIC         */
    }
}
buletz
а что за затычки такие, типа while (1) {}
если он в них попадет, то уже никогда не выйдет из них
зачем так?
может надо делать пустое тело затычки {}
?
Andy Mozzhevilov
Цитата(asdjkasdjkalsdjkl @ Mar 26 2007, 12:19) *
а что за затычки такие, типа while (1) {}
если он в них попадет, то уже никогда не выйдет из них
зачем так?
может надо делать пустое тело затычки {}
?


При попадании туда он будет крутиться в бесконечном цикле.
Вы в отладчике нажмете стоп и увидите, куда он упал.
Если хотите, чтобы он выходил из исключения, то нужно обработать исключение корректно.
Сейчас вам нужно просто увидеть, куда он падает. Если сейчас у вас нет векторов по исключениям, а проц в них попадает, то выполняются случайные команды, который возможно и приводят к похожим на ресет последствиям.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.