Problem to write files in the flash memory!

I'm working on a project that I need to write a file in the flash memory, but when I calling the function to open file (fs_open), the microcontroller crashes completely and the following message appears:


->E: ***** MPU FAULT *****
->E: Stacking error (context area might be not valid)
->E: Data Access Violation
->E: MMFAR Address: 0x200159b8
->E: r0/a1: 0x8625890d r1/a2: 0x911daf84 r2/a3: 0x8779922f
->E: r3/a4: 0xfe8bd497 r12/ip: 0xd8dc16c8 r14/lr: 0xb98b5e52
->E: xpsr: 0x5fd38800
->E: Faulting instruction address (r15/pc): 0xac1da62a
->E: >>> ZEPHYR FATAL ERROR 2: Stack overflow on CPU 0
->E: Current thread: 0x20001be8 (unknown)
->E: Halting system

- Libraries used to file system:

#include <zephyr/storage/flash_map.h>
#include <zephyr/fs/fs.h>
#include <zephyr/fs/littlefs.h>
- Functions to WriteFile, ReadFile, RemoveFile, etc:
ssize_t sirros_readFile(char * file_name, char* file_content, size_t file_size, off_t file_pos) {
	char caminho_arquivo[MAX_FILE_PATH_LEN];
	struct fs_file_t file;
	int ret;
	ssize_t read_size;
	snprintf(caminho_arquivo, sizeof(caminho_arquivo), "%s%s", mp->mnt_point, file_name);
	fs_file_t_init(&file);

	ret = fs_open(&file, caminho_arquivo, FS_O_READ);
	if (ret)
		return 0;
		
	if (file_pos != 0)
		fs_seek(&file, file_pos, FS_SEEK_SET);

	read_size = fs_read(&file, file_content, file_size);
	ret = fs_close(&file);
	file_content[read_size] = 0;
	return read_size;
}

bool sirros_writeFile(char * file_name, char* file_content, size_t file_size, off_t file_pos) {
	//printf("entrei na writeFile");
	char caminho_arquivo[MAX_FILE_PATH_LEN];
	struct fs_file_t file;
	int ret;
	size_t written_size = 0;
	//printf("parte 1");
	snprintf(caminho_arquivo, sizeof(caminho_arquivo), "%s%s", mp->mnt_point, file_name);
	//printf("parte 2");
	fs_file_t_init(&file);
	//printf("parte 3");
	ret = fs_open(&file, caminho_arquivo, FS_O_CREATE | FS_O_WRITE);
	//printf("parte 4");
	if(ret < 0)
		return false;
    //printf("parte 5");
	if (file_pos != 0)
		fs_seek(&file, file_pos, FS_SEEK_SET);
   
	if(file_size == 0)
		file_size = strlen(file_content);

	written_size = fs_write(&file, file_content, file_size);
	ret = fs_close(&file);
	return written_size == file_size;
}

bool sirros_appendFile(char * file_name, char* file_content, size_t file_size) {
	char caminho_arquivo[MAX_FILE_PATH_LEN];
	struct fs_file_t file;
	int ret;
	size_t written_size = 0;
	snprintf(caminho_arquivo, sizeof(caminho_arquivo), "%s%s", mp->mnt_point, file_name);
	fs_file_t_init(&file);
		ret = fs_open(&file, caminho_arquivo, FS_O_CREATE | FS_O_APPEND);
	if(ret < 0)
		return false;

	if(file_size == 0)
		file_size = strlen(file_content);

	written_size = fs_write(&file, file_content, file_size);
	ret = fs_close(&file);
	return written_size == file_size;
}

bool sirros_existsFile(char * file_name) {
	char caminho_arquivo[MAX_FILE_PATH_LEN];
	struct fs_file_t file;
	int ret;
	snprintf(caminho_arquivo, sizeof(caminho_arquivo), "%s%s", mp->mnt_point, file_name);
	fs_file_t_init(&file);
	ret = fs_open(&file, caminho_arquivo, 0);
	fs_close(&file);
	return ret == 0;
}

bool sirros_removeFile(char * file_name) {
	char caminho_arquivo[MAX_FILE_PATH_LEN];
	snprintf(caminho_arquivo, sizeof(caminho_arquivo), "%s%s", mp->mnt_point, file_name);
	int ret = fs_unlink(caminho_arquivo);
	return ret == 0;
}
Code snippet where I call the function:
- Write:
	sprintf(payload_id_char, "%d", payload_id);
	sirros_removeFile("/arq_id.txt");
	sirros_writeFile("/arq_id.txt", &payload_id_char, strlen(payload_id_char), 0);
- Read:
	sirros_readFile("/arq_id.txt", payload_id_char, sizeof(payload_id_char), 0);
	payload_id = atoi(payload_id_char);
	printf("payload_id: %i", payload_id);
OBS.: "payload_id" is an int variable and "payload_id_char" is a char variable.
Parents
  • Hi
    I forgot to mention that I call fs_mount before accessing the external flash. Below is the code snippet:

    void sirros_begin() {  //função para inicializar a configuração do dispositivo
    	printf("BEGIN\n");
    	uint32_t ret = 0;
    	if (!fs_mounted) {
    		ret = littlefs_mount(mp);
    		if (ret < 0) {
    			printf("FALHA AO MONTAR O FS");
    			sirros_noParameters();
    			goto final_begin;
    		}
    		fs_mounted = true;
    	}
    

    I also forgot to mention that in other parts of the code, where I apply the same function calls for writing and reading the file, everything works correctly. It's just that specific part I mentioned earlier where the system crashes and that error message appears.

Reply
  • Hi
    I forgot to mention that I call fs_mount before accessing the external flash. Below is the code snippet:

    void sirros_begin() {  //função para inicializar a configuração do dispositivo
    	printf("BEGIN\n");
    	uint32_t ret = 0;
    	if (!fs_mounted) {
    		ret = littlefs_mount(mp);
    		if (ret < 0) {
    			printf("FALHA AO MONTAR O FS");
    			sirros_noParameters();
    			goto final_begin;
    		}
    		fs_mounted = true;
    	}
    

    I also forgot to mention that in other parts of the code, where I apply the same function calls for writing and reading the file, everything works correctly. It's just that specific part I mentioned earlier where the system crashes and that error message appears.

Children
No Data
Related