Mr.梁 发表于 2017-2-5 18:01:57

APP程序与Bootload程序调用同一段代码的实现

问题是这样的,我有一段代码都是一些接口函数,而这些接口函数在APP程序与Bootload程序中都需要调用,我不想把这些接口函数编译成.a库文件调用,因为APP程序与Bootload程序都需要包含这个编译好的.a库文件,这样会浪费空间,我希望是编译成.bin文件烧录到stm32中固定的地址,然后APP与Bootload都可以调用。我知道这个是可以实现的,但是具体的方法不太懂,有哪位大神做过这方面的,可以指教一下嘛?

zoomdy 发表于 2017-2-6 21:38:18

wofei1314 发表于 2017-2-6 13:23
请教一下,执行完函数(共享的那部分)以后如何返回Bootloader或者APP....

函数执行完就回到调用它的位置的下一条指令呀,如果是bootloader调用就回到bootloader,如果是app调用就回到app,调用函数前会把返回地址保存到LR寄存器的,具体可以参考BLX指令。

Mr.梁 发表于 2017-2-5 18:02:57

求助求助:):)

freeelectron 发表于 2017-2-5 20:28:43

貌似不行,

zoomdy 发表于 2017-2-5 21:09:53

把共享函数放到bootloader,在bootloader区域某个固定的位置存储共享函数地址表,App定义指向bootloader函数地址表的函数指针,用函数指针调用就可以了。

海迹天涯 发表于 2017-2-6 08:40:37

zoomdy 发表于 2017-2-5 21:09
把共享函数放到bootloader,在bootloader区域某个固定的位置存储共享函数地址表,App定义指向bootloader函 ...

这样可以吗,坐等楼主测试

Mr.梁 发表于 2017-2-6 09:11:13

zoomdy 发表于 2017-2-5 21:09
把共享函数放到bootloader,在bootloader区域某个固定的位置存储共享函数地址表,App定义指向bootloader函 ...

这个共享函数地址表怎么弄的,可以详细说一下嘛,或者给点资料,不胜感谢:handshake:handshake

zoomdy 发表于 2017-2-6 12:35:17

//bootloader.c
void func1(int a)
{
}

int func2(int a, int b)
{
}

// func_table定位到固定位置,固定方法与编译器有关,请百度
const uint32_t func_table[] =
{ (uint32_t)&func1,
(uint32_t)&func2};


//app.c
// 声明函数指针
void (func1*)(int a);
void (func2*)(int a, int b);

void app_init(void)
{
// 取函数表基地址
uint32_t *table_base = (uint32_t*)(0x08004000/* func_table基地址,这里随便给个值*/);

//初始化函数指针
func1 = (void (*)(int))(table_base | 0x1);
func2 = (int (*)(int, int))(table_base | 0x1);

// 调用函数
func1(11);
}


zoomdy 发表于 2017-2-6 12:36:05

楼上的代码没有编译过,原理就是这样的,细节自己搞定。

wofei1314 发表于 2017-2-6 13:23:13

zoomdy 发表于 2017-2-6 12:35


请教一下,执行完函数(共享的那部分)以后如何返回Bootloader或者APP....

Mr.梁 发表于 2017-2-6 13:48:08

zoomdy 发表于 2017-2-6 12:36
楼上的代码没有编译过,原理就是这样的,细节自己搞定。

好的,非常感谢:handshake
页: [1] 2 3
查看完整版本: APP程序与Bootload程序调用同一段代码的实现