Ich arbeite mit Stm32 + Rtos, um ein Dateisystem basierend auf Spi-Flash zu implementieren. Für Freertos habe ich die Implementierung von heap_1 übernommen. So erstelle ich meine Aufgabe.Freertos + STM32 - Thread-Speicherüberlauf mit malloc
Ich habe diesem Thread 10000 Bytes Speicher zugewiesen.
und in diesem Thread. Ich habe versucht, Daten in Flash zu schreiben. In den ersten paar Fällen hat es erfolgreich funktioniert. aber irgendwie stürzt es ab, wenn ich mehr Zeit des Schreibens versuchte.
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;
}
Ich öffne den Debugger und es scheint, wie es zum Absturz bringen, wenn ich „sectorbuf“ in Funktion „STM32SPIProgram_multiPage“ malloced, was Im verwirrt ist, dass ich nach „malloc“ frei, den Speicher hat. Hat jemand eine Idee?
Arm-none-EABI-size "RTOS.elf"
Textdaten bss dez hex Dateiname
77564 988 100756 179308 2bc6c RTOS.elf
oh. Vorher habe ich "sectorBuf" und "pagebuf" als globale Variablen verwendet, dann funktionieren alle Funktionen gut. aber es verbrauchen zu viel RAM, wenn ich dies tue. Deshalb benutzte ich stattdessen dynamisches Gedächtnis. – Pawan
Also ich denke, das Problem wird durch die Verwendung von dynamischem Speicher verursacht. – Pawan
Haben Sie Speicher für Heap-Management von malloc zuweisen (Heap_1.c und die zugehörige Heap-Größe ist völlig unabhängig von Malloc) – Garf365