Saving on erase cycles
Sometimes, you just need to cycle through all 256 possible one-byte values … on flash. Brute force would take 255 erase cycles (slow). Let’s make it take 70 erase cycles (fast!):
For the die-hard math geeks...
the search phrases you want are:
8‑bit Boolean latticesymmetric chain decomposition- **
monotoneconstraints (unidirectional change of bits in all chains)
It was already a solved problem, nothing really new from me.
Efficient flash walk
FLASH_WALK = bytes([
0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x7F, 0x7E, 0x7C, 0x78, 0x70, 0x60, 0x40,
0xBF, 0xBE, 0xBC, 0xB8, 0xB0, 0xA0, 0x20, 0xDF, 0xDE, 0xDC, 0xD8, 0xD0, 0x90, 0x10, 0xEF, 0xEE,
0xEC, 0xE8, 0xC8, 0x88, 0x08, 0xF7, 0xF6, 0xF4, 0xE4, 0xC4, 0x84, 0x04, 0xFB, 0xFA, 0xF2, 0xE2,
0xC2, 0x82, 0x02, 0xFD, 0xF9, 0xF1, 0xE1, 0xC1, 0x81, 0x01, 0x3F, 0x3E, 0x3C, 0x38, 0x30, 0x5F,
0x5E, 0x5C, 0x58, 0x50, 0x6F, 0x6E, 0x6C, 0x68, 0x48, 0x77, 0x76, 0x74, 0x64, 0x44, 0x7B, 0x7A,
0x72, 0x62, 0x42, 0x7D, 0x79, 0x71, 0x61, 0x41, 0x9F, 0x9E, 0x9C, 0x98, 0x18, 0xAF, 0xAE, 0xAC,
0xA8, 0x28, 0xB7, 0xB6, 0xB4, 0xA4, 0x24, 0xBB, 0xBA, 0xB2, 0xA2, 0x22, 0xBD, 0xB9, 0xB1, 0xA1,
0x21, 0xCF, 0xCE, 0xCC, 0x8C, 0x0C, 0xD7, 0xD6, 0xD4, 0x94, 0x14, 0xDB, 0xDA, 0xD2, 0x92, 0x12,
0xDD, 0xD9, 0xD1, 0x91, 0x11, 0xE7, 0xE6, 0xC6, 0x86, 0x06, 0xEB, 0xEA, 0xCA, 0x8A, 0x0A, 0xED,
0xE9, 0xC9, 0x89, 0x09, 0xF3, 0xE3, 0xC3, 0x83, 0x03, 0xF5, 0xE5, 0xC5, 0x85, 0x05, 0x1F, 0x1E,
0x1C, 0x2F, 0x2E, 0x2C, 0x37, 0x36, 0x34, 0x3B, 0x3A, 0x32, 0x3D, 0x39, 0x31, 0x4F, 0x4E, 0x4C,
0x57, 0x56, 0x54, 0x5B, 0x5A, 0x52, 0x5D, 0x59, 0x51, 0x67, 0x66, 0x46, 0x6B, 0x6A, 0x4A, 0x6D,
0x69, 0x49, 0x73, 0x63, 0x43, 0x75, 0x65, 0x45, 0x8F, 0x8E, 0x0E, 0x97, 0x96, 0x16, 0x9B, 0x9A,
0x1A, 0x9D, 0x99, 0x19, 0xA7, 0xA6, 0x26, 0xAB, 0xAA, 0x2A, 0xAD, 0xA9, 0x29, 0xB3, 0xA3, 0x23,
0xB5, 0xA5, 0x25, 0xC7, 0x87, 0x07, 0xCB, 0x8B, 0x0B, 0xCD, 0x8D, 0x0D, 0xD3, 0x93, 0x13, 0xD5,
0x95, 0x15, 0x0F, 0x17, 0x1B, 0x1D, 0x27, 0x2B, 0x2D, 0x33, 0x35, 0x47, 0x4B, 0x4D, 0x53, 0x55,
])
Using the flash walk table
Simply start at the first entry (0xFF), do what needs to be done, and when you need the next value, just grab the next index. If the next value continues the chain (old & new == new), you can skip the erase cycle. Just write the page of data with that one byte changed … and you’ve just saved an erase cycle. Rinse, lather, repeat … and you can test all 256 values in just 70 erase cycles.
That’s all folks. Why in this thread? Why indeed…