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

BF518 - слетает программа

Всем день добрый, прошу помощи у знающих.

Прграмма может отработать сутки, двое.., а потом вылететь. Как вариант - портится стек, т к прерывания вложенные, может кто-то что-то не сохраняет, вот пример дизасма:

/-------------------------------------------------------------------
//  Procedure statistics:
//  Frame size            = 172 
//  Scratch registers used: {R0-R3,P0-P2,I0-I3,B0-B3,M0-M3,A0-A1,ASTAT0-ASTAT1,CC,AQ,LC0-LC1,LT0-LT1,LB0-LB1}
//  Call preserved registers used: {R4-R7,P4-P5,FP,SP,L0-L3,RETS,RETI}
//  Registers that could be clobbered by function calls: {R0-R3,P0-P2,I0-I3,B0-B3,M0-M3,A0-A1,ASTAT0-ASTAT1,CC,AQ,LC0-LC1,LT0-LT1,LB0-LB1,RETS,SEQSTAT,SYSCFG,USP}
//-------------------------------------------------------------------
// line ".\SHR-2.c":4310
    LINK 0;
    [--SP] = RETI;
    [--SP] = ASTAT;
    [--SP] = (R7:0);
    [--SP] = P0;
    [--SP] = P1;
    [--SP] = P2;
    [--SP] = P4;
    [--SP] = P5;
    [--SP] = A0.W;
    [--SP] = A0.X;
    [--SP] = A1.W;
    [--SP] = A1.X;
    [--SP] = L0;
    [--SP] = L1;
    [--SP] = L2;
    [--SP] = L3;
    [--SP] = I0;
    [--SP] = I1;
    [--SP] = I2;
    [--SP] = I3;
    [--SP] = B0;
    [--SP] = B1;
    [--SP] = B2;
    [--SP] = B3;
    [--SP] = M0;
    [--SP] = M1;
    [--SP] = M2;
    [--SP] = M3;
    [--SP] = LC0;
    [--SP] = LC1;
    [--SP] = LT0;
    [--SP] = LT1;
    [--SP] = LB0;
    [--SP] = LB1;
    L0 = 0;
    L1 = 0;
    L2 = 0;
    L3 = 0;
    SP += -12;

Это обаботчик тика таймера, в нем вызываются др подпрограммы. Может надо все регистры сохранять?

Как отлавливать подобные ошибки?

 

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


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

RETS надо сохранять

 

Например, если на C в VDSP, то делаю так:

_Pragma("interrupt_reentrant")
_Pragma("interrupt")
void UART_RX_ISR(void)
{
...
}

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


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

Это обаботчик тика таймера, в нем вызываются др подпрограммы. Может надо все регистры сохранять?

Общие правила:

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

2. Если вызывается подпрограмма (функция), то сохранять надо все scratch регистры (т.к. неизвестно, какие из них будет использовать вызываемый код). Call preserved, как подсказывает название, сохранять не нужно (их при необходимости обязан сохранять вызываемый код). Какие регистры scratch, а какие call preserved, указано в шапке комментария в вашем коде.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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