你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

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

举报

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

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

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

zoomdy 回答时间:2017-2-6 12:35:17
  1. //bootloader.c
  2. void func1(int a)
  3. {
  4. }

  5. int func2(int a, int b)
  6. {
  7. }

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

复制代码
  1. //app.c
  2. // 声明函数指针
  3. void (func1*)(int a);
  4. void (func2*)(int a, int b);

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

  9. //初始化函数指针
  10. func1 = (void (*)(int))(table_base[0] | 0x1);
  11. func2 = (int (*)(int, int))(table_base[1] | 0x1);

  12. // 调用函数
  13. func1(11);
  14. }
复制代码



评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

zoomdy 回答时间:2017-2-9 18:15:38
moyanming2013 发表于 2017-2-9 16:30
此方式中,如果在Bootloader.c中执行函数期间出现了异常,理论上还是否正确呢?
这是权威指南第3版的示例 ...

我随手编的,最简单的方式,不考虑权限,不考虑异常,如果都要考虑的话,最好是使用SVC系统调用。如果还有更高的要求,大概只能用Cortex-M23或Cortex-M33了,但我还没见到这两款核心的产品问世。
liangzuoming 回答时间:2017-2-5 18:02:57
求助求助
freeelectron 回答时间:2017-2-5 20:28:43
貌似不行,
zoomdy 回答时间:2017-2-5 21:09:53
把共享函数放到bootloader,在bootloader区域某个固定的位置存储共享函数地址表,App定义指向bootloader函数地址表的函数指针,用函数指针调用就可以了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

海迹天涯 回答时间:2017-2-6 08:40:37
zoomdy 发表于 2017-2-5 21:09
把共享函数放到bootloader,在bootloader区域某个固定的位置存储共享函数地址表,App定义指向bootloader函 ...

这样可以吗,坐等楼主测试
liangzuoming 回答时间:2017-2-6 09:11:13
zoomdy 发表于 2017-2-5 21:09
把共享函数放到bootloader,在bootloader区域某个固定的位置存储共享函数地址表,App定义指向bootloader函 ...

这个共享函数地址表怎么弄的,可以详细说一下嘛,或者给点资料,不胜感谢
zoomdy 回答时间:2017-2-6 12:36:05
楼上的代码没有编译过,原理就是这样的,细节自己搞定。
wofei1314 回答时间:2017-2-6 13:23:13

请教一下,执行完函数(共享的那部分)以后如何返回Bootloader或者APP....
liangzuoming 回答时间:2017-2-6 13:48:08
zoomdy 发表于 2017-2-6 12:36
楼上的代码没有编译过,原理就是这样的,细节自己搞定。

好的,非常感谢
wofei1314 回答时间:2017-2-9 09:23:54
zoomdy 发表于 2017-2-6 21:38
函数执行完就回到调用它的位置的下一条指令呀,如果是bootloader调用就回到bootloader,如果是app调用就 ...

是跳转指令,不是函数调用指令,

跳转指令也支持调用完后回来吗?

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

zbber 回答时间:2017-2-9 10:32:59
求助求助,强烈支持楼主ing……
zoomdy 回答时间:2017-2-9 12:29:37
wofei1314 发表于 2017-2-9 09:23
是跳转指令,不是函数调用指令,

跳转指令也支持调用完后回来吗?

调用函数的指令不会是B或BX,一定是BL或BLX。
wofei1314 回答时间:2017-2-9 13:15:06
zoomdy 发表于 2017-2-9 12:29
调用函数的指令不会是B或BX,一定是BL或BLX。

哪里有汇编资料,方便的话给指点一下。。。。


我是参照的IAP程序里的跳转,使用C,赋值一个地址给PC指针,然后跳过去,那我的这种方式是B、BX还是BL或者是BLX  ?
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版