장치 : dsPIC33FJ128GP802절대 주소
.global _D1
.section .speex, code
_D1:
.pword 0x66C821, 0x1B0090, 0xD96C36, 0x9B60B0, 0xDD4E36, 0xBF4E53
.pword 0xD1098B, 0x719BD9, 0x873989, 0x003B69, 0x279035, 0xED4244
.pword 0xE1403C, 0x54D439, 0x826550, 0xC59627, 0xDD0432, 0x88FA29
가 나는 *의 .H에서 같은 선언은 다음과 같이 좀 * .S 파일이
extern void D1(void);
이제 D1을 테이블 읽기 함수로 전달합니다.
nowPlaying.file1 = (unsigned long) D1;
function(nowPlaying.file1);
제 문제는 D1의 주소가 0x8000보다 높으면 루틴이 올바르지 않다는 것입니다. 크고 작은 코드 모델을 시도했지만 결과는 같습니다. 나는 이것이 포인터의 16 비트 한계 때문이라고 생각한다. 코드에서 직접적으로 D1의 절대 주소에 액세스 할 수있는 방법이 있습니까? 아마도 빌트인 함수 나 매크로 같은 것일 수 있습니다.
MPLAB XC16 C 컴파일러가 완전히, 함수 포인터를 지원하는 기능이 간접적으로 호출 할 수있는 :
컴파일러 설명서 말한다 있습니다. 함수 포인터는 항상 16 비트 폭입니다. 내가 electronics.stackexchange.com에서 썼던 것처럼
내가
.s 파일의 내용이 실제로 코드인지 데이터인지 여부에 대해 여러 번 묻습니다. '함수가 올바르지 않습니다.'를 정의하십시오. 전자 제품으로 돌아 가기보다는 여기에서 전체 대화를 계속하십시오. 그렇지 않으면 내가 여기에 게시하는 요점을 볼 수 없습니다. – EJP