记录一次因为stack_size太小引起的问题。
作者:互联网
出问题的函数如下:
1 char *calc_file_md5(const char* fw_name) 2 { 3 FRESULT result; 4 FIL File; 5 uint32_t BytesRead = 0,offset = 0,file_size = 0; 6 MD5_CTX context; //MD5 7 unsigned char digest[16]; 8 uint8_t i = 0; 9 10 result = f_open(&File,fw_name,FA_OPEN_EXISTING|FA_READ); //打开文件 11 if(FR_OK != result) 12 { 13 DEBUG_LOG(DEBUG_FW,("Not Find %s\n",fw_name)); 14 return 0; 15 } 16 file_size = File.obj.objsize;//结束地址为起始地址加上文件大小。 17 MD5Init(&context); 18 while(1) 19 { 20 f_lseek(&File,offset); 21 result = f_read(&File,file_buffer,2048,&BytesRead); 22 if(result || BytesRead==0) 23 { 24 DEBUG_LOG(DEBUG_FW,("read %s error!\n",fw_name)); 25 return 0; 26 } 27 MD5Update(&context, file_buffer, BytesRead); 28 29 offset+=BytesRead; 30 if(offset==file_size) 31 break; 32 } 33 34 MD5Final(digest, &context); 35 f_close(&File); 36 for (i = 0; i < 16; i++) 37 rt_sprintf(cal_md5_str+(i*2),"%02X",digest[i]); 38 39 DEBUG_LOG(DEBUG_FW,("cal_md5:%s\n",cal_md5_str)); 40 41 return cal_md5_str; 42 }
就计算个MD5值的代码,计算不对。不知道问题出在哪里,MD5算法是之前移植好,实验无误的。就吧这个函数有关的,全部弄到我的另一个工程,实验计算正确!这就纳闷了呀。工程本身的问题?玄学?
于是,(我在这个函数,又添加了些代码,试图读回读出的文件。结果MD5计算值变了,但不对。——以上为胡乱尝试,无头苍蝇,瞎试)。我把第4行 弄到外边 让File作为全局变量,竟然正确了。
再次弄进来让它作为局部变量,还是错误。立刻认识到可能是Stack_size设置小了,导致File里的数据在入栈出栈的时候发生错误了。于是我把Statck_size由0x400改为0x800,于是就好了。
这里引出几个问题:
1 描述stm32的Stack_Mem,Heap_Mem的作用。
栈(stack)空间,用于局部变量,函数调时现场保护和返回地址,函数的形参等。
堆(heap)空间,主要用于动态内存分配,也就是说用 malloc,calloc, realloc 等函数分配的变量空间
2 怎么在早期意识到Stack_size可能不够用,即怎么估计我最大要用到的Stacks_size的大小?
3 用rtos加持的stm32的Stack_Mem,Heap_Size的作用。
标签:File,太小,result,file,DEBUG,md5,stack,size 来源: https://www.cnblogs.com/Rainingday/p/14506835.html