Wednesday, March 7, 2012

Cortex-M3(lm3s808, lm3s811 등)가 FaultISR()에 빠질때 해결방법.

증상:
FaultISR() 에 들어가 while(1) 무한 루프 도는 현상이 랜덤하게 생긴다.
왜그런지 알 수가 없이 그냥 뒤진다.


그건 심각한 오류가 발생했을때 그렇게 되는데 거의 두가지 이유다.
1. GPIO 나 USART 같은 포트를 초기화 하지 않고 사용하려 했을때.
2. System stack 이 overflow 됐을때.

해결 방법:
1. GPIO 나 포트 문제: 초기화 하고 사용하라.
2. System stack 이 overflow 됐을때는 스택 사용을 줄이든가, startup.c 의 static unsigned long pulStack[xx] @ ".noinit"; 부분의 xx를 늘려라. 단, CPU의 ram 크기에 따라서 적당히 늘려야 한다.
특히 인터럽트 핸들러를 사용하는 경우에 스택 사용이 몰리는 현상을 예측하기 어려우므로 인터럽트 핸들러를 많이 사용하는 경우에는 핸들러 안에서 스택사용을 줄이고, main 함수에서도 마찬가지로 스택 사용을 줄인다.
스택 사용을 줄이는 방법은 지역 변수 사용하지 말고 전역 변수 사용하기. 임시로 메모리 써야 할때는 malloc 해서 heap 에다가 할당 받아 사용하고 해제하기. 재귀 호출 같은거 하지 말기.

3. 또, 왜그런지는 알 수 없지만 실수 연산 할때 뒤지면 형을 강제로 맞춰라. 예를 들어 float x = (float)1 / 2.0; 이라고 하면 뒤의 2.0은 float 인지 double 인지 알수 없지만 기본적으로 double로 될것이다. 그러면 double 갔다가 float랑 연산하느라 float가 double로 변했다가 또 다시 변수에 들어가느라 float로 형변환 해야 하므로,
float x = (float)1.0 / (float)2.0; 식으로 쓰면 전체적으로 float만 있게 된다.

No comments:

Post a Comment