单片机函数单独编译到固定地址,给别的程序调用
参考:
《嵌入式中 固化函数接口,并通过函数的入口地址来调用》
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();至此完成调用
}