OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4981|回复: 33

3段式程序架构设计(更新实现方式说明和例子)

[复制链接]

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
发表于 2018-9-6 23:51:44 | 显示全部楼层 |阅读模式
本帖最后由 屋脊雀 于 2018-9-14 16:45 编辑


在STM32上实现了最简单的例子,请见附件。
具体如何实现的,在附件文档有说明。

欢迎大家继续讨论。

三段式程序架构设计.rar (3.61 MB, 下载次数: 370)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2018-9-9 22:54:43 | 显示全部楼层
本帖最后由 ufbycd 于 2018-9-9 22:58 编辑
qiousanxi 发表于 2018-9-9 13:52
我也做过这样的尝试,用的离散变量和函数指针,可惜没有成功

我想了下,现在很多源码不开源的无线模块(GSM模块等)支持的二次开发,其实现的方式好像就是楼主说的这种。其编译应用的时候确实不需要链底层的静态库(不过要链接一个很小的库)

我想到的实现方法是这样的:底层驱动维护一张函数表,这张表类似于MCU中断框架里的中断向量表,该表的地址(即API函数地址)是固定的,但API函数会像中断处理函数一样跳转到实际的底层驱动函数。

但用上面的方法,编译应用的时候还是要链接那张函数表。我想了想:如果编译应用时完全不链接与底层相关的静态库,那应用是通不过编译的!APP应用肯定要知道API函数的地址在哪里!楼主,你说呢。
回复 支持 1 反对 0

使用道具 举报

7

主题

185

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2729
金钱
2729
注册时间
2015-12-27
在线时间
469 小时
发表于 2018-9-7 08:33:16 | 显示全部楼层
我很想知道怎么实现应用和驱动分开编译,然后只更新驱动?
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
 楼主| 发表于 2018-9-8 00:27:22 | 显示全部楼层
钩月黄昏 发表于 2018-9-7 08:33
我很想知道怎么实现应用和驱动分开编译,然后只更新驱动?

修改分散加载文件,应用和驱动放在不同的FLASH上,RAM也分一人一块。
更新,用自己的BOOT更新,写内部FLASH
回复 支持 反对

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2018-9-8 09:31:56 | 显示全部楼层
屋脊雀 发表于 2018-9-8 00:27
修改分散加载文件,应用和驱动放在不同的FLASH上,RAM也分一人一块。
更新,用自己的BOOT更新,写内部FL ...

编译应用的时候不用链接驱动的静态库文件?
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
 楼主| 发表于 2018-9-8 12:16:52 | 显示全部楼层
ufbycd 发表于 2018-9-8 09:31
编译应用的时候不用链接驱动的静态库文件?

不链接,通过函数指针,函数指针固定在FLASH位置或者RAM位置。
回复 支持 反对

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-9-8 13:54:14 来自手机 | 显示全部楼层
能分享一下范例具体说明下就最好了
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-9-8 15:24:17 | 显示全部楼层
本帖最后由 qiousanxi 于 2018-9-8 15:28 编辑

请教下,你这是一个工程编译的,还是两个工程
如果是一个工程,你app改变,你的驱动位置不会变吗?

如果是两个工程,你app怎么定位,驱动的位置?

对这种东西挺感兴趣的,
回复 支持 反对

使用道具 举报

7

主题

185

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2729
金钱
2729
注册时间
2015-12-27
在线时间
469 小时
发表于 2018-9-9 07:38:16 | 显示全部楼层
屋脊雀 发表于 2018-9-8 12:16
不链接,通过函数指针,函数指针固定在FLASH位置或者RAM位置。

那驱动函数由于每个地址都需要提前确定,这样每个函数都得指定地址?RAM怎么分开呢?也是通过散列文件实现?
回复 支持 反对

使用道具 举报

40

主题

250

帖子

0

精华

高级会员

Rank: 4

积分
854
金钱
854
注册时间
2016-11-13
在线时间
705 小时
发表于 2018-9-9 12:46:36 来自手机 | 显示全部楼层
是的,能出个教程就最好了,刚来公司,也是熟悉bootloader,想了解多一点
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-9-9 13:51:39 来自手机 | 显示全部楼层
能给个点灯例程,一起讨论下
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-9-9 13:52:43 来自手机 | 显示全部楼层
我也做过这样的尝试,用的离散变量和函数指针,可惜没有成功
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-9-9 23:38:54 | 显示全部楼层
ufbycd 发表于 2018-9-9 22:54
我想了下,现在很多源码不开源的无线模块(GSM模块等)支持的二次开发,其实现的方式好像就是楼主说的这 ...

可以讨论下,有空
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
 楼主| 发表于 2018-9-10 22:10:00 | 显示全部楼层
ufbycd 发表于 2018-9-9 22:54
我想了下,现在很多源码不开源的无线模块(GSM模块等)支持的二次开发,其实现的方式好像就是楼主说的这 ...

是要维护一张表,而且表的地址固定。

如果应用是作为一个TASK的话。
底层可以在调用这个TASK的时候传入表,这样就不用固定位置了。
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
 楼主| 发表于 2018-9-10 22:10:38 | 显示全部楼层
yklstudent 发表于 2018-9-8 13:54
能分享一下范例具体说明下就最好了

会有的,没写完
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
 楼主| 发表于 2018-9-10 22:11:28 | 显示全部楼层
qiousanxi 发表于 2018-9-8 15:24
请教下,你这是一个工程编译的,还是两个工程
如果是一个工程,你app改变,你的驱动位置不会变吗?

三个工程,BOOT一个,CORE一个,APP一个
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
 楼主| 发表于 2018-9-10 22:13:35 | 显示全部楼层
钩月黄昏 发表于 2018-9-9 07:38
那驱动函数由于每个地址都需要提前确定,这样每个函数都得指定地址?RAM怎么分开呢?也是通过散列文件实 ...

方法1 把所有要提供给APP的函数放到一个结构体,位置固定。
方法2 把所有接口封装为open,close,read write ioctrl。提供给APP的只有这5个函数。

通常,我们用方法1.
RAM也是分散加载文件,只需要关心全局变量。
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
 楼主| 发表于 2018-9-10 22:14:05 | 显示全部楼层
cmz 发表于 2018-9-9 12:46
是的,能出个教程就最好了,刚来公司,也是熟悉bootloader,想了解多一点

正在改一个STM32F407的DEMO
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
 楼主| 发表于 2018-9-10 22:14:42 | 显示全部楼层
qiousanxi 发表于 2018-9-9 13:51
能给个点灯例程,一起讨论下

呵呵,,我们一般不点灯了,用串口LOG。
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2014-9-21
在线时间
32 小时
发表于 2018-9-10 23:17:30 | 显示全部楼层
呵呵,看了下你的串口LOG,似乎实现得太简单了点,还可以搞得更好用。
回复 支持 反对

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
发表于 2018-9-10 23:41:59 来自手机 | 显示全部楼层
这么麻烦,为什么不上linux; 然而MCU并不是不能这样做,而是它所具备的标准和应用面让它并不适合这么干。买个Linux核心板,似乎比MCU核心板便宜的多吧。
回复 支持 反对

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2018-9-11 12:08:09 | 显示全部楼层
wlq390934605 发表于 2018-9-10 23:41
这么麻烦,为什么不上linux; 然而MCU并不是不能这样做,而是它所具备的标准和应用面让它并不适合这么干。买 ...

Linux任务切换时间是毫秒级的,在时序要求高的场合还不如8位MCU的响应速度。
另外就是系统稳定性,Linux系统毕竟太复杂,底层出个Bug就搞死人。
回复 支持 反对

使用道具 举报

18

主题

323

帖子

1

精华

高级会员

Rank: 4

积分
935
金钱
935
注册时间
2017-12-11
在线时间
196 小时
发表于 2018-9-11 14:20:09 来自手机 | 显示全部楼层
ufbycd 发表于 2018-9-11 12:08
Linux任务切换时间是毫秒级的,在时序要求高的场合还不如8位MCU的响应速度。
另外就是系统稳定性,Linux ...

我只记得四核A64比H7核心板便宜多了,STM32也并非完全不可能不会有MMU
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
 楼主| 发表于 2018-9-11 23:38:51 | 显示全部楼层
wlq390934605 发表于 2018-9-11 14:20
我只记得四核A64比H7核心板便宜多了,STM32也并非完全不可能不会有MMU

H7多少钱?
我们天天在为了省几毛钱而奋斗。
我们经常用的是10块钱左右的芯片。
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-9-12 00:52:51 来自手机 | 显示全部楼层
大神加油!!!很期待
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
 楼主| 发表于 2018-9-14 16:46:32 | 显示全部楼层
qiousanxi 发表于 2018-9-12 00:52
大神加油!!!很期待

已更新,请查收附件。
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-9-21 23:38:32 | 显示全部楼层
本帖最后由 qiousanxi 于 2018-9-21 23:45 编辑

我也搞了一个,有点问题。用freertos作为核心,在app里面加载创建任务时卡死
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-9-21 23:44:51 | 显示全部楼层
本帖最后由 qiousanxi 于 2018-9-22 00:00 编辑

好好研究下大老的代码,谢谢分享
回复 支持 反对

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-10-17 19:02:17 | 显示全部楼层
很厉害!!!!思路很好,再次谢谢大佬的分享
回复 支持 反对

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
 楼主| 发表于 2018-10-21 21:55:42 | 显示全部楼层
qiousanxi 发表于 2018-10-17 19:02
很厉害!!!!思路很好,再次谢谢大佬的分享

希望在实际项目你能用上。
回复 支持 反对

使用道具 举报

0

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2018-12-2
在线时间
76 小时
发表于 2019-11-1 14:38:28 | 显示全部楼层
楼主讲的真好,高级应用确实需要分离,俗称解耦合,另外还可以防止多人合作扯皮。这种思想,楼主应该研究过Linux或者RT-thread
回复 支持 反对

使用道具 举报

0

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2019-9-24
在线时间
33 小时
发表于 2020-1-4 22:06:23 来自手机 | 显示全部楼层
mark   
回复 支持 反对

使用道具 举报

0

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2019-9-24
在线时间
33 小时
发表于 2020-1-4 22:08:40 来自手机 | 显示全部楼层
赞      
回复 支持 反对

使用道具 举报

0

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2019-9-24
在线时间
33 小时
发表于 2020-1-4 22:09:12 | 显示全部楼层
赞      
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-11 13:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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