单片机函数单独编译到固定地址,给别的程序调用

参考:

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

https://blog.csdn.net/qq_21475601/article/details/77366924

在单片机或嵌入式中,有这样的一个需求,能不能实现和PC上的电脑的DLL功能,把某部分功能单独编译。这样不但便宜开发维护,模块化编程嘛,更重要的是,可以减少FLASH使用量,比如有BOOT和APP两个程序,像USB,CAN等共有的功能,就可以共用,不用再单独写,试问可以减少多少代码量。

#ifndef __at
#define __at(_addr) __attribute__ ((at(_addr)))
#endif

 

uint32_t GetTime(void)
{
	printf("2022.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 函数变量中。

 

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();至此完成调用
}

 

 

posted on 2020-09-17 09:30  lizhuohui  阅读(414)  评论(0编辑  收藏  举报

导航