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.
  • Hi
    Correcting a point that I expressed wrongly. I had commented that the function formata_payloads_json() was called inside the loop(), but it is actually called inside a bluettoth callback. Below is the code snippet of bluettoth callback:

    ssize_t write_data_callback(struct bt_conn *conn, const struct bt_gatt_attr *attr,
    			const void *buf, uint16_t len, uint16_t offset, uint8_t flags) {
    	const char *value = attr->user_data;
    	printf("Comando: %s\n", value);
    	if (strcmp(value, "startAxis") == 0) {
    		leitura();
    		formata_payloads_json();
    		transfer_handler.source = NULL;
    	}
    	if (strncmp(value, "get.", 4) == 0) {
    		uint8_t eixo = value[4] - 'x';
    		printf("eixo: %i\n", eixo);
    		sirros_bt_transfer_start(&transfer_handler, output_payload[eixo]);
    	}
    	return len;
    }

  • Hi, I had a similar problem and I fixed it by increasing the Bluetooth RX Stack to 4000. I put this line on the prj.conf file:

    CONFIG_BT_RX_STACK_SIZE=4000
     

Related