C Библиотека для преобразования физической вспышки SPI в произвольное количество логических круговых буферов. Интерфейс между SFCB и SPI Core реализуется как общая память.
-D при компиляции| Версия | Дата | Источник | Изменить журнал |
|---|---|---|---|
| последний | Последний.zip |
git clone --recursive https://github.com/andkae/SPI-Flash-Circular-Buffer.gitMakefile строит хранилище с помощью модульного теста:
$ make
gcc -c -O -Wall -Wextra -Wconversion -I . -I ../ -DW25Q16JV ./test/sfcb_test.c -o ./test/sfcb_test.o
gcc -c -O -Wall -Wextra -Wconversion -I . -I ../ -DW25Q16JV -DSFCB_PRINTF_EN ./spi_flash_cb.c -o ./test/sfcb.o
gcc -c -O -Wall -Wextra -Wconversion -I . -I ../ -DW25Q16JV ./test/spi_flash_model/spi_flash_model.c -o ./test/spi_flash_model.o
gcc ./test/sfcb_test.o ./test/sfcb.o ./test/spi_flash_model.o -Wall -Wextra -I. -lm -o ./test/sfcb_testСама часть библиотеки может быть построена с помощью:
gcc -c -O -Wall -Wextra -Wconversion -I . -DW25Q16JV -Werror ./spi_flash_cb.c -o ./test/sfcb.o Флэш -память W25Q16JV была выбрана через компиляцию -D .
Чтобы запустить модульный тестовый вызов:
$ ./test/sfcb_testИнициализирует общий рукояток SFCB и назначает память.
int sfcb_init ( t_sfcb * self , void * cb , uint8_t cbLen , void * spi , uint16_t spiLen );| Арг | Описание |
|---|---|
| себя | Элемент хранения SFCB |
| CB | Память круговой буферной очередь |
| Cblen | максимум Количество очередей CB |
| SPI | SFCB / SPI Core Exchange Buffer |
| Спилен | Размер буфера SPI в байтах |
Коды выхода
Создает новую логическую независимую очередь круговых буферов во вспышке SPI.
int sfcb_new_cb ( t_sfcb * self , uint32_t magicNum , uint16_t elemSizeByte , uint16_t numElems , uint8_t * cbID );| Арг | Описание |
|---|---|
| себя | Элемент хранения SFCB |
| Magicnum | Магическое число, должно быть уникальным для каждой очереди на одной и той же вспышке SPI |
| Elemsizebyte | Размер полезной нагрузки в байте, заголовок/нижний колонтитул вызывает |
| цифры | Минимальное количество необходимых элементов в очереди, окруженное до следующего полного сектора |
| CBID | назначенный идентификатор в эту очередь, необходимый для всех дальнейших запросов |
Коды выхода
Проверяет, обрабатывает ли SFCB другой запрос.
int sfcb_busy ( t_sfcb * self );| Арг | Описание |
|---|---|
| себя | Элемент хранения SFCB |
Коды выхода
В последнем запросе закончился ошибкой.
int sfcb_isero ( t_sfcb * self );| Арг | Описание |
|---|---|
| себя | Элемент хранения SFCB |
Коды выхода
Приобретает всю информацию о очереди от SPI Flash. Необходимо после вызова SFCB_ADD для обновления всей информации управления.
int sfcb_mkcb ( t_sfcb * self );| Арг | Описание |
|---|---|
| себя | Элемент хранения SFCB |
Коды выхода
Добавьте байты к текущему выбранному элементу круговых буферов.
int sfcb_add ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len );| Арг | Описание |
|---|---|
| себя | Элемент хранения SFCB |
| CBID | Циркулярная очередь буфера для взаимодействия |
| *данные | указатель на написание данных |
| Лен | Количество байтов в *данных |
Коды выхода
Записать нижний колонтитул , если не все доступные байты в элементе круговых буферов заняты ADD. Нижний нижний колонтитул используется для обнаружения полного написания элемента. Общая рекомендация состоит в том, чтобы позвонить sfcb_add_done каждый раз, когда вы завершаете написание элемента очереди.
int sfcb_add_done ( t_sfcb * self , uint8_t cbID );| Арг | Описание |
|---|---|
| себя | Элемент хранения SFCB |
| CBID | Циркулярная очередь буфера для взаимодействия |
Коды выхода
Приобретать текущее количество написанных байтов для элемента очередей. Включает многоступенчатые объекты данных в циркулярном буферном элементе.
uint16_t sfcb_get_pl_wrcnt ( t_sfcb * self , uint8_t cbID );| Арг | Описание |
|---|---|
| себя | Элемент хранения SFCB |
| CBID | Циркулярная очередь буфера для взаимодействия |
Напишите байт элемента очереди.
Читайте последний письменный элемент очереди обратно.
int sfcb_get_last ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len , uint32_t * elemID );| Арг | Описание |
|---|---|
| себя | Элемент хранения SFCB |
| CBID | Циркулярная очередь буфера для взаимодействия |
| *данные | указатель на чтение данных |
| Лен | Количество байтов в *данных |
| *Элемид | Номер элемента очереди |
Коды выхода
Необработанные данные считываются из Flash.
int sfcb_flash_read ( t_sfcb * self , uint32_t adr , void * data , uint16_t len );| Арг | Описание |
|---|---|
| себя | Элемент хранения SFCB |
| Адр | Адрес памяти SPI Flash |
| *данные | указатель на чтение данных |
| Лен | Количество байтов в *данных |
Коды выхода
Службы Запрос на круговой буферный слой, а также обработка пакетов SPI. Эта функция должна вызвать время на основе времени. Передача пакета данных SPI должна использовать DataFlow на основе ISR.
void sfcb_worker ( t_sfcb * self );| Арг | Описание |
|---|---|
| себя | Элемент хранения SFCB |
Никто.
By SFCB_WORKER создал размер пакета SPI в байтах.
uint16_t sfcb_spi_len ( t_sfcb * self );| Арг | Описание |
|---|---|
| себя | Элемент хранения SFCB |
Байтовое количество пакета SPI.
Получите SFCB скомпилированным типом флэш -типа общий размер.
uint32_t sfcb_flash_size ( void );Размер в байтах.
Получите наибольшее количество элементов круговой очереди буфера Cbid .
uint32_t sfcb_idmax ( t_sfcb * self , uint8_t cbID );| Арг | Описание |
|---|---|
| себя | Элемент хранения SFCB |
| CBID | Циркулярная очередь буфера для взаимодействия |
Высокий номер элемента.
| Ценить | Описание |
|---|---|
| SFCB_OK | Принял |
| SFCB_E_NO_FLASH | не выбрано тип вспышки, используйте -D |
| SFCB_E_MEM | Недостаточно памяти, назначенной в sfcb_init |
| Sfcb_e_flash_full | Пропускная способность превышает |
| SFCB_E_WKR_BSY | sfcb_worker занят, подождите |
| SFCB_E_NO_CB_Q | Круговая очередь буфера cbID не существует |
| SFCB_E_WKR_REQ | Данные управления циркулярным буфером не подготовлены для запроса, запустите sfcb_mkcb |
| SFCB_E_CB_Q_MTY | Нет действительных записей в очереди |
SFCB поддерживает произвольное количество круговых буферных очередей. Каждый круглый буфер начинается с самого низкого бесплатного адреса вспышки SPI. Флэш -архитектура требует выделенных данных, так называемых сектора . Благодаря этому ограничению должно быть как минимум два сектора. В противном случае перезапись перезапись первого письменного элемента к полному круговому буферному очереди, не соблюдая никаких предыдущих записей. Каждая новая запись отмечена увеличенным 32 -битным IDNUM и MagicNum . MagicNum гарантирует обнаружение занятого элемента очереди круглого буфера.
Примерная организация памяти для полезной нагрузки 240 байтов и 32 элемента (= два сектора) показывает рисунок ниже: