• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

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

在单片机编程使用中,会涉及到将某些函数定义到指定的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.默认编译链接地址

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

图2.打开sc文件

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

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

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

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

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

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

全部回复(21)
正序查看
倒序查看
2019-04-11 14:02
LKT4304 Code区空间是多大的?
0
回复
小帆儿
LV.5
3
2019-04-11 14:14
@小屁孩456
LKT4304Code区空间是多大的?
专业性太强了,看不懂!当技术储备吧!学习了………
0
回复
Mr_Wang_
LV.4
4
2019-04-11 16:40
@小帆儿
专业性太强了,看不懂!当技术储备吧!学习了………
同感,受教了,谢谢楼主分享!
0
回复
Hex315
LV.5
5
2019-04-11 19:13
@Mr_Wang_
同感,受教了,谢谢楼主分享!
请问4304都支持什么接口?
0
回复
宇宙王
LV.3
6
2019-04-11 19:38
@Hex315
请问4304都支持什么接口?
SPI/IIC 都支持的,但同时只能使用一个
0
回复
114W1
LV.5
7
2019-04-12 09:16
@宇宙王
SPI/IIC都支持的,但同时只能使用一个
我对这个技术很感兴趣,我会一直关注的
0
回复
2019-04-12 09:44
@114W1
我对这个技术很感兴趣,我会一直关注的
1 LKT4304是做什么用的?用于什么行业?2 LKT4304是新产品吗?什么时候推出的,安全性如何?3 看起来有些复杂,开发会不会太难啊,有谁用过说一下
0
回复
2019-04-12 11:26
@人称福爷
1LKT4304是做什么用的?用于什么行业?2LKT4304是新产品吗?什么时候推出的,安全性如何?3看起来有些复杂,开发会不会太难啊,有谁用过说一下
保护重要程序和,数据都行,好多行业都能用到
0
回复
邓女士
LV.5
10
2019-04-12 16:07
@miniminimini
保护重要程序和,数据都行,好多行业都能用到
LKT4304好像是他们去年新推出的32位的加密芯片,可以进行程序移植,安全等级很高
0
回复
2019-04-12 16:54
@邓女士
LKT4304好像是他们去年新推出的32位的加密芯片,可以进行程序移植,安全等级很高
正好在做一款产品的加密,看到楼主的的文章,又有了新的思路,感谢楼主的分享,这样的好文章楼主要多发表一点。真是雪中送炭啊!
0
回复
114W1
LV.5
12
2019-04-12 17:04
@人称福爷
正好在做一款产品的加密,看到楼主的的文章,又有了新的思路,感谢楼主的分享,这样的好文章楼主要多发表一点。真是雪中送炭啊!
这文章对加密芯片的算法讲得挺细,说明他们公司的技术人员很专业,技术能力很强,产品的安全度肯定很高
0
回复
Hex315
LV.5
13
2019-04-12 19:20
@114W1
这文章对加密芯片的算法讲得挺细,说明他们公司的技术人员很专业,技术能力很强,产品的安全度肯定很高
最近浏览过楼主的多篇文章,请问文中说到的LKT4304加密芯片和嵌入式编程第一篇中提到的LKT4106加密芯片其功能有啥区别?
0
回复
2019-04-12 20:12
@Hex315
最近浏览过楼主的多篇文章,请问文中说到的LKT4304加密芯片和嵌入式编程第一篇中提到的LKT4106加密芯片其功能有啥区别?
具体得看资料,打个电话问问厂商,好像都是IIC接口的,其它啥区别我就不清楚了
0
回复
邓女士
LV.5
15
2019-04-13 10:24
@miniminimini
具体得看资料,打个电话问问厂商,好像都是IIC接口的,其它啥区别我就不清楚了
文中提到的测试环境是LKT4304加密芯片算法工程,那是不是说这种编程方法只能用于LKT系列的加密芯片中?
0
回复
Mr_Wang_
LV.4
16
2019-04-13 19:32
@邓女士
文中提到的测试环境是LKT4304加密芯片算法工程,那是不是说这种编程方法只能用于LKT系列的加密芯片中?
我认为算法工程跟芯片的型号应该是一一对应才可以。不然对于不同的芯片配置不同,肯定无法正常编译。
0
回复
宇宙王
LV.3
17
2019-04-13 21:07
@Mr_Wang_
我认为算法工程跟芯片的型号应该是一一对应才可以。不然对于不同的芯片配置不同,肯定无法正常编译。
对嵌入式编程和ARM单片机感兴趣的大神可以过来看看了哦⊙∀⊙!
0
回复
BLoun
LV.5
18
2019-04-14 20:54
@宇宙王
对嵌入式编程和ARM单片机感兴趣的大神可以过来看看了哦⊙∀⊙!
“ (section(".ARM.__at_0x00031000" ” 是arm指令集的指令吗?
0
回复
Mr_Wang_
LV.4
19
2019-04-15 06:15
@BLoun
“(section(".ARM.__at_0x00031000"”是arm指令集的指令吗?
这不都写着ARM 呢吗,难道是51的不成,兄弟
0
回复
BLoun
LV.5
20
2019-04-15 09:29
@Mr_Wang_
这不都写着ARM呢吗,难道是51的不成,兄弟
这种方法是不错,不过不是特殊需求或是专业人士还是慎用的比较好。强制转换地址如果错误编译器不会报错的容易出问题。
0
回复
小帆儿
LV.5
21
2019-04-15 15:13
@BLoun
这种方法是不错,不过不是特殊需求或是专业人士还是慎用的比较好。强制转换地址如果错误编译器不会报错的容易出问题。
文章写得这么详细,不怕被同行业抄袭啊?看来有两笔刷子
0
回复
2019-04-15 16:18
@小帆儿
文章写得这么详细,不怕被同行业抄袭啊?看来有两笔刷子
很有用,谢谢分享
0
回复