搜索
bottom↓
回复: 24

关于同一个单片机加载不同程序请教

[复制链接]

出0入0汤圆

发表于 2019-6-18 08:42:07 | 显示全部楼层 |阅读模式
本帖最后由 mark82 于 2019-6-18 09:21 编辑

请教大家一个事情:一个单片机,里面装载两个不同的应用程序,根据不同的需求启动不同的应用程序,这个能实现吗?如果能实现,大概需要做什么,请指教,谢谢!
补充说明,我现在不清楚的是,怎么区分程序A和程序B(大家都在同一个FLASH中),A与B的切换,初步想法是,在A和B中做跳转逻辑,满足情况时,修改bootload的跳转位置,从而决定是启动A或B!

出0入0汤圆

 楼主| 发表于 2019-6-18 08:42:25 | 显示全部楼层
请知道的指导一下,谢谢!

出0入4汤圆

发表于 2019-6-18 08:43:17 | 显示全部楼层
最简单的方式,一个放在内部falsh,一个放在外部falsh,51单片机可以实现

出0入0汤圆

 楼主| 发表于 2019-6-18 08:44:45 | 显示全部楼层
laujc 发表于 2019-6-18 08:43
最简单的方式,一个放在内部falsh,一个放在外部falsh,51单片机可以实现 ...

都是内部flash,需要根据需求切换重启!

出0入0汤圆

发表于 2019-6-18 08:56:22 | 显示全部楼层
用个单片机引脚做指示,high level进入程序1; low level进入程序2.........

出0入0汤圆

发表于 2019-6-18 09:00:58 | 显示全部楼层
通过串口接收应用软件的指令,收到1,执行程序1,收到2执行程序2,否则就等,

出0入0汤圆

 楼主| 发表于 2019-6-18 09:01:03 | 显示全部楼层
YS126 发表于 2019-6-18 08:56
用个单片机引脚做指示,high level进入程序1; low level进入程序2.........

我想知道的是,怎么实现这两个程序都预先放入内部flash 中,但在运行某一个程序时不会牵扯到另外一个程序的资源。

出0入0汤圆

 楼主| 发表于 2019-6-18 09:02:48 | 显示全部楼层
NFC 发表于 2019-6-18 09:00
通过串口接收应用软件的指令,收到1,执行程序1,收到2执行程序2,否则就等, ...

两个程序各自的启动逻辑,我是清楚的,我现在还没想明白,怎么能做到两个程序之间资源的区分:运行A的时候,怎么确保不会涉及到运行B的资源!

出0入4汤圆

发表于 2019-6-18 09:03:07 | 显示全部楼层
mark82 发表于 2019-6-18 09:01
我想知道的是,怎么实现这两个程序都预先放入内部flash 中,但在运行某一个程序时不会牵扯到另外一个程序 ...

应该是编译时就已经指定好资源了

出0入0汤圆

发表于 2019-6-18 09:06:10 | 显示全部楼层
了解下IAP 原理一样的 只要FLASH放的下 是可以放多个程序的

出0入0汤圆

 楼主| 发表于 2019-6-18 09:06:34 | 显示全部楼层
laujc 发表于 2019-6-18 09:03
应该是编译时就已经指定好资源了

你的意思是:在编译器中指定相关资源就可以?

出0入8汤圆

发表于 2019-6-18 09:07:52 | 显示全部楼层
每个任务独占CPU和资源,切换一个,另一个数据就丢失了吧,不过切换前可以把数据先写进flash中

出0入0汤圆

发表于 2019-6-18 10:20:11 | 显示全部楼层
你需要至少三个程序区域: (1)Bootloader;(2)UserApp#1;(3)UserApp#2。分别定位在不同的Flash空间,在每个程序运行的开始需要重新初始化软硬件资源, 确保不会发生异常。

出0入8汤圆

发表于 2019-6-18 10:22:54 | 显示全部楼层
如果 RAM  够大的话,要运行那个 就把那个app拷贝到ram中运行。

出0入0汤圆

发表于 2019-6-18 10:35:25 | 显示全部楼层
有点像bootload的那种,切换中断向量表,保护堆栈以及寄存器就可以了,回来以后切换回来

出0入8汤圆

发表于 2019-6-18 11:03:46 | 显示全部楼层
任意一个STM32单片机都满足你的要求,因为它们在出厂时就内置了一个bootloader程序
需要下载代码时进入bootloader,平时运行你自己的程序互不干扰

出0入0汤圆

 楼主| 发表于 2019-6-18 11:54:59 | 显示全部楼层
canspider 发表于 2019-6-18 11:03
任意一个STM32单片机都满足你的要求,因为它们在出厂时就内置了一个bootloader程序
需要下载代码时进入boot ...

不是使用STM32,是另外一款单片机来!

出0入0汤圆

 楼主| 发表于 2019-6-18 11:55:29 | 显示全部楼层
kebaojun305 发表于 2019-6-18 10:22
如果 RAM  够大的话,要运行那个 就把那个app拷贝到ram中运行。

RAM应该不足够,只有96k!

出0入475汤圆

发表于 2019-6-18 12:04:02 来自手机 | 显示全部楼层
你先把两种程序按照一个总程序的方式编译通,然后资源什么都够的情况下就非常简单,A和B只是两个不同的子函数而已,前面网友说的根据命令也好硬件配置也好什么的执行A/B中的一个就行了。这是最简单的,当然要提前考虑好比如资源和外设会不会冲突。如果有冲突那么就得采用bootloader的思路做了,在boot中选择A/B不通的falsh存放地址去执行

出0入8汤圆

发表于 2019-6-18 12:11:19 | 显示全部楼层
mark82 发表于 2019-6-18 11:55
RAM应该不足够,只有96k!

把 2个app公用的部分合并起来,只把不同的部分分开做。

出0入475汤圆

发表于 2019-6-18 12:13:25 来自手机 | 显示全部楼层
kebaojun305 发表于 2019-6-18 12:11
把 2个app公用的部分合并起来,只把不同的部分分开做。

就是,既然硬件都完全一样,那么驱动什么的肯定是基本完全一样,这样实际上差异的地方估计就是具体的算法一类的了,分析一下两个app我觉得合并出来把不同的地方分别跑A/B两个函数应该是可以的

出0入0汤圆

发表于 2019-6-18 18:06:27 | 显示全部楼层
为什么不做成2个子程序方式哪,根据条件,启动某一个,如果想保留某些中间数据,使用全局变量,就完事了。

出0入33汤圆

发表于 2019-6-18 19:18:09 | 显示全部楼层
完全可以啊,修改编译器地址、中断向量表,做好跳转条件,最好有个bootloader,然后把三个程序合并成一个二进制或hex烧进去就可以了。

出0入93汤圆

发表于 2019-6-19 05:45:14 | 显示全部楼层
mark82 发表于 2019-6-18 09:01
我想知道的是,怎么实现这两个程序都预先放入内部flash 中,但在运行某一个程序时不会牵扯到另外一个程序 ...

你写程序时就划分好资源。程序A和B分别放到不同的文件夹中,并且函数名和全局变量名前面都用static修饰或加上前缀或放入命名空间(可以匿名),引用文件时不要刻意跨文件夹include,这样两个程序就是隔离的。
如果支持C++的话,先定义一个抽象类,A和B都由它派生出来,这样A和B是隔离的,而且能够统一调用还方便。

出0入4汤圆

发表于 2019-6-19 18:07:22 | 显示全部楼层
bootloader, app1, app2分别编译.  ROM区各自分开;  app1,app2的RAM公用.   STM32可以实现跳转
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 11:38

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

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