嵌入式中 固化函数接口,并通过函数的入口地址来调用
来源:互联网 发布:上古卷轴5重甲数据 编辑:程序博客网 时间:2024/05/18 01:49
在嵌入式开发中,经常需要将函数接口固化到Flash中的特定位置,供其他应用来调用。特别是层次分明的嵌入式开发(IAP编程),这种需求会变得更加强烈。今天介绍一种简单的方法,来实现这一功能。
1、先来分析下,在同一块MCU上,要想让A程序调用B程序中的函数,首先得让A程序知道自己将要调用的这个函数,在B程序中的入口地址。那么我们是不是首先得在A、B程序之间做一个约定,将接口放在某一特定地址,让A程序知道这个地址有它需要的函数入口地址。我们只要这样做就可以了:
在absacc.h(编译器提供的头文件)中,定义了这样一个宏,它的作用是将变量放在Flash中的某一绝对地址中。而今天将用来放置函数入口地址。
"absacc.h"定义如下:
#ifndef __at#define __at(_addr) __attribute__ ((at(_addr)))#endif
来看看怎么用这个 __attribute__ 来固化函数接口。
B程序:
#include <absacc.h> uint32_t GetTime(void){printf("2017.08.18_10:49:00\r\n");}typedef uint32_t (*B_get_time)(void);//定义一个函数指针类型,这个类型要和将要固化的函数(如:GetTime)类型一致。B_get_time B_func __at(0x20000UL);//定义一个 B_get_time 类型的函数变量,并放在固定位置(如:0x20000)。B_get_time B_func = GetTime;//将GetTime函数的入口地址放在新定义的 B_func 函数变量中。至此函数 GetTime 就已经放在Flash中地址为 0x20000的位置了。
那么A程序要怎么样去调用这个 GetTime 呢?
A程序:
typedef uint32_t (*A_get_time)(void);//定义一个函数指针类型,这个类型要和B程序中固化的函数(如:GetTime)类型一致。uint32_t get_time(void)//定义一个函数实体来完成调用{A_get_time func; //定义一个 A_get_time 类型的函数变量func = (A_get_time)(*((volatile unsigned long*)(0x20000UL)));//将地址为0x20000里的内容,转换为 A_get_time型函数指针return func();//调用func();至此完成调用}
执行结果:
阅读全文
1 0
- 嵌入式中 固化函数接口,并通过函数的入口地址来调用
- 通过trait reference来保存 函数、closure 的调用入口
- 通过函数的地址调用函数
- 函数指针实现接口固化
- 我对 系统调用号 系统调用表 系统调用函数入口地址的理解
- 通过函数名的字符串来调用这个函数
- 函数 入口地址 返回地址
- PHP 打印调用函数入口地址(堆栈),方便调式
- 通过IE提供的window.external来再javascript中调用winform中的函数
- 在SSH中通过spring的jdbctemplate接口调用oracle数据库的函数与存储过程
- 通过调用函数来实现乘法表的打印
- 在函数内部获得函数入口地址的方法
- 如何在java的被调用函数中创建对象,并通过参数传回?
- 嵌入式中地址-函数之间的转换
- c++ 函数入口地址问题
- 通过同名字符串来调用函数<python>
- C++ 中通过函数名字的字符串调用函数
- python里怎么样通过函数名称来获取函数地址
- jQuery鼠标键盘表单事件大全
- UVa 455 周期串 (Periodic Strings)
- 【HTCVR】VRTK插件功能
- 「网络流 24 题」星际转移
- 曲线拟合
- 嵌入式中 固化函数接口,并通过函数的入口地址来调用
- 获取文件类型
- html+css+js混合成js的实现
- Android OTA升级原理和流程分析(九)---updater-script脚本语法简介以及执行流程
- Spring security @preauthorize
- Codeforces 679C Bear and Square Grid 暴力(滑动窗口)
- 做网站之前应该了解哪些网站建设知识
- Centos7编译安装GCC7.2
- atom-使用手册