Library for save an events log in Flash

Liste des GroupesRevenir à ca embedded 
Sujet : Library for save an events log in Flash
De : pozzugno (at) *nospam* gmail.com (pozz)
Groupes : comp.arch.embedded
Date : 18. Apr 2024, 16:38:32
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <uvrb97$24nd4$1@dont-email.me>
User-Agent : Mozilla Thunderbird
The request is very common: when some interested events occur in the system, they, with the related timestamp, must be saved in a log. The log must be saved in an external SPI Flash connected to a MCU. The log has a maximum number of events. After the log is completely filled, the new event overwrite the oldest event.
I tried to implement such library, but I eventually found it's not a simple task, mostly if you want a reliable library that works even when errors occur (for example, when one writing fails).
I started by assigning 5 sectors of SPI Flash to the log. There are 256 events in a sector (the event is a fixed struct).
In this scenario, the maximum log size is 1024 events, because the 5th sector can be erased when the pointer reaches the end of a sector.
The first challenge is how the system can understand what is the first (newest) event in the log at startup. I solved saving a 16-bits counter ID to each event. The initialization routine starts reading all the IDs and taks the greatest as the last event.
However initially the log is empty, so all the IDs are 0xFFFF, the maximum. One solution is to stop reading events when 0xFFFF is read and wrap-around ID at 0xFFFE and not 0xFFFF.
However there's another problem. What happens after writing 65535 events in the log? The ID restarts from 0, so the latest event hasn't the greatest ID anymore.
These are the saved IDs after 65536 events:
     1^ SECT    2^ SECT    3^ SECT    4^ SECT    5^SECT---------->
     0xFB00 ... 0xFC00 ... 0xFD00 ... 0xFE00 ... 0xFF00 ... 0xFFFF
The rule "newest event has greatest ID" is correct yet. Now a new event is written:
     1^ SECT-------> 2^ SECT   3^ SECT   4^ SECT   5^SECT--------->
     0x0000 0xFB01.. 0xFC00 .. 0xFD00 .. 0xFE00 .. 0xFF00 .. 0xFFFF
Now the rule doesn't work anymore. The solution I found is to detect discontinuity. The IDs are consecutive, so the initialization routine continues reading while the ID(n+1)=ID(n)+1. When there's a gap, the init function stops and found the ID and position of the newest event.
But he problems don't stop here. What happens if an event write failed? Should I verify the real written values, by reading back them and comparing with original data? In a reliable system, yes, I should.
I was thinking to protect an event with a CRC, so to understand at any time if an event is corrupted (bad written). However the possibility to have isolated corrupted events increase the complexity of the task a lot.
Suppose to write the 4th event with ID=3 at position 4 in the sector. Now suppose the write failed. I can try to re-write the same event at poisition 5. Should I use ID=4 or ID=5? At first, I think it's better to use ID=5. The CRC should detect that at position 4 is stored a corrupted event.
After that two events are written as well, ID=6 and 7.
Now the higher application wants to read the 4th event of the log (starting from the newest). We know that the newest is ID=7, so the 4th event is ID=7-4+1=4. However the event with ID=4 is corrupted, so we should check the previous ID=3... and so on.
Now we can't have a mathematical function that returns the position of an event starting from it's ordinal number from the newest event.
Eventually I think it's better to use a public domain library, if it exists.

Date Sujet#  Auteur
18 Apr 24 * Library for save an events log in Flash7pozz
18 Apr 24 +* Re: Library for save an events log in Flash4David Brown
18 Apr 24 i`* Re: Library for save an events log in Flash3pozz
19 Apr 24 i `* Re: Library for save an events log in Flash2David Brown
19 Apr 24 i  `- Re: Library for save an events log in Flash1pozz
19 Apr 24 `* Re: Library for save an events log in Flash2Don Y
19 Apr 24  `- Re: Library for save an events log in Flash1Don Y

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal