STM32两个APP跳转间,内存的重叠,冲突和影响

一、前言

目前,通用的做法,STM32的Flash分成两块App,一个BootLoader,一个应用App。

二、原因

因为,两个App是两个工程编译而成的,虽然Flash的地址划分开了,但是内存RAM没有分开。所以会导致某些问题。
看map文件就知道了。

三、问题

App中定义的全局变量,通常刚上电后,如果没有对其赋值,全局变量一般是0,全局指针一般是NULL。
假如,A应用的全局变量a在0x20000004的地址,B应用的全局变量的b也在0x20000004的地址。
A应用先启动,经过一番运行,a变量被赋值成了10。然后跳转到B应用,这是B应用的b也的值也成了10,而不是一般情况下的0。
我们普通惯性思维是全局变量如果未赋值一般是0,局部变量才会随机。这样就会导致其他异常问题。

四、处理

方法1 内存划分开

不推荐,因为本身内存就不多,再划分根本不够用。

方法2 初始化前做memset清零

不推荐,程序最开头,memset(0x20000000,0,0x1000);
简单粗暴,但是也容易把一些不该清零的变量清零了。

方法3 逐个对变量清零

推荐,虽然麻烦,胜在稳妥。
如果有些不方便的,直接弄成const。如下

char *const at_version=			"AT+VERSION?\r\n";
char *const at_pwr=					"AT+PWR\r\n";
const uint8_t ostd_promt_start_cmd[]={0x02,0x10,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x73,0x60}; 
const uint8_t ostd_promt_start_ack[]={0x02,0x10,0x00,0x00,0x00,0x01,0x01,0xfa};
const uint8_t ostd_promt_start_cmd_len = sizeof(ostd_promt_start_cmd)/sizeof(uint8_t);
const uint8_t ostd_promt_start_ack_len = sizeof(ostd_promt_start_ack)/sizeof(uint8_t);

五、其他

本文评论底下有些网友说,遇到这个问题,

跳转前在IAP中关中断,跳转后在APP中开中断
做一次软重启就行了

这些都没有用,不是一个问题。

  1. IAP关中断是一定要关的,但是不为了解决内存重叠问题
  2. 软重启就更没用了。硬重启都不顶用。
  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
### 回答1: stm32是一种基于ARM Cortex-M内核的微控制器系列,它具有强大的处理能力和丰富的外设资源。在stm32中,可以通过创建两个app并实现轮流运行来充分发挥其多任务处理的能力。 首先,我们可以创建两个不同的应用程序(App1和App2),每个应用程序使用不同的资源和功能。然后,我们可以使用操作系统(如FreeRTOS)或非操作系统的方法来实现这两个应用程序之的轮流切换。 在操作系统中,可以使用任务切换功能来实现两个应用程序之的轮流。一个任务就是一个独立的执行线程,它可以执行一段代码并占用处理器的时。我们可以定义两个任务,一个任务运行App1的代码,另一个任务运行App2的代码。操作系统会根据任务优先级、时片轮转等算法来进行任务切换,从而实现两个应用程序之的轮流运行。 在非操作系统的环境中,我们可以使用定时器中断来实现两个应用程序之的轮流切换。可以设置一个定时器,每个周期结束时触发中断,然后在中断服务函数中实现切换。比如,当定时器中断发生时,我们可以让App1运行一段时,然后在下一个定时器中断发生时,切换到App2运行,以此类推。 无论是使用操作系统还是非操作系统的方法,都需要合理设计和编写App1和App2的代码,确保它们能够正常运行并适应切换的需求。同时,还需要了解stm32的多任务处理机制和相关编程技术,以便能够灵活地应对各种情况和需求。 综上所述,可以借助操作系统或者定时器中断来实现stm32两个app的轮流运行,实现多任务处理的能力,充分发挥stm32的强大功能。 ### 回答2: STM32是一种微控制器,可以通过编程实现两个应用程序轮流运行的功能。轮流运行两个应用程序的方法有很多,这里提供一种常见的实现方式。 首先,需要对STM32进行编程,使用适当的集成开发环境(如Keil、STM32CubeIDE等)创建两个应用程序的工程。 在工程中,需要设置两个应用程序的逻辑和功能。可以使用中断进行切换,也可以使用定时器中断或其他方法来控制应用程序的切换。具体使用哪种方法取决于应用程序的需求和开发者的偏好。 在程序开始执行时,首先加载并运行第一个应用程序。在适当的时机,通过中断或定时器中断等机制,触发应用程序切换。切换到第二个应用程序后,继续运行。然后再触发切换回第一个应用程序。依此类推,实现两个应用程序的轮流运行。 在切换过程中,需要确保程序切换时的数据传递和状态保存。可以使用全局变量或者共享内存等方法来实现应用程序的数据传递和状态保存。 总之,通过合适的编程和切换机制,可以实现STM32两个应用程序的轮流运行。这种方式可以广泛应用于各种嵌入式系统和实时控制应用场景中。 ### 回答3: STM32是一款具有强大功能的微控制器,它可以通过切换两个应用程序实现轮流工作。在STM32中,可以使用多任务调度机制来实现这一功能。 首先,我们需要在STM32的FLASH存储器中安装两个应用程序。每个应用程序都有自己的入口点和功能。在开始时,可以选择其中一个应用程序作为默认应用程序。 然后,我们需要使用任务调度器来控制两个应用程序的轮流运行。任务调度器负责按照一定的算法选择要运行的应用程序,并在每个应用程序执行一段时后切换到另一个应用程序。 任务调度器可以采用不同的调度算法,如循环调度算法或优先级调度算法。在循环调度算法中,两个应用程序按照相同的时片来轮流执行。在优先级调度算法中,可以根据应用程序的重要性或优先级来确定运行顺序。 为了实现任务调度器,需要使用定时器和中断机制。定时器用于计算每个应用程序执行的时,中断用于在时片结束后触发任务切换。 总之,通过合理设计和实现任务调度器,并结合定时器和中断机制,可以实现在STM32两个应用程序的轮流运行。这种轮流工作的方式可以提高系统的效率和灵活性,并且可以根据具体的要求进行定制和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小康师兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值