2017-09-06 1 views
0

J'utilise le débogueur QEMU STM32 pour tester le code. J'efface le moment (1) parce que je viens de tester la fonction.Comment exécuter une fonction à partir de la mémoire RAM sur STM32 QEMU debugger eclipse dans C?

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"); 
} 

Mais quand je l'appelle la fonction i = fnc_ram (3); l'erreur de suivi se produit: enter image description here

+1

Pourquoi '& ram_vector + 1' et pourquoi' & multiply - 1' pourquoi ne pas simplement ram_vector et multiplier? – cleblanc

+0

parce que le processeur est ARM – Augusto

+0

bras ne nécessite pas un + 1, c'est un bug de plusieurs façons, orred avec 1, sûr pour la sécurité, mais cela signifie simplement que vous utilisez les outils de manière incorrecte. les cortex-ms ont une table de vecteurs pas un point d'entrée que vous commencez à exécuter, si vous voulez exécuter en RAM et n'utilisez pas la table vectorielle 0x00000000, utilisez un bootstrap différent pour ram ... copier depuis rom et sauter. –

Répondre

0

Vous ne copiez pas suffisamment d'octets. Votre fonction memorycopy ne copie que 6 octets et vous voulez 6 entiers, n'est-ce pas?

+0

La taille que je vérifie sur la carte mémoire générée par le débogage – Augusto

+0

Lorsque j'ai testé cela sur mon x86 je me suis débarrassé de la +1 +1 et la copie 4 * octets de taille et cela fonctionne. – cleblanc

+0

Je débarrasse +1 et -1, et change la taille do 24. Ne pas travailler – Augusto