问题描述:
两个任务,一个任务初始化一个结构体数组,一个任务从内部flash读取数据赋值到结构体数组中,结构体数组用来配置输出,但是配置输出异常,打印发现前面的数据被覆盖,内部flash在没有数据写入的情况下读出的数据是0xFF,怀疑是读取和初始化的时间冲突的问题。所以读出的数据将一部分数据覆盖了。
再次尝试,覆盖的数据更多,确定是。
将另一个任务的读取注释,正常
查阅资料是这种现象被称为“竞态条件”(Race Condition)。
当两个或更多的并发任务尝试访问和修改同一数据源,并且任务的执行顺序会影响结果时,就会发生竞态条件。但是在读取的时候进行了判断,如果读取的数据为空,并不会将数据覆盖到缓存区中,所以虽然问题解决了,但是应该不是这个问题。
初始化时读取了两个数据放在不同缓存区,于是尝试一句句注释,发现读取到当前缓存区没有出问题,反而是在读取另一个缓存区的时候导致了这种现象,于是将两个读取分开放到不同的任务中,解决问题。
怀疑是任务大小不够,检查最开始出问题的堆栈大小,将栈大小调大没有用,事实上,全局变量是通过指针的方式调用的,并不是将整个赋值到任务的栈空间上,所以和任务的大小没有关系。
再次尝试将两次读取放在同一个任务中,这次没有问题,怀疑和任务的创建先后有关,于是把原来的任务放在初始化任务前面,再次进行读取,解决问题。
但是任务创建的先后并不仅仅取决于程序中任务的先后,还取决于优先级。
怀疑是读取两个参数顺序不对,先读取的大的缓冲区再读取小的缓存区解决问题。