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:
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;
}
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); 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);