mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-10-29 17:54:14 +08:00
rtlplayground: do not sleep in idle() while a packet is waiting
idle() went to sleep before it looked at the receive buffer, so a packet that arrived just after the loop dozed off waited for the next tick before anything touched it. Every TCP round-trip paid that toll, which is why the web UI felt sluggish even though no phase of the loop was anywhere near busy. Check the receive buffer first and only sleep when it is empty. The read takes its result straight from SFR_DATA_U16 rather than going through reg_read_m() and the sfr_data[] copy, which is what the rest of the tree already does. Measured on SWTGW218AS with this change alone: web UI, median of 15 requests for the main page 88 ms -> 76 ms CPU port under a one-way UDP stream 159 -> 230 packets/s The loop still sleeps normally when there is nothing to do, so this does not turn the core into a busy-wait: loops/ticks stays at 0.99 on an idle switch, and rises above 1.0 only while packets are actually queued. Costs 12 bytes of code and no extra XDATA.
This commit is contained in:
1 parent
d556d634ca
commit
7b728cec6f
1 file changed
+2
@@ -1157,6 +1157,8 @@ void handle_button(void)
|
||||
//
|
||||
void idle(void)
|
||||
{
|
||||
reg_read(RTL837X_REG_NIC_RX_BUFF_DATA);
|
||||
if (!SFR_DATA_U16)
|
||||
PCON |= 1;
|
||||
if (sec_counter >= SYS_TICK_HZ) {
|
||||
sec_counter -= SYS_TICK_HZ;
|
||||
|
||||
Reference in new issue
Block a user