2017-09-06 13 views
0

코드를 테스트하기 위해 STM32 QEMU 디버거를 사용합니다. 나는 함수를 테스트하기 때문에 while (1)을 지운다.STM32의 RAM 메모리에서 함수를 실행하는 방법 C에서 QEMU 디버거 이클립스?

typedef int(*fnc_t) (int); 

int multiply(int data) { 
    return (data * 5); 
} 

void memorycopy(unsigned char *src, unsigned char *dst, int size) { 
    int j; 
    for(j=0; j < size; j++) { 
     dst[j] = src[j]; 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    int i = 0; 
    unsigned int ram_vector[6]; 
    fnc_t fnc_ram; 

    printf("1\n"); 
    fnc_ram = (fnc_t) ((int) &ram_vector + 1); 
    printf("2\n"); 

    volatile int z = (int)(&multiply - 1); 

    memorycopy((unsigned char*) z, (unsigned char*) fnc_ram, 6); 

    printf("3\n"); 
    i = fnc_ram(3); 
    printf("4\n"); 
    printf("Novo i: %d\n",i); 
    printf("5\n"); 
} 

하지만 i = fnc_ram (3) 함수를 호출 할 때; 다음 오류가 발생합니다. enter image description here

+1

왜 '& ram_vector + 1'과 왜'& multiply - 1'이 왜 ram_vector와 곱셈이 아닌가? – cleblanc

+0

프로세서가 ARM – Augusto

+0

이므로 ARM에는 + 1이 필요하지 않습니다. 여러 가지 버그가 있습니다. 1을 사용하여 안전성을 확인했지만 도구가 잘못 사용되었다는 것을 의미합니다. cortex-ms에는 벡터 테이블이 있습니다. 진입 점이 아닙니다. 램에서 실행하고 주소 0x00000000 벡터 테이블을 사용하지 않으려면 RAM에 다른 부트 스트랩을 사용하십시오. ROM과 점프에서 복사하십시오. –

답변

0

충분한 바이트가 복사되지 않습니다. 귀하의 memorycopy 함수는 6 바이트 만 복사하고 6 개의 정수를 원하십니까?

+0

디버그에 의해 생성 된 메모리 맵에서 확인한 크기 – Augusto

+0

내 x86에서 이것을 테스트했을 때 +1 -1을 없애고 4 * 크기의 바이트를 복사하고 작동합니다. – cleblanc

+0

+1과 -1을 제거하고 크기를 24로 변경하십시오. – Augusto