调试问题记录(1)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值