1/18-------1

问题描述:

两个任务,一个任务初始化一个结构体数组,一个任务从内部flash读取数据赋值到结构体数组中,结构体数组用来配置输出,但是配置输出异常,打印发现前面的数据被覆盖,内部flash在没有数据写入的情况下读出的数据是0xFF,怀疑是读取和初始化的时间冲突的问题。所以读出的数据将一部分数据覆盖了。

再次尝试,覆盖的数据更多,确定是。

将另一个任务的读取注释,正常

查阅资料是这种现象被称为“竞态条件”(Race Condition)。

当两个或更多的并发任务尝试访问和修改同一数据源,并且任务的执行顺序会影响结果时,就会发生竞态条件。但是在读取的时候进行了判断,如果读取的数据为空,并不会将数据覆盖到缓存区中,所以虽然问题解决了,但是应该不是这个问题。

初始化时读取了两个数据放在不同缓存区,于是尝试一句句注释,发现读取到当前缓存区没有出问题,反而是在读取另一个缓存区的时候导致了这种现象,于是将两个读取分开放到不同的任务中,解决问题。

怀疑是任务大小不够,检查最开始出问题的堆栈大小,将栈大小调大没有用,事实上,全局变量是通过指针的方式调用的,并不是将整个赋值到任务的栈空间上,所以和任务的大小没有关系。

再次尝试将两次读取放在同一个任务中,这次没有问题,怀疑和任务的创建先后有关,于是把原来的任务放在初始化任务前面,再次进行读取,解决问题。

但是任务创建的先后并不仅仅取决于程序中任务的先后,还取决于优先级。

怀疑是读取两个参数顺序不对,先读取的大的缓冲区再读取小的缓存区解决问题。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值