diff --git a/src/file.cpp b/src/file.cpp index 48a1d19d4..d9ab57caf 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -206,18 +206,17 @@ bool EFile::exists(uint8_t i_fileId) */ void EFile::swap(uint8_t i_fileId1, uint8_t i_fileId2) { - /* This code causes horrible alignment problem with avr-gcc 4.7.0 - * - * DirEnt tmp = eeFs.files[i_fileId1]; - * eeFs.files[i_fileId1] = eeFs.files[i_fileId2]; - * eeFs.files[i_fileId2] = tmp; - */ +#if ((__GNUC__ > 4 || __GNUC__ == 4) && (__GNUC_MINOR__ > 7 || __GNUC_MINOR__ == 7)) DirEnt tmp; __builtin_memcpy(&tmp, __builtin_assume_aligned(&eeFs.files[i_fileId1], sizeof(DirEnt)), sizeof(DirEnt)); __builtin_memcpy(&eeFs.files[i_fileId1], __builtin_assume_aligned(&eeFs.files[i_fileId2], sizeof(DirEnt)), sizeof(DirEnt)); __builtin_memcpy(&eeFs.files[i_fileId2], __builtin_assume_aligned(&tmp, sizeof(DirEnt)), sizeof(DirEnt)); - +#else + DirEnt tmp = eeFs.files[i_fileId1]; + eeFs.files[i_fileId1] = eeFs.files[i_fileId2]; + eeFs.files[i_fileId2] = tmp; +#endif s_sync_write = true; EeFsFlushDirEnt(i_fileId1); EeFsFlushDirEnt(i_fileId2);