환경 : WIN7(64BIT), DSP28335(보급형모델_SYNCWORKS), CCS5, SDS100i(syncworkds usb emulator)
문제점 : FLASH에 코딩후 알 수 없는 문제로 다음의 인터럽트에서 무한 반복이 발생하는 문제.. 흔히들 똥통에 빠진다고 한다.
interrupt void ILLEGAL_ISR(void) // Illegal operation TRAP
{
asm(" ESTOP0");
for(;;);
}
문제의 소스 코드:
void Inv_Matrix(double (*inv_matrix)[9], char n) {
double inv_temp[9][18];
double ratio, a;
int i, j, k, p, q;
p=2*n;
.
.
.
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (i != j) {
ratio = inv_temp[j][i] / inv_temp[i][i]; //ratio = inv_temp[j][i] / inv_temp[i][i];
for (k = 0; k <p; k++) {
inv_temp[j][k] = inv_temp[j][k]- (ratio * inv_temp[i][k]);
}
}
}
}
.
.
.
}
문제의 원인 : 2차원 배열의 변수 크기 지정에서 문제가 발생하였다. 역행렬 함수를 생성하기위해 가우스 제거법을 사용하였다. 여기선 9X9 행렬을 역행렬로 변환하기 위해서 최소 9X18의 2차원 공간이 필요하였다. 그래서 필자는 아무 생각없이 25X25의 2차원 행렬을 생성하였고, MS의 비쥬얼 스튜디오에서 잘 동작됨을 확인한 후 , Matlab의 역함수를 이용하여 값까지 비교하여, 잘동작됨을 하였다.
제일 큰 문제의 원인은 이 점이었다. -> 9X18의 2차원 배열을 생성했어야 했다.
위의 소스코드상 9x18의 2차원 배열요소만 사용하고, 나머지 빈공간은 빈공간의 상태로 두자 맨처음에 언급했던 문제가 발생하였다. 초기화되지 않은 빈공간의 배열요소를 사용하면 문제가 발생하였다.
해결책 :
double inv_temp[25][25]; => double inv_temp[9][18];
으로 수정하니 너무도 잘되었다.
끝.
PS. 저 부분에서 에러가 난것을 확인한건.. 소스 마다 시리얼 통신으로 하나씩 모두 확인하여 알게되었다.. 다른 좋은 방법이 있으면 알려주시면 감사하겠습니다.
'연구&개발 > DSP28335' 카테고리의 다른 글
DSP sprintf 문제시 (0) | 2012.11.20 |
---|---|
DSP28335 - SCI -A,B,C 인터럽트 동작허용시 주의할점. (1) | 2012.10.25 |
DSP28335 float to string 문제해결 (0) | 2012.10.25 |