如何在 C 中的 STM32 QEMU 调试器 eclipse 上从 RAM 内存执行函数?

Posted

技术标签:

【中文标题】如何在 C 中的 STM32 QEMU 调试器 eclipse 上从 RAM 内存执行函数?【英文标题】:How to execute a function from RAM memory on STM32 QEMU debugger eclipse in C? 【发布时间】:2018-02-15 10:40:37 【问题描述】:

我正在使用 STM32 QEMU 调试器来测试代码。我删除了 while(1),因为我只是测试了函数。

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);发生以下错误:

【问题讨论】:

为什么 &amp;ram_vector + 1 和为什么 &amp;multiply - 1 为什么不只是 ram_vector 和乘法? 因为处理器是ARM​​ arm 不需要 + 1,这在很多方面都是一个错误,或者用 1 表示,确保安全,但这只是意味着您使用的工具不正确。 cortex-ms 有一个向量表,而不是你刚开始执行的入口点,如果你想在 ram 中运行而不使用地址 0x00000000 向量表,那么对 ram 使用不同的引导程序......从 rom 复制并跳转。跨度> 你的qemu线路是什么?您在 qemu 中使用什么机器/目标?你想在哪里执行程序? STM32F407VG,我不知道RAM在哪里,我认为是在MCU中。 【参考方案1】:

您没有复制足够的字节。你的 memorycopy 函数只复制 6 个字节,你想要 6 个整数,不是吗?

【讨论】:

我在调试生成的内存映射上检查的大小 当我在我的 x86 上测试这个时,我去掉了 +1 -1 并复制了 4*size 字节并且它可以工作。 我去掉 +1 和 -1,改变大小做 24。保持不工作

以上是关于如何在 C 中的 STM32 QEMU 调试器 eclipse 上从 RAM 内存执行函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决在QEMU上仿真STM32F429时出现的问题

STM32 KEIL C如何在RAM中调试FREERTOS?

基于 QEMU进行 STM32 仿真开发

Qemu STM32 仿真

STM32中的下载与调试?

用STM32调试的程序老错误,不知道怎么解决