1. for循环,如果在for内定义变量进行循环,一定要初始化。
//这里犯了错误,for循环,一定要赋初值 uint8_t j=0 。如果是 for(uint8_t j;j<2;j++) 会出错
正确示例
for(uint8_t j=0;j<2;j++) //这里犯了错误,for循环,一定要赋初值 uint8_t j=0
2. flash读一页(256byte),for循环操作时,循环变量定义不能用u8 char一个byte(0~255),得用u16. //如果不是u16而是u8,那这个循环永远不会结束,u8类型达不到256.
正确示例
for(uint16_t i=0;i<256;i++)
3.flash完整性测试示例,全部区域都进行循环测试直至测试出错误。擦除后对区域写入0xaa;即1010 1010;一遍过后翻转写入0x55。
static uint8_t aa_55 =0xaa;
while(1)
{
WDT_Restart(); //不断喂狗
if(flash_cnt2>2047) //外部flash 8Mb 8*1024*1024bytes,即0x800000;一次测试4096byte,2048次可以测完全部flash //5秒一次 4096byte
// if(flash_cnt2>1) //外部flash 8Mb 8*1024*1024bytes,即0x800000;一次测试4096byte,2048次可以测完全部flash //5秒一次 4096byte
{
flash_cnt2=0;//开启下一轮全部flash测试
aa_55 = ~aa_55;
}
uint8_t StoreBuff[EXT_FLASH_SECTION_SIZE]; //这里犯了错误 buff char型 4k大小,不要 u32,int4字节 32位 ;
uint8_t temp_buff[EXT_FLASH_PACKAGE_SIZE];
if(flash_status1==true)
{
srand( (UINT32)jiffies );
int ret =rand();
flash_erase(FLASH_SECTOR_ERASE,EXT_FLASH_SECTION_SIZE *flash_cnt2); //一次擦除4k,区域每次向后加4k
memset(&StoreBuff,0x55,EXT_FLASH_SECTION_SIZE);
memset(&StoreBuff,0, EXT_FLASH_SECTION_SIZE);
memset(&StoreBuff,0xaa,EXT_FLASH_SECTION_SIZE);
memset(&temp_buff,0x00,EXT_FLASH_PACKAGE_SIZE);
memset(&temp_buff,aa_55,EXT_FLASH_PACKAGE_SIZE);
sl_log_tx(VER_PRINT_EN," erase write ok address =%x\r\n",EXT_FLASH_SECTION_SIZE *flash_cnt2);
for(uint8_t j=0;j<16;j++) //每次页写 256byte,写16页为一个sector ,4096byte
{
flash_byte_write(temp_buff,EXT_FLASH_SECTION_SIZE *flash_cnt2+sizeof(temp_buff)*j,sizeof(temp_buff));
}
flash_status1=false;
flash_flag=3;
}
if((flash_flag==3)&&(flash_status2==true)) //只有擦除并写入后&& 定时时间到,才会进行验证
{
flash_flag=2;
flash_status2=false;
memset(&StoreBuff,0,EXT_FLASH_SECTION_SIZE);
memset(&temp_buff,0,EXT_FLASH_PACKAGE_SIZE);
for(uint8_t j=0;j<16;j++) //这里犯了错误,for循环,一定要赋初值 uint8_t j=0 还有一个crc错误
{
flash_byte_read(temp_buff,EXT_FLASH_SECTION_SIZE *flash_cnt2+sizeof(temp_buff)*j,sizeof(temp_buff));
memcpy(StoreBuff+sizeof(temp_buff)*j,temp_buff,sizeof(temp_buff));
}
for(uint16_t i=0;i<256;i++)
{
sl_log_tx(VER_PRINT_EN," StoreBuff[i]=0x%x \r\n",StoreBuff[i]);
}
flash_cnt1++;//总次数
flash_cnt2++;
sl_log_tx(VER_PRINT_EN,"read ok flash_cnt1 =%d ,aa_55=%x \r\n",flash_cnt1,aa_55);
for(uint16_t i=0;i<4096;i++) //检测所有sector
{
if(StoreBuff[i]!=aa_55)
{
while(1)
{
sl_log_tx(VER_PRINT_EN,"++++++++++++++++++++++++++++++++++++++ error StoreBuff[i]=0x%x ,flash_cnt1=%d ,address =%x \r\n",StoreBuff[i],flash_cnt1,EXT_FLASH_SECTION_SIZE *flash_cnt2);
//flash出错,循环打印出错的值和位置和测试次数
WDT_Restart();
}
}
}
}
time_task();
}
4.正常来说,未使用过的flash区域的值应该都是ff,理论上。
5.crc32 算法使用时,遇到一个坑,犯错了。
指针不同于一般变量,存的是变量的地址,对于win11 64 位操作系统, 基于 x64 的处理器,任何类型的指针变量都是占用8个字节,指针的加1 是地址的+8。但是在32位单片机中,就都是4字节了
for(i=0;i<sizeof (sl_4g_cfg_t)-sizeof (unsigned int);i=i+4)
{
uint8_t ttt4[4]={0x00};
memcpy(ttt4,((uint8_t *)&(para_4g))+i,4);
feed_software_dog();
sl_crc32((const void *)ttt4, 4, &crc32);
关于指针的用法,今天我会再做一个小实验,将para_4g值打出来,取地址,强转u8*,都打出来看看。 23.6.27