xiaoyuzhou1228

嵌入式编程第二篇:ARM单片机如何将函数 定义到指定程序地址

0
阅读(333) 评论(22)

在单片机编程使用中,会涉及到将某些函数定义到指定的code区。此时需要对工程文件进行配置修改才可完成。本期针对ARM平台单片机做出说明介绍

1、测试目标

将函数Communication_Test定义到Code区的指定地址0x1000位置

2、测试环境

LKT4304加密芯片算法工程、KEIL-ARM编译软件、

3、实现步骤

3.1 使用KEIL软件导入LKT4304算法工程(KEIL软件基本操作不再敷述,如不清楚请自行百度)

 

3.2 在App_Main.c文件中声明测试函数Communication_Test:

extern void Communication_Test(u8 *in,u8 *out,u8 len);

 

3.3 在App_fun.c文件中实现测试函数Communication_Test:

void Communication_Test(u8 *in,u8 *out,u8 len);{

  u8 i;

    

  for(i=0;i < len;i++)

   out[i]= in[i]+1;

}

 

3.4 在App_Main.c文件中调用测试函数Communication_Test,此处省略

 

3.5 编译算法工程后,在\LKT4304_AppDemo\Out\Lst\路径下找到    LKT4304_AppDemo.map,打开该文件。

 

3.6 寻找到Communication_Test编译后存储的地址。本例中,编译后的默认地址如 图1所示。

1.png

图1. 默认编译链接地址

 

3.7 回到算法工程,选择Project->Options for Target ...->Linker,点击Edit按钮调 出 sc文件,如图2所示

2.png

图2. 打开sc文件

 

3.8 在ARM_App.sc文件中,Code区起始地址是0x30000,如下图所示:

3.png

图3.sc文件中定义的Code区

 

  将函数Communication_Test定义到Code区的指定地址0x1000位置,需要在 App_fun.c文件中增加 void Communication_Test(u8  *in,u8 *out,u8 len)   __attribute__((section(".ARM.__at_0x00031000"))); 这样一句代码。如下图所示:

4.png

3.9 编译算法工程,并重新打开\LKT4304_AppDemo\Out\Lst\下的map文件,查看 Communication_Test函数所在地址,如图4所示,该函数已经更换到0x31000地址上, 表明Communication_Test函数已经定义到Code区的0x1000地址。

5.png

图4. 重定义后目标函数所在地址

 

至此,ARM单片机将函数定义到指定程序地址的方法已经实现。


  1. 1 LKT4304是做什么用的?用于什么行业?

    2 LKT4304是新产品吗?什么时候推出的,安全性如何?

    3 看起来有些复杂,开发会不会太难啊,有谁用过说一下


  2. 我对这个技术很感兴趣,我会一直关注的

  3. @pennysam   

    请问4304都支持什么接口?


    SPI/IIC 都支持的,但同时只能使用一个

  4. 请问4304都支持什么接口?


  5. 同感,受教了,谢谢楼主分享!


  6. LKT4304 Code区空间是多大的?


  7. 专业性太强了,看不懂!当技术储备吧!学习了………