stm32 + rtos를 사용하여 spi flash를 기반으로 파일 시스템을 구현하고 있습니다. freertos의 경우 heap_1 구현을 채택했습니다. 이것은 내가 어떻게 내 일을 창조하는지입니다.Freertos + STM32 - malloc을 통한 스레드 메모리 오버플로
osThreadDef(Task_Embedded, Task_VATEmbedded, osPriorityNormal, 0, 2500);
VATEmbeddedTaskHandle = osThreadCreate(osThread(Task_Embedded), NULL);
이 스레드에 10000 바이트의 메모리가 할당되었습니다.
및이 스레드 플래시에 데이터를 쓰려고했습니다. 처음 몇 권에서는 성공적으로 작동했습니다. 하지만 여하튼 나는 더 많은 글쓰기를 시도 할 때 충돌이 일어난다.
VATAPI_RESULT STM32SPIWriteSector(void *writebuf, uint8_t* SectorAddr, uint32_t buff_size){
if(STM32SPIEraseSector(SectorAddr) == VAT_SUCCESS){
DBGSTR("ERASE SECTOR - 0x%2x %2x %2x", SectorAddr[0], SectorAddr[1], SectorAddr[2]);
}else return VAT_UNKNOWN;
if(STM32SPIProgram_multiPage(writebuf, SectorAddr, buff_size) == VAT_SUCCESS){
DBGSTR("WRTIE SECTOR SUCCESSFUL");
return VAT_SUCCESS;
}else return VAT_UNKNOWN;
return VAT_UNKNOWN;
}
.
VATAPI_RESULT STM32SPIProgram_multiPage(uint8_t *writebuf, uint8_t *writeAddr, uint32_t buff_size){
VATAPI_RESULT nres;
uint8_t tmpaddr[3] = {writeAddr[0], writeAddr[1], writeAddr[2]};
uint8_t* sectorBuf = malloc(4096 * sizeof(uint8_t));
uint8_t* pagebuf = malloc(255* sizeof(uint8_t));
memset(§orBuf[0],0,4096);
memset(&pagebuf[0],0,255);
uint32_t i = 0, tmp_convert1, times = 0;
if(buff_size < Page_bufferSize)
times = 1;
else{
times = buff_size/(Page_bufferSize-1);
if((times%(Page_bufferSize-1))!=0)
times++;
}
/* Note : According to winbond flash feature, the last bytes of every 256 bytes should be 0, so we need to plus one byte on every 256 bytes*/
i = 0;
while(i < times){
memset(&pagebuf[0], 0, Page_bufferSize - 1);
memcpy(&pagebuf[0], &writebuf[i*255], Page_bufferSize - 1);
memcpy(§orBuf[i*Page_bufferSize], &pagebuf[0], Page_bufferSize - 1);
sectorBuf[((i+1)*Page_bufferSize)-1] = 0;
i++;
}
i = 0;
while(i < times){
if((nres=STM32SPIPageProgram(§orBuf[Page_bufferSize*i], &tmpaddr[0], Page_bufferSize)) != VAT_SUCCESS){
DBGSTR("STM32SPIProgram_allData write data fail on %d times!",i);
free(sectorBuf);
free(pagebuf);
return nres;
}
tmp_convert1 = (tmpaddr[0]<<16 | tmpaddr[1]<<8 | tmpaddr[2]) + Page_bufferSize;
tmpaddr[0] = (tmp_convert1&0xFF0000) >> 16;
tmpaddr[1] = (tmp_convert1&0xFF00) >>8;
tmpaddr[2] = 0x00;
i++;
}
free(sectorBuf);
free(pagebuf);
return nres;
}
나는 디버거를 열고 난 혼란 임 내가 "malloc에"후 메모리를 무료로했다는 것을 무엇인지, 기능 "STM32SPIProgram_multiPage"의 "sectorbuf"를 malloc으로 할당 할 때 충돌처럼 보인다. 누구나 그것에 대해 생각해 봤어?
팔 - 없음 - EABI 크기 "RTOS.elf"독서하는 dec 진수 파일 이름
77,564 988 100,756 179,308 2bc6c RTOS.elf
오. 전에 "sectorBuf"와 "pagebuf"를 전역 변수로 넣으면 모든 함수가 잘 작동합니다. 하지만 너무 많은 RAM을 소비합니다. 왜 이제는 동적 메모리를 대신 사용했는지. – Pawan
그래서 문제는 동적 메모리를 사용하여 발생합니다 생각합니다. – Pawan
malloc (heap_1.c 및 관련 힙 크기는 malloc과 완전히 독립적입니다)에 의해 힙 관리를위한 메모리를 할당 했습니까? – Garf365