Phatline Posted October 26, 2021 Report Posted October 26, 2021 hei. I have a "huge" Array: u8 SongSQ[8][1024] it should be greater like [8][4096] ... it is used as Song-Step-Sequencer... but this would run out of RAM... (its a big ProjecT) so i thought loading in 1024 Parts from a SD, after each 1024 Steps, i make a "SONG_Extend++" and there is my "solution": // Read Data from file MUTEX_SDCARD_TAKE; // Read Data from file FILE_ReadOpen ( &midifile_fi, path_song); FILE_ReadBuffer( (u8 *)file_type, 4); //"SIGL" = 4 Positons FILE_ReadBuffer( (u8 *)&SongSQ, sizeof(SongSQ) ); // The Frist 1024 Steps of a Song if(SONG_Extend >= 1) { FILE_ReadBuffer( (u8 *)&SongSQ, sizeof(SongSQ) ); } // if there is no other way... if(SONG_Extend >= 2) { FILE_ReadBuffer( (u8 *)&SongSQ, sizeof(SongSQ) ); } // of adressing different sections on SD-Card ? if(SONG_Extend >= 3) { FILE_ReadBuffer( (u8 *)&SongSQ, sizeof(SongSQ) ); } // this way: it will load and overwrite until we come to the right section FILE_ReadClose ( &midifile_fi ); MUTEX_SDCARD_GIVE; ok this is a workaround, it reads each 1024-block over and over until it is blocked... In Lack of Knowledge to Jump to a Bufferposition - without loading into RAM - which i dont have (no place for a Dummy[8][1024] but the workaround doesnt work because when i Write the File: // Write Data into file FILE_WriteOpen ( path_tm, 8); FILE_WriteBuffer( (u8 *)file_type, 4); //"SIGL" = 4 Positons FILE_WriteBuffer( (u8 *)&SongSQ, sizeof(SongSQ) ); if(SONG_Extend >= 1) { FILE_WriteBuffer( (u8 *)&SongSQ, sizeof(SongSQ) ); } // this overwrites...other solution? if(SONG_Extend >= 2) { FILE_WriteBuffer( (u8 *)&SongSQ, sizeof(SongSQ) ); } if(SONG_Extend >= 3) { FILE_WriteBuffer( (u8 *)&SongSQ, sizeof(SongSQ) ); } FILE_WriteClose (); MUTEX_SDCARD_GIVE; it will overwrite already written 1024er-Blocks So the only solution is - what i see to jump to a specif sector aka SONG_Extend=0; ReadSector = 0 (or 4 when overjump the file_type section) SONG_Extend=1; sizeof(SongSQ) = ReadSector = 1024*8 = 8192 SONG_Extend=2; sizeof(SongSQ)+ sizeof(SongSQ) = ReadSector = 16384 SONG_Extend=3; sizeof(SongSQ) + sizeof(SongSQ) + sizeof(SongSQ) = ReadSector = 24576; but where and how to write the sectors to read can someone explain: FILE_WriteBuffer( (u8 *)&SongSQ, sizeof(SongSQ) ); where i write the Adress off Buffer and in which format ? file.c says: ///////////////////////////////////////////////////////////////////////////// //! Writes into a file with caching mechanism (actual write at end of sector) //! File has to be closed via FILE_WriteClose() after the last byte has been written ///////////////////////////////////////////////////////////////////////////// s32 FILE_WriteBuffer(u8 *buffer, u32 len) { UINT successcount; if( (file_dfs_errno=f_write(&file_write, buffer, len, &successcount)) != FR_OK ) { } so first Argument is the DATA to write, and the second the length... so it is not possible to overjump since it writes one after a nother? correct? Other Possibilitys? make 4 Files on Disk for each 1024 Steps. hopefully not. thx
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now