RingBuffer для embedded
Долго терпел но всё-таки порвало и решил набросать маленький template для кольцевого буфера чуток оптимизированный для экономии ОЗУ. Вот его сырая версия. Если будет настроение то доделаю.
Небольшое замечание по работе с ним, если в конструктор класса ring_buff переадать указатель на область памяти и число обектов которое хотим создать в ней, то конструктор создаст то кол-во обеектов которое может в этой области уместиться и не больше, при этом деструктор не будет освобождать эту область, и этот ритуал :) обязан выполнить программист во избежании утечки памяти.
А вот и долгожданный template в прикреплённом файле :)
- 11821 просмотр
Новые записи в блогах
- Устранение дребезга контактов на основе вертикальных счетчиков
- Диагностика Imprecise Bus Faults в микроконтроллерах Cortex-M3/M4/M4F
- Self-powered камера
- Фоновый модулятор: беспроводная связь из ничего (перевод)
- Texas Instruments Analog Applications Journal SLYT612 "Снижение искажений в аналоговых КМОП ключах" (перевод)
- USB MSD. Часть 6. Команды SCSI (перевод)
- USB MSD. Часть 3. USB класс накопителей данных (перевод)
- Texas Instruments Application Report SBAA042 "Кодовые схемы, используемые в аналогово-цифровых преобразователях" (перевод)
- 10 принципов правильного интерфейса
- Релиз SDK на русский микропроцессор КРОЛИК
Комментарии
говнокод!
До осваивания C++ стоило бы научиться отделять мух от котлет (регистры AT91SAM7xxx от шаблона).
А собственно никакой реализации fifo и не увидел, вчитавшись. Доставляет также блокирующий Write. Из неблокирующего сделать блокирующий простым применением while() всегда можно и это стоит оставить для самого верхнего уровня.
Собственно это был комментарий к тому, что внизу страницы. Если говорить и том, что выше -- без 0.5 не разобраться.
Имею аналогичный код, тоже в виде "шаблона" (что разменивает больший объём программной памяти на более высокую скорость, если уартов больше одного, а иначе просто быстрей и компактней) на голом C -- весь код рассован по-макросам. Прошло много времени, много разных MCU и проектов. И пришла в голову очевидная мысль, что вообще реализацию fifo следует отделить от "драйвера UART-модуля". Ибо последние очень уж разные. Что для 8-битников врукопашную, то для больших MCU очень сильно не так. А при наличии ОС и вовсе fifo не особо нужно (ибо своё наличествует, в драйвере).
Считаю, в проекте без ОС нужны 3 вещи: "драйвер" непосредстенно к модулю UART микроконтроллера, побайтовое быстрое fifo, и прослойка между этим всем и программой. Последние 2 вещи аппаратно-независимые вообще. Прослойка для программной реализации CTS/RTS (если в контроллере нет) и т.п. вещей, а также для приведения интерфейса близкого к виндовому/линуховому.
PS: да, блокировка по IP тоже доставляет.
[ZX]
>> До осваивания C++ стоило
>> До осваивания C++ стоило бы научиться отделять мух от котлет (регистры AT91SAM7xxx от шаблона).
Это шаблон драйвера UART SAM9XE это раз по этому мухи и котлеты на своих местах,
>> А собственно никакой реализации fifo и не увидел
Ее там и нету, это моя ошибка, хотел дать ответ на
>> C++ with templates иEmbedded?
>> Какое-то странное сочетание...
И код тупо демонстрирует что используются шаблоны и в эмбеддед.
>>И пришла в голову очевидная мысль, что вообще реализацию fifo следует отделить от "драйвера UART-модуля"
В моем модуле так и сделано только в качестве буфера выступает PDC вот реализация кто знаком с архитектурой AT91SAM9XE тот поймет, этот код можно прилепить к любой периферии проца которая имеет PDC. Что и сделано в моем коде:
typedef THwTXPDC<PORT,TX_BUFF_SIZE> TxFIFO; //FIFO передачи
typedef THwRXPDC<PORT,RX_BUFF_SIZE> RxFIFO; //FIFO приема
Если сильно интересно прилагаю шаблон класса реализующего обмен через PDC с периферией. В текущей версии реализация только для UART
//todo: дописать идентификаторы остальной периферии
P.S. Еще раз повторю это не демонстрация кода или приемов программирования, это демонстрация того что C++ и шаблоны используются еще как.
Очегнь даже ничего сочитается
Страннно...
C++ with templates и Embedded?
Какое-то странное сочетание...
Вполне нормально.
Вполне нормально. Вон, scmRTOS чуть менее чем полностью состоит из шаблонов :)
А что странного ?