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
  • So in what file are these code snippets called where it results in this error versus where it works as intended? Are you trying to connect, write and read from the same external flash device in both cases, or is it trying to access another device using different GPIOs for example? I need more details on what you're doing in your application and what the difference(s) between the working and non-working calls to the file system is.

    Best regards,

    Simon

Reply
  • So in what file are these code snippets called where it results in this error versus where it works as intended? Are you trying to connect, write and read from the same external flash device in both cases, or is it trying to access another device using different GPIOs for example? I need more details on what you're doing in your application and what the difference(s) between the working and non-working calls to the file system is.

    Best regards,

    Simon

Children
No Data
Related