嵌入式中 固化函数接口,并通过函数的入口地址来调用

在嵌入式开发中,经常需要将函数接口固化到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 
 
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张图片


OVER.


你可能感兴趣的:(嵌入式)