From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gary Thomas To: Grant Edwards Cc: ecos-discuss@sources.redhat.com Subject: Re: [ECOS] RedBoot gets() implimentation question Date: Fri, 19 Jan 2001 07:43:00 -0000 Message-id: References: <20010119093601.A10765@visi.com> X-SW-Source: 2001-01/msg00341.html On 19-Jan-2001 Grant Edwards wrote: > On Thu, Jan 18, 2001 at 04:08:52PM -0700, Gary Thomas wrote: > >> > That means that network polling stops and TCP sockets (and >> > associated timers) go dead between between the time the first >> > character is received and the newline is received? [I don't >> > think that's a problem, but it's something to keep in mind.] >> >> Correct. This was a design choice - avoid the overhead of polling >> for potential new TCP connections (all that's really going on here) >> once data starts coming in. > > You must be able to type a lot faster than me. ;) > >> > I'm also curious about the inner loop: >> > >> > mon_set_read_char_timeout(50); >> > while (timeout > 0) { >> > res = mon_read_char_with_timeout(&c); >> > if (res) { >> > // Got a character >> > break; >> > } >> > timeout -= 50; >> > } >> > >> > Would the following be equivalent? >> > >> > mon_set_read_char_timeout(timeout); >> > res = mon_read_char_with_timeout(&c); >> >> Yes and no. Yes - the overall timeout would be the same. No since >> we want to go back and check for new TCP connections as often as is >> reasonable. > > I can't figure out where the check for TCP connections is done. > Is mon_read_char_with_timeout() supposed to call __tcp_poll() > in some way that I've broken? My tests with ping seem to > verify that on my board TCP polling is done once every 250ms > (the value of timeout) while waiting for the first character of > a command line. No, it actually only happens in "main.c" while RedBoot is waiting for the command line itself. while (true) { if (prompt) { printf("RedBoot> "); prompt = false; } res = gets(line, sizeof(line), 250); if (res == _GETS_TIMEOUT) { // No input arrived #ifdef CYGPKG_REDBOOT_NETWORKING if (have_net) { // Check for incoming TCP debug connection net_io_test(); } #endif } else { if (res == _GETS_GDB) { // Special case of '$' - need to start GDB protocol CYGACC_CALL_IF_SET_CONSOLE_COMM(cur); #ifdef HAL_ARCH_PROGRAM_NEW_STACK HAL_ARCH_PROGRAM_NEW_STACK(breakpoint); #else breakpoint(); // Get GDB stubs started, with a proper environment, etc. #endif } else { if (strlen(line) > 0) { if ((cmd = parse(line, &argc, &argv[0])) != (struct cmd *)0) { (cmd->fun)(argc, argv); } else { printf("** Error: Illegal command: \"%s\"\n", argv[0]); } } prompt = true; } } }