1차 해결 방법...
부트로더를 작성하던 도중 특정 플래시 메모리 번지로 점프만 하면 Hard fault가 발생하는 문제가 발생했다.
디버거를 통해 한줄 한줄 확인하다 보니, HAL_RCC_DeInit() 함수에서 weak symbol을 지닌 함수가 호출되는 것을 발견, 실제 strong symbol의 함수가 선언되어 있는데도 말이다.
아마 링커가 여러개의 함수를 체크하고 그 중에 우선순위가 높은 함수를 선택해야 하는데, 처음 발견된 함수 1개만 체크한 것 같다.
- https://mcuoneclipse.com/2013/10/16/link-order-using-multiple-definitions-with-arm-gnu-linker-and-eclipse/
- -z muldefs 옵션을 Linker other flags에 넣으면 해결됨.
- 같은 symbol을 여러개 정의하는 것을 허용해주는 옵션 ( 아마 이를 통해서 링커가 모든 정의를 확인하고 strong symbol을 선택 해주는 것 같음 )
2차 해결 방법
> 1차 해결 방법을 통해 잠깐 되는 듯 했으나.. 다시 안되는 현상 발견.. 이유를 찾아보니 *.a 아카이브 파일을 라이브러리로 사용 중이였는데, 라이브러리 파일 내에서 이 현상을 해결하는게 복잡하다고 하더라.. 임시로 아카이브 파일 안쓰고 소스코드를 모두 연결해서 해결.
'Cortex' 카테고리의 다른 글
STM32 - BIN파일과 HEX 파일의 차이 (0) | 2021.06.01 |
---|---|
STM32F4 SPI Communication (0) | 2014.06.05 |