|
Алгоритм записи на чип флэш памяти
|
|||
---|---|---|---|
#18+
У мнея есть SPI NOR FLASH чип (AT45DB021). Каждая страница размером 256 байт. При записи и стирании я оперирую страницами (при записи я должен передать опкод+номер страницы), минимальный размер стирания – страница. Стирание , запись, частичная запись Код: plaintext 1. 2. 3.
Я хочу использовать файловую систему для SPI NOR FLASH – SPIFFS. Для этого нужно передать свои функции чтения, записи, стирания в SPIFFS. Разработчики файловой системы определяют сигнатуру функций так Код: plaintext 1. 2. 3. 4. 5. 6.
То есть они оперируют адресами а не страницами. По адресу и размеру нужно рассчитать начальную и конечную страницу. К примеру адрес=200 размер=600. Тогда На страницу 0 нужно дописать 56 байт (с 200 по 256) На страницу 1 – полный размер – 256 байт На страницу 2 – полный размер – 256 байт На страницу 3 – первые 32 байт. Я реализовал функции так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83.
Я нигде не ошибся? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 10:19 |
|
Алгоритм записи на чип флэш памяти
|
|||
---|---|---|---|
#18+
jenya7, вы не учли, что первая страница и последняя страница -- это может быть одна и та же страница, если диапазон «address <= n < address + size» полностью умещается в одной странице. Я бы делал примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2021, 03:20 |
|
Алгоритм записи на чип флэш памяти
|
|||
---|---|---|---|
#18+
IMHO странная файловая система для флешек, которая не умеет / требует от программиста работать со страницами. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2021, 12:34 |
|
Алгоритм записи на чип флэш памяти
|
|||
---|---|---|---|
#18+
Пётр Седов jenya7, вы не учли, что первая страница и последняя страница -- это может быть одна и та же страница, если диапазон «address <= n < address + size» полностью умещается в одной странице. Я бы делал примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2021, 13:12 |
|
Алгоритм записи на чип флэш памяти
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev IMHO странная файловая система для флешек, которая не умеет / требует от программиста работать со страницами. я сам недоволен этим фактом. но почему то все файловые системы для флеш памяти требуют реализации адресного чтения, записи, стирания. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2021, 13:14 |
|
Алгоритм записи на чип флэш памяти
|
|||
---|---|---|---|
#18+
Пётр Седов jenya7, вы не учли, что первая страница и последняя страница -- это может быть одна и та же страница, если диапазон «address <= n < address + size» полностью умещается в одной странице. Я бы делал примерно так: но page_start = page * AT45D_PAGE_SIZE; - верно только для последней страницы, так как всегда даст начало страницы. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2021, 13:26 |
|
Алгоритм записи на чип флэш памяти
|
|||
---|---|---|---|
#18+
jenya7 page_start = page * AT45D_PAGE_SIZE; - верно только для последней страницы page = 0: page_start = 0 page = 1: page_start = 256 page = 2: page_start = 512 page = 3: page_start = 768 и т. д. (AT45D_PAGE_SIZE = 256). Нетривиальный код только для первой страницы и последней страницы (которые могут быть одной и той же страницей). Там есть 2 диапазона: * page_start <= n < page_end * address <= n < address + size С помощью функций max и min, мы считаем пересечение этих 2-ух диапазонов, это получается 3-ий диапазон «block_start <= n < block_end», который и надо записать в страницу. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2021, 15:16 |
|
Алгоритм записи на чип флэш памяти
|
|||
---|---|---|---|
#18+
Пётр Седов jenya7 page_start = page * AT45D_PAGE_SIZE; - верно только для последней страницы page = 0: page_start = 0 page = 1: page_start = 256 page = 2: page_start = 512 page = 3: page_start = 768 и т. д. (AT45D_PAGE_SIZE = 256). Нетривиальный код только для первой страницы и последней страницы (которые могут быть одной и той же страницей). Там есть 2 диапазона: * page_start <= n < page_end * address <= n < address + size С помощью функций max и min, мы считаем пересечение этих 2-ух диапазонов, это получается 3-ий диапазон «block_start <= n < block_end», который и надо записать в страницу. ах да. моя ошибка. а max и min можно переписать так? block_start = address - page_start; block_end = (address + size) - page_end; ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2021, 16:46 |
|
Алгоритм записи на чип флэш памяти
|
|||
---|---|---|---|
#18+
jenya7 а max и min можно переписать так? block_start = address - page_start; block_end = (address + size) - page_end; Пётр Седов Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2021, 18:46 |
|
|
start [/forum/topic.php?fid=16&msg=40045653&tid=1339686]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
160ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 263ms |
0 / 0 |