美文网首页优秀文章收录
如何在 Keil 中将函数或变量编译到指定地址 2021-10-

如何在 Keil 中将函数或变量编译到指定地址 2021-10-

作者: 宜居远控 | 来源:发表于2021-10-28 08:38 被阅读0次

    方式一: attribute 属性

    1,将函数加载到指定位置

    示例将 main.c 中的 delay 函数指定到 0x08020000 地址,可以在 c 文件中函数的定义处指定 delay 函数。

    void delay(void) __attribute__ ((section(".ARM.__at_0x08020000")));

    2,将数组加载到指定位置

    int Temp[] __attribute__ ((section(".ARM.__at_0x08020000"))) = {0x1, 0x2};

    3,将变量加载到指定位置

    示例可以直接将 c 代码修改如下:

    const int Temp __attribute__ ((section(".ARM.__at_0x08020000"))) = 10; // RO

    int Temp __attribute__ ((section(".ARM.__at_0x20000000"))) = 10; // RW

    方式二: 修改.sct 文件

    将目标文件加载到指定位置,在 Keil 中使用修改.sct 文件进行分散加载需要对工程配置进行如下修改,修

    改.sct 方法的详细使用请参考.sct 的语法规则,如下图 Keil 下 sct 文件编辑

    其中 Use Memory Layout from Target Dialog 选项是默认勾选,应取消选择。点击 Scatter File 栏后的 Edit

    对.sct 文件进行编辑。

    示例将 core_main.c 的目标文件进行分散加载。


    ; *************************************************************

    ; *** Scatter-Loading Description File generated by uVision ***

    ; *************************************************************

    LR_IROM1 0x08000000 0x00020000 { ; load region size_region

    ER_IROM1 0x08000000 0x00020000 { ; load address = execution address

    *.o (RESET, +First)

    *(InRoot$$Sections)

    .ANY (+RO)

    }

    RW_IRAM1 0x20000000 0x00038000 { ; RW data

    .ANY (+RW +ZI)

    }

    }

    LR_IROM2 0x08020000 0x00020000 { ; load region size_region

    ER_IROM2 0x08020000 0x00020000 { ; load address = execution address

    core_main.o (+RO)

    }

    }

    红色区域表示将以上.c 文件加载到 0x08020000 地址,大小为 0x00020000。在这里,其目的通俗来说就是将以

    上.c 文件编译生成的目标文件链接到 MCU 芯片内部 flash 的 128KB 区域之后,区域大小为 128KB。

    类型:开发工具

    适用型号:适用所有 MCU 型号

    相关文章

      网友评论

        本文标题:如何在 Keil 中将函数或变量编译到指定地址 2021-10-

        本文链接:https://www.haomeiwen.com/subject/lmwmaltx.html