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:
Pourquoi '& ram_vector + 1' et pourquoi' & multiply - 1' pourquoi ne pas simplement ram_vector et multiplier? – cleblanc
parce que le processeur est ARM – Augusto
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. –