I am trying to memory map a flash region using spi_flash_mmap() , starting address 0x300000 , 1 MB in size .
I am trying to memory map it to the instruction memory space (SPI_FLASH_MMAP_INST) .
However I am getting an exception while trying to do that .
"Guru Meditation Error of type LoadProhibited occurred on core 0. Exception was unhandled."
I am successful in memory mapping to the data memory space(SPI_FLASH_MMAP_DATA)
Are there any restrictions while memory mapping to the instruction memory space ?
SPI_FLASH_MMAP_INST Exception
Re: SPI_FLASH_MMAP_INST Exception
Hi Elix22,
The main restriction with mapping to the instruction space is that all reads from this space have to be 4 byte aligned word reads. LoadStoreError will occur on an unaligned or non-4-byte read from instruction space (you would expect LoadStoreAlignment exception instead, but for some reason it's not that.)
If that doesn't fix the problem, could you please post the full exception dump and the output of spi_flash_mmap_dump(), and maybe a code snippet? Thanks.
Angus
The main restriction with mapping to the instruction space is that all reads from this space have to be 4 byte aligned word reads. LoadStoreError will occur on an unaligned or non-4-byte read from instruction space (you would expect LoadStoreAlignment exception instead, but for some reason it's not that.)
If that doesn't fix the problem, could you please post the full exception dump and the output of spi_flash_mmap_dump(), and maybe a code snippet? Thanks.
Angus
Re: SPI_FLASH_MMAP_INST Exception
Hi Angus .
Thanks for the quick reply.
Attached a small example that triggers the exception.
Both the address and the size are 4 bytes aligned .
Looks like a genuine issue.
Thanks for the quick reply.
Attached a small example that triggers the exception.
Both the address and the size are 4 bytes aligned .
Looks like a genuine issue.
Code: Select all
#include "freertos/FreeRTOS.h"
#include "esp_wifi.h"
#include "esp_system.h"
#include "esp_event.h"
#include "esp_event_loop.h"
#include "nvs_flash.h"
#include "driver/gpio.h"
#include <esp_log.h>
#include <esp_err.h>
#include <esp_spi_flash.h>
#define ADDR 0x300000
#define MEMMAP_SIZE (1024*1024)
static char tag[] = "memmap_test";
static spi_flash_mmap_handle_t handle;
static uint32_t pInstrPtr = 0;
void app_main(void)
{
nvs_flash_init();
tcpip_adapter_init();
spi_flash_init();
esp_err_t rc = spi_flash_mmap((uint32_t) ADDR, MEMMAP_SIZE, SPI_FLASH_MMAP_INST, (const void **)&pInstrPtr, &handle);
if (rc != ESP_OK) {
ESP_LOGE(tag, "rc from spi_flash_mmap: %d", rc);
}
else
{
ESP_LOGD(tag, "spi_flash_mmap success");
}
}
Who is online
Users browsing this forum: ok-home and 110 guests