2017-12-28 11 views
2

특정 주소 (예 : Double function indirection in C)에서 함수를 호출해야하지만 정확히 같지는 않습니다. 필자는 매핑 테이블에서 포인터를 가져 와서 동적으로 생성 된 함수 포인터를 조작 할 수 있습니다. 예, 나는 이러한 유형의 통화 않도록하려면 대신ARM Cortex M3의 GCC : 특정 주소의 함수 호출

((int)(*)(void*)) compute_volume = ((int)(*)(void*)) 0x20001000; 

int vol = (*compute_volume)(); 

을, 나는 compute_volume() 기능이 다른 이미지에 의해 제공되는 것을 제외하고는 다음을 달성하기 위해 링커 제공 기호 또는 다른 방법의 일종을 사용하는 것을 선호 이 같은 아마 뭔가 :

extern int compute_volume(void); 

vol = compute_volume(); 

즉, 나는 이렇게 플래시마다 기호 나 계산 변경 사항을 수정하거나 덮어 쓰기의 필요성을 줄이고, 여러 개의 이미지로 내 코드를 분할 할 계획입니다.

의견이나 제안이 있으십니까?

+0

함수 포인터는이를 수행하도록 설계되었습니다. 그러나 문법이 당신을 괴롭히는 경우,이 경우에는 #define 또는 아마도 [typedef] (https://stackoverflow.com/questions/4295432/typedef-function-pointer) –

+0

또는 http : // blog를 사용할 수 있습니다. .atollic.com/gnu-gcc-on-arm-cortex-devices-place-code-and-data-on-special-memory-addresses-gnu-ld- 링커 사용 –

+0

참고로 * 마이크로 컨트롤러 플래시 메모리가 마모 레벨링을하지 않기 때문에 매번 전체 플래시를 다시 쓰는 것에 비해 업데이트주기를 줄이지는 않습니다. –

답변

0

동일한 플래시 영역에 항상 존재할 점프 테이블을 정의 할 수 있습니다. (필자가 생각하는 코드에서 링커와 pragmas에 해당 영역을 정의 할 수 있습니다.) 호출되면 원하는 기능으로 점프합니다.

펌웨어 부분에서는 "전달"기능 주소를 나타내는 기호 만 정의합니다 (동일한 지역에 항상 유지하면 추후 업데이트가 훨씬 쉽게 이루어집니다). 펌웨어 파트 II에서는 펌웨어 파트 I에서 참조했던 주소 공간에있는 점프 테이블을 만들고 실제 기능을 호출합니다.

정확하게 설명했지만 100 % 확신 할 수는 없지만이 방법으로 문제를 해결할 수 있습니다. 링크 Ø가 제공되면 점프 테이블 코드를 한 곳에 배치하는 데 도움이됩니다.

관련 문제