diff --git a/V203/usb/usart/main.cpp b/V203/usb/usart/main.cpp index f940f1d..4382275 100644 --- a/V203/usb/usart/main.cpp +++ b/V203/usb/usart/main.cpp @@ -19,18 +19,24 @@ static constexpr unsigned Timeout = 5000; // us * */ class Middle : public BaseLayer { static constexpr unsigned max = 128; + FIFO rx_ring; volatile unsigned index; char buffer [max]; public: - explicit Middle () noexcept : BaseLayer(), index(0u) {} + explicit Middle () noexcept : BaseLayer(), rx_ring(), index(0u) {} /* Up() v původním řetězci volalo fakticky Down() v cdc_class. * Vzhledem k tomu, že len je zde 1 a USB musí vyvolat odeslání * paketu, zdržuje to a přerušení zde může být ignorováno. * Tohle ho významně zkrátí, ale zase musí být v hlavní smyčce - * odeslání dat pomocí metody pass(). + * odeslání dat pomocí metody pass(). Ukázalo se, že je nutné + * předávat data přes další frontu. Pak to funguje full duplex + * na rychlosti 4 MBd bez ztráty znaků. * */ uint32_t Up(const char * data, const uint32_t len) override { - for (unsigned n=0; n= 64)) { - block(buffer, index); + unsigned n; + for (n=0u; n #include +#include #include +#include +#include +using namespace std::chrono; class Top : public BaseLayer { static constexpr int max = 1024; + unsigned tx_cnt, rx_cnt; volatile unsigned index; int passcnt; char buffer [max]; public: - explicit Top () : BaseLayer(), index(0u), passcnt(0) {} + explicit Top () : BaseLayer(), tx_cnt(0u), rx_cnt(0u), index(0u), passcnt(0) {} void puts (const char * str) { const unsigned l = strlen(str); - Down(str, l); + tx_cnt += Down(str, l); } uint32_t Up(const char * data, const uint32_t len) override { + rx_cnt += len; for (unsigned n=0; n 1) { + baud = atoi (argv[1]); + } loop = true; signal (SIGINT, Handler); - UsartClass usart ("/dev/serial/by-id/usb-Kizarm_Labs._USB__=__USART_0002-if00", 1'000'000); + //UsartClass usart ("/dev/ttyACM0", baud); // obecně + UsartClass usart ("/dev/serial/by-id/usb-Kizarm_Labs._USB__=__USART_0002-if00", baud); Top top; top += usart; + auto start = high_resolution_clock::now(); while (loop) { top.puts(TestString); } + auto stop = high_resolution_clock::now(); + usleep(100'000); + int duration = duration_cast(stop - start).count(); + top.result(duration); return 0; }