У меня есть микроконтроллер, который должен загрузить большой файл с последовательного порта ПК (115200 бод) и записать его в последовательную флеш-память через SPI (~ 2 МГц). Запись флэш-памяти должна быть в 256-байтовых блоках, которым предшествует команда записи и адрес страницы. Общая оперативная память, доступная в системе, составляет 1 кБ с размером в 80 байт.Как вы обрабатываете большие передачи данных по очень ограниченным объемам памяти, встроенным системам?
В настоящее время он работает, заполняя буфер с 256 байтами из UART, а затем пинг-понг в другой буфер с 256 байтами, заполняемый прерыванием по сигналу готовности буфера RX, в то время как флэш-запись записывается с записью с занятой записью. Перестановка буфера повторяется до завершения операции.
Я бы предпочел настроить обработчики прерываний TX/RX для портов SPI и UART, работающих на отдельных круговых буферах. Таким образом, вместо опроса для новых байтов и ожидания завершения операций я могу просто заполнить буферы TX и включить прерывание или проверить буферы для входящих данных. Это дало бы намного больше тактовых циклов для реальной работы, а не для ожидания на периферии.
После внедрения IRQ с 128-байтовыми круговыми буферами я опросу буфера UART RX для данных и немедленно поместил его в буфер SPI TX для передачи файла. Проблема, с которой я сталкиваюсь в этом подходе, заключается в том, что у меня недостаточно памяти для буферов, и буфер приема ПК заполняется быстрее, чем я получаю данные в буфере передачи Flash. Очевидно, что скорость передачи данных не является проблемой (115,2 кГц и 2 МГц), но после каждой 256-байтной страницы есть ожидание цикла записи.
Оказывается, частые прерывания SPI блокируют некоторые UART прерываний и вызывая байт будет хватать. Решение, которое я выбрал, состояло в том, чтобы использовать кольцевой буфер для прерывания приема UART и подавать данные в буфер с 256-байтовым страницей, который отправляется на последовательную вспышку путем опроса для передачи байтов и завершения записи. Буфер 128-буфера достаточно велик, чтобы предотвратить переполнение во время записи SPI.
Это фактически происходит через интерфейс USB, и эти сигналы недоступны. Это хороший совет. – 2008-12-11 15:57:36