novlev 0 31 октября, 2014 Опубликовано 31 октября, 2014 · Жалоба Всем день добрый, прошу помощи у знающих. Прграмма может отработать сутки, двое.., а потом вылететь. Как вариант - портится стек, т к прерывания вложенные, может кто-то что-то не сохраняет, вот пример дизасма: /------------------------------------------------------------------- // 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; Это обаботчик тика таймера, в нем вызываются др подпрограммы. Может надо все регистры сохранять? Как отлавливать подобные ошибки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Valery_P 0 24 ноября, 2014 Опубликовано 24 ноября, 2014 · Жалоба RETS надо сохранять Например, если на C в VDSP, то делаю так: _Pragma("interrupt_reentrant") _Pragma("interrupt") void UART_RX_ISR(void) { ... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 33 24 ноября, 2014 Опубликовано 24 ноября, 2014 · Жалоба Это обаботчик тика таймера, в нем вызываются др подпрограммы. Может надо все регистры сохранять? Общие правила: 1. Если из обработчика прерываний ничего не вызывается, то сохранять только те регистры, которые используются в этом обработчике. 2. Если вызывается подпрограмма (функция), то сохранять надо все scratch регистры (т.к. неизвестно, какие из них будет использовать вызываемый код). Call preserved, как подсказывает название, сохранять не нужно (их при необходимости обязан сохранять вызываемый код). Какие регистры scratch, а какие call preserved, указано в шапке комментария в вашем коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться