最近大佬们开发新平台bootload的时候出了点小问题,EE读写不太正常,于是乎,我!小兵登场!
-------------------------更新------------------------------------
今天发现不是接口使用问题,归根于EE进行读操作后,在并没有写完数据时就有其他操作访问了EE,所以一直体现出写失败。在写EE过程中增加100us延时后解决
一、问题描述
EE读写不正常,由于大佬们比较忙,没时间去具体看,所以先让我找下原因
二、排查过程
小登指定是没有透过现象看本质的本事,直接跟着代码往下走,看看现象先。
直接在Eep下手,代码如下:
uint8 i = 0;
uint8 Tmp[8u] = 0;
void Eep_W_R_Test(void)
{
Eep_Read("地址","数据指针","长度")
Eep_MainFunction();
for ( i = 0; i < 8u; i++)
{
Tmp[i] = 1;
}
Eep_Write("地址","数据指针","长度");
Eep_MainFunction();
}
在Eep_Read/Eep_Write函数中会经过处理,将读写标志位置位,然后进入Eep_MainFunction函数中进行读写操作。在这时候我发现,程序跑进Eep_MainFunc之后,无论是从Read进的还是Write进的,都执行的是读操作,也就是说,写操作是没有生效的。而写操作的前置条件是目标块空闲。
其实进行到这任务就已经结束了,懂得人已经明白什么意思了,读/写操作没有完成,自然无法进行下一个操作,但是小登不懂啊,小登在读操作流程完成之后,手动让目标块空闲,你别说,还真行了。但是这样直接修改底层接口的方法容易破坏整体的调度,可以试但不能成为一种方法。于是小登去查了相关技术手册,找到了Nvm模块中的读写函数接口。
从这开始做无用功,对照技术手册的用法,改代码,但是忽略的局部变量与全局变量的区别,本来是全局变量全被我放到函数体中变成了局部变量,导致函数中对这些变量的各种处理变成了一次性的操作,随着一次一次的debug,小登发现了规律,当从第一次写操作进行结束之后,在进行3个循环,结束后,目标块状态变为了空闲。多次尝试后确定了当前现象,由于我是小登,对这方面了解确实没有,强行逮住大佬问了一下,大佬说【四次在预期内,可能是EE换页,有标志位的话等一下再看看。】
好,几天白干,就是这个原因,也就是说什么问题都没有,只是原来的测试程序没有等操作执行结束导致队列占满。然后写了个测试函数:
/****************************************************************************
* Function Name :Test
*
*
*
*
*****************************************************************************/
uint16 Test_Flag = 0U;
uint8 jobResult = 0U;
uint8 readBufBoot[8] = {0};
uint8 writeBufBoot[8] = {1,0,1,0,1,0,1,0};
void Test(void)
{
switch (Test_Flag)
{
case 0:
WriteBlock(BLOCKID, writeBufBoot);
Test_Flag = 1U;
break;
case 1:
GetErrorStatus(BLOCKID, & jobResult);
if( REQ_OK == jobResult )
{
ReadBlockBLOCKID, &readBufBoot[BOOT_ZERO]);
Test_Flag = 2U;
}
break;
case 2:
GetErrorStatus(BLOCKID, & jobResult);
if( REQ_OK == jobResult )
{
Test_Flag = 0U;
}
break;
default:
Test_Flag = 1U;
break;
}
}
总结
总的来说,只是一个接口使用问题,硬生生占用了我一周的时间,主要原因还是经验不足,对一个完全陌生的模块还是有点慌乱。