1

장치 : 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에서 썼던 것처럼

내가

https://electronics.stackexchange.com/questions/56858/absolute-address-of-a-function-in-microchip-xc16

+0

.s 파일의 내용이 실제로 코드인지 데이터인지 여부에 대해 여러 번 묻습니다. '함수가 올바르지 않습니다.'를 정의하십시오. 전자 제품으로 돌아 가기보다는 여기에서 전체 대화를 계속하십시오. 그렇지 않으면 내가 여기에 게시하는 요점을 볼 수 없습니다. – EJP

답변

0

에서 같은 질문을 게시, 당신은 기본적으로 unsigned long, 때를하는 것을 캐스트, D1에 대해 컴파일러에 거짓말 서명되지 않은 long이 아닙니다. 이것은 트랙 아래로 문제를 일으킬 가능성이 매우 높습니다. D1에서 시작하는 물건 C 호출 규칙을 따르는 수있는 코드 인 경우

, D1extern void D1(void)로 선언되어야하며, 모든 구조체 멤버와 변수의 주소를 취할 매개 변수는 void (*D1)(void)로 선언해야합니다, 당신은 할 수 (*var)() 구문을 사용하여 값을 호출하십시오. nowPlaying.file1 변수가 무엇인지 알 수 없습니다. function()이 위와 같이 올바르게 선언 된 경우 function(D1)으로 전화하면됩니다.

데이터 인 경우 const short D1[]이어야하며 어셈블러가 필요하지 않습니다. C 값을 const short D1[] = {...};으로 제공 할 수 있습니다. 컴파일러는 코드 세그먼트에 D1을 넣어야합니다 (const).

+0

@downvoter 설명해주십시오. 목적을 위해 제공된 구문을 사용하여 함수 포인터를 입력하면 안되며 왜 부호없는 long 및 back으로 캐스팅하는 것이 우월한 지 말해주십시오. – EJP

0

dspic 플래시 크기는 16 비트보다 클 수 있습니다. 당신의 부분은 128kb 코드 플래시를 가지고 있습니다. 이것을 16 비트 정수로 어떻게 채우고 싶습니까?