私は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" 読書12月六角名
77564 988 100756 179308 2bc6c RTOS.elf
oh。以前は、 "sectorBuf"と "pagebuf"をグローバル変数に設定していましたが、すべての関数がうまく機能していました。私がそうするなら、それはあまりにも多くのRAMを消費する。なぜ私は代わりにダイナミックメモリを使用したのですか? – Pawan
私は問題がダイナミックメモリを使用することによって引き起こされると思います。 – Pawan
ヒープ管理のためのメモリをmalloc(heap_1.cとそれに関連するヒープサイズはmallocから完全に独立しています)で割り当てました – Garf365