当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在单片机编程使用中,会涉及到将某些函数定义到指定的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单片机将函数定义到指定程序地址的方法已经实现。

转载于:https://my.oschina.net/u/2955002/blog/3034802

相关文章:

  • 透过3D立方体深入理解perspective和translateZ的关系
  • 深入理解静态代理与JDK动态代理
  • 常见漏洞解析
  • [转] 谈谈前端异常捕获与上报
  • Apache Tomcat 8.5.40 与 7.0.94 发布
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 线程同步利与弊,线程同步的前提
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • Python数据类型、运算符、语句、循环
  • 激活效能,CODING 敏捷研发模块上线
  • cmd中subst的使用
  • [MySQL光速入门]003 留点作业...
  • C# - 为值类型重定义相等性
  • Es6初级入门(一)
  • thinkphp+redis实现秒杀,缓存等功能
  • JavaScript-如何实现克隆(clone)函数
  • co.js - 让异步代码同步化
  • Javascript编码规范
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React系列之 Redux 架构模式
  • 从tcpdump抓包看TCP/IP协议
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 技术:超级实用的电脑小技巧
  • 前端相关框架总和
  • 写代码的正确姿势
  • ​ArcGIS Pro 如何批量删除字段
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (3)STL算法之搜索
  • (C++17) std算法之执行策略 execution
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (windows2012共享文件夹和防火墙设置
  • (九)c52学习之旅-定时器
  • (论文阅读11/100)Fast R-CNN
  • (转) Android中ViewStub组件使用
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET Project Open Day(2011.11.13)
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @GlobalLock注解作用与原理解析
  • @NestedConfigurationProperty 注解用法
  • @Valid和@NotNull字段校验使用
  • [2018-01-08] Python强化周的第一天
  • [4.9福建四校联考]
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [C++核心编程](四):类和对象——封装
  • [CTO札记]盛大文学公司名称对联
  • [Editor]Unity Editor类常用方法
  • [fsevents@^2.1.2] optional install error: Package require os(darwin) not compatible with your platfo
  • [HNOI2008]玩具装箱toy
  • [JAVA设计模式]第二部分:创建模式
  • [LeetCode]284. Peeking Iterator(C++,类,暴力)
  • [Linux]如何理解kernel、shell、bash