搜索
bottom↓
回复: 36

STM32F103是否可以实现动态加载某个函数

[复制链接]

出0入0汤圆

发表于 2018-11-7 18:50:13 | 显示全部楼层 |阅读模式
如题,目前有个项目中需要对各种类型的设备进行串口数据采集,但事先不知道现场实际有哪些设备需要接入,如果把每个协议解析都包含到项目中的话,程序就会比较庞大,一个是后期在线升级(NB/GPRS/lora)会很慢,另一个是F103单片机不一定够空间;
现在是计划在软件编写几个行业标准的协议解释器,通过各种配置实现标准协议格式的解析,这样能减小软件大小,但是对于非标协议,还是没什么办法,
所以想到是否可以实现对部分函数的动态加载,这样后期只需在线升级对应的函数即可,但找了一些资料,都没找到什么好方法

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入17汤圆

发表于 2018-11-7 19:01:29 | 显示全部楼层
可以,找个外部FLASH,自行升级程序

出0入0汤圆

发表于 2018-11-7 19:03:32 | 显示全部楼层
做个解释器,将代码文件放在外部SPIFLASH里?

出0入442汤圆

发表于 2018-11-7 19:07:56 来自手机 | 显示全部楼层
DOER 发表于 2018-11-7 19:01
可以,找个外部FLASH,自行升级程序

都不用,研究一下iap,然后编译时把函数链接到固定基址(连同模块的data,code等等一起),这样就可以直接刷那个基址的bin了。

出0入0汤圆

 楼主| 发表于 2018-11-7 19:14:17 | 显示全部楼层
DOER 发表于 2018-11-7 19:01
可以,找个外部FLASH,自行升级程序

程序房外部FLASH,然后根据协议配置选择升级对于的整个应用程序?

出0入17汤圆

发表于 2018-11-7 19:16:02 | 显示全部楼层
狂奔的蜗牛Y 发表于 2018-11-7 19:14
程序房外部FLASH,然后根据协议配置选择升级对于的整个应用程序?

对啊,就这样干

出0入0汤圆

 楼主| 发表于 2018-11-7 19:16:35 | 显示全部楼层
wye11083 发表于 2018-11-7 19:07
都不用,研究一下iap,然后编译时把函数链接到固定基址(连同模块的data,code等等一起),这样就可以直 ...

好,我研究下,这里因为被调用的解析函数程序大小不固定,在编译APP时先预留某个基址后的一段空间吗

出0入0汤圆

 楼主| 发表于 2018-11-7 19:18:43 | 显示全部楼层
DOER 发表于 2018-11-7 19:16
对啊,就这样干

嗯,这个是可以,不过如果协议解释方式更新升级时,在线升级比较耗时

出0入0汤圆

发表于 2018-11-7 19:21:31 | 显示全部楼层
函数指针???            

出0入93汤圆

发表于 2018-11-7 19:30:50 | 显示全部楼层
狂奔的蜗牛Y 发表于 2018-11-7 19:16
好,我研究下,这里因为被调用的解析函数程序大小不固定,在编译APP时先预留某个基址后的一段空间吗 ...


根本不用这么麻烦,要调用的函数用个函数指针指到固定的RAM地址,要调用之前先填充这块RAM就行了,根本不用管程序大小,留出足够的RAM空间就好了

出0入0汤圆

发表于 2018-11-7 19:38:11 来自手机 | 显示全部楼层
takashiki 发表于 2018-11-7 19:30
根本不用这么麻烦,要调用的函数用个函数指针指到固定的RAM地址,要调用之前先填充这块RAM就行了,根本不 ...

这方法好。

出0入17汤圆

发表于 2018-11-7 19:59:12 | 显示全部楼层
takashiki 发表于 2018-11-7 19:30
根本不用这么麻烦,要调用的函数用个函数指针指到固定的RAM地址,要调用之前先填充这块RAM就行了,根本不 ...

楼主不是说"F103单片机不一定够空间"了吗?

出0入17汤圆

发表于 2018-11-7 19:59:53 | 显示全部楼层

F103单片机 的RAM好小啊

出0入0汤圆

 楼主| 发表于 2018-11-7 20:04:35 | 显示全部楼层
takashiki 发表于 2018-11-7 19:30
根本不用这么麻烦,要调用的函数用个函数指针指到固定的RAM地址,要调用之前先填充这块RAM就行了,根本不 ...

还可以这样,学到了,那函数调用完之后退出来就正常执行其他?如果执行这个函数时有中断产生的话有影响吗

出5入14汤圆

发表于 2018-11-7 20:36:28 来自手机 | 显示全部楼层
103的空间不够,就把程序代码放到外部FLASH里,然后需要时从外部FLASH刷到内部再运行,本地IAP

出5入14汤圆

发表于 2018-11-7 20:39:24 来自手机 | 显示全部楼层
不过对于楼主这种应用,我们都是把现场的设备做成透明传输的方式,然后由终端服务器负责解析

出0入0汤圆

发表于 2018-11-7 20:53:12 来自手机 | 显示全部楼层
看起来楼主这个应用不是成本敏感,可以用高级一点的arm做

出0入0汤圆

发表于 2018-11-7 21:05:04 | 显示全部楼层
参考BIOS+APP的方式,你的BIOS放在FLASH中,APP编译到RAM地址。BIOS负责加载APP到对应RAM地址,APP负责解析协议。
预留两条命令,BIOS收到执行命令后跳转到APP,APP收到执行完毕命令后再跳回BIOS。

出0入0汤圆

发表于 2018-11-7 21:21:27 | 显示全部楼层
看起来好高级.   想知道把这程序放在RAM执行,理论上是行得通.  实际如何操作呢.

出0入0汤圆

发表于 2018-11-7 21:31:05 | 显示全部楼层
关注一下这个操作,以后可能也用到

出0入442汤圆

发表于 2018-11-7 23:06:12 | 显示全部楼层
狂奔的蜗牛Y 发表于 2018-11-7 19:16
好,我研究下,这里因为被调用的解析函数程序大小不固定,在编译APP时先预留某个基址后的一段空间吗 ...

直接在lds里面指定xxx.o链到0xAAAAAAAA就行了好像。貌似最好分开定义SECTIONS。我只会写最简单的lds。

出0入0汤圆

发表于 2018-11-8 00:22:09 来自手机 | 显示全部楼层
103最多64k的ram,所以你看程序要求分配吧。不过407的引脚和103兼容,所以直接换掉103更好。

出0入0汤圆

发表于 2018-11-8 06:29:14 来自手机 | 显示全部楼层
记得有个lua,好像可以

出0入8汤圆

发表于 2018-11-8 07:27:07 来自手机 | 显示全部楼层
外部设备上装上e2prom 记录下需要的时序

出0入0汤圆

发表于 2018-11-8 08:00:51 | 显示全部楼层
楼上的的意思都看明白了。。有没有人给一个具体实例呢~~

出0入0汤圆

发表于 2018-11-8 08:25:01 | 显示全部楼层
iap+app.
APP接收命令判断然后软启动,进IAP升级

出0入4汤圆

发表于 2018-11-8 08:48:57 | 显示全部楼层
本帖最后由 carefree1986 于 2018-11-8 08:53 编辑

其实大可不必这么搞,直接全写进去,程序写的比较好的话不会占用很多rom的,搞个菜单或者上位机选择协议类型,楼主参考各种专用控制器或者文本显示器都支持几十种PLC+变频器,而且还都是用的51单片机,非标协议采用订制或者用加一个协议定义工具或者用解释性的命令做,如果再不能满足的话在搞IAP,但是也要搞成跟jlink或者工业触摸屏那种一键升级

出5入14汤圆

发表于 2018-11-8 09:40:16 | 显示全部楼层
michael.yang 发表于 2018-11-7 21:05
参考BIOS+APP的方式,你的BIOS放在FLASH中,APP编译到RAM地址。BIOS负责加载APP到对应RAM地址,APP负责解析 ...

如果设备老变,这么做是最好的 ,,, 但如果一旦配置好了设备就不会频繁变化了,还是本地 IAP 最好,毕竟在 FLASH 里运行,比在 RAM 里运行可靠多了!

出0入0汤圆

发表于 2018-11-8 09:54:41 | 显示全部楼层
参考 wye11083

出0入0汤圆

发表于 2018-11-8 09:56:41 | 显示全部楼层
楼主需求不定,很难说哪种方案好。

出0入362汤圆

发表于 2018-11-8 10:05:39 | 显示全部楼层
用micropython或lua吧, 然后把需要解析的协议放在spi flash里,缺点是micropython或lua解释器本身需要消耗一定的rom
不过不需要关心二进制加载的细节了,都是纯文本

最简单的办法还是全写rom里,不行就换rom大一点的,现在stm32有1M的吧

出0入0汤圆

发表于 2018-11-8 10:11:10 | 显示全部楼层
elua   脚本解释

出0入8汤圆

发表于 2018-11-8 10:16:53 | 显示全部楼层
rt-thread  os  带有动态加载  不过 本身只能动态加载到ram中。

出0入0汤圆

发表于 2018-11-8 13:48:24 | 显示全部楼层
....可以,已实现,参考分散加载

出0入0汤圆

发表于 2018-11-13 00:11:11 | 显示全部楼层
学习了        

出100入85汤圆

发表于 2018-11-13 06:40:07 来自手机 | 显示全部楼层
dy22511825 发表于 2018-11-8 13:48
....可以,已实现,参考分散加载

能否搞个简单的实例为大家解解惑?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-19 02:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表