NSH networking: There is now a configuration option that will bring up the network on an separate thread. Since the network bring-up is asynchronous, there are not serial console start-up delays due to the network negotiation time.
This commit is contained in:
parent
291697ba8d
commit
dc57af80fc
@ -777,6 +777,49 @@ config NSH_ARCHINIT
|
||||
menu "Networking Configuration"
|
||||
depends on NET
|
||||
|
||||
config NSH_NETINIT_THREAD
|
||||
bool "Network initialization thread"
|
||||
default n
|
||||
depends on !DISABLE_PTHREAD
|
||||
---help---
|
||||
NSH is brought up through a series of sequential initialization
|
||||
steps. This includes networking. If the network is available on
|
||||
reset, then there is really no issue. Negotiating the link will
|
||||
take only a second or so and the delay to the NSH prompt is
|
||||
normally acceptable.
|
||||
|
||||
But if there is no network connected, then the start-up delay can
|
||||
be very long depending upon things like the particular PHY, driver
|
||||
timeout delay times, and numbers of retries. A failed negotiation
|
||||
can potentially take a very long time, perhaps as much as a
|
||||
minute... Long enough that you might think that the board would
|
||||
never come up!
|
||||
|
||||
One solution is to enabled by this option. If NSH_NETINIT_THREAD
|
||||
is selected, the network bring-up will all occur in parallel with
|
||||
NSH on a separate thread. In this case, the NSH prompt will occur
|
||||
immediately with the network becoming available some time layer (if
|
||||
if all). This thread will terminate once it successfully initializes
|
||||
the network
|
||||
|
||||
NOTES: If no network is connected, the network bring-up will fail
|
||||
and the network initialization thread will simply exit. There are
|
||||
no retries and no mechanism to know if the network initialization
|
||||
was successful. Furthermore, there is currently no support for
|
||||
detecting loss of network connection. Lots of things to do!
|
||||
|
||||
if NSH_NETINIT_THREAD
|
||||
|
||||
config NSH_NETINIT_THREAD_STACKSIZE
|
||||
int "Network initialization thread stack size"
|
||||
default 1568
|
||||
|
||||
config NSH_NETINIT_THREAD_PRIORITY
|
||||
int "Network initialization thread priority"
|
||||
default 100
|
||||
|
||||
endif # NSH_NETINIT_THREAD
|
||||
|
||||
config NSH_DHCPC
|
||||
bool "Use DHCP to get IP address"
|
||||
default n
|
||||
|
12
nshlib/nsh.h
12
nshlib/nsh.h
@ -104,7 +104,9 @@
|
||||
# define CONFIG_NSH_TMPDIR "/tmp"
|
||||
#endif
|
||||
|
||||
/* Networking support */
|
||||
/* Networking support. Make sure that all non-boolean configuration
|
||||
* settings have some value.
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_NSH_IPADDR
|
||||
# define CONFIG_NSH_IPADDR 0x0a000002
|
||||
@ -126,6 +128,14 @@
|
||||
# define CONFIG_NSH_MACADDR 0x00e0deadbeef
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_NSH_NETINIT_THREAD_STACKSIZE
|
||||
# define CONFIG_NSH_NETINIT_THREAD_STACKSIZE 1568
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_NSH_NETINIT_THREAD_PRIORITY
|
||||
# define CONFIG_NSH_NETINIT_THREAD_PRIORITY 100
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_NET
|
||||
# undef CONFIG_NSH_ARCHMAC
|
||||
#endif
|
||||
|
@ -101,4 +101,3 @@ void nsh_initialize(void)
|
||||
|
||||
(void)nsh_netinit();
|
||||
}
|
||||
|
||||
|
@ -42,6 +42,7 @@
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <pthread.h>
|
||||
#include <debug.h>
|
||||
|
||||
#include <net/if.h>
|
||||
@ -95,18 +96,14 @@
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_netinit
|
||||
* Name: nsh_netinit_thread
|
||||
*
|
||||
* Description:
|
||||
* Initialize the network per the selected NuttX configuration
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int nsh_netinit(void)
|
||||
pthread_addr_t nsh_netinit_thread(pthread_addr_t arg)
|
||||
{
|
||||
struct in_addr addr;
|
||||
#if defined(CONFIG_NSH_DHCPC)
|
||||
@ -116,6 +113,8 @@ int nsh_netinit(void)
|
||||
uint8_t mac[IFHWADDRLEN];
|
||||
#endif
|
||||
|
||||
nvdbg("Entry\n");
|
||||
|
||||
/* Many embedded network interfaces must have a software assigned MAC */
|
||||
|
||||
#if defined(CONFIG_NSH_NOMAC) && !defined(CONFIG_NET_SLIP)
|
||||
@ -207,7 +206,65 @@ int nsh_netinit(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
nvdbg("Exit\n");
|
||||
return OK;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nsh_netinit
|
||||
*
|
||||
* Description:
|
||||
* Initialize the network per the selected NuttX configuration
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int nsh_netinit(void)
|
||||
{
|
||||
#ifdef CONFIG_NSH_NETINIT_THREAD
|
||||
struct sched_param sparam;
|
||||
pthread_attr_t attr;
|
||||
pthread_t tid;
|
||||
void *value;
|
||||
int ret;
|
||||
|
||||
/* Start the network initialization thread to perform the network bring-up
|
||||
* asynchronously.
|
||||
*/
|
||||
|
||||
pthread_attr_init(&attr);
|
||||
sparam.sched_priority = CONFIG_NSH_NETINIT_THREAD_PRIORITY;
|
||||
(void)pthread_attr_setschedparam(&attr, &sparam);
|
||||
(void)pthread_attr_setstacksize(&attr, CONFIG_NSH_NETINIT_THREAD_STACKSIZE);
|
||||
|
||||
nvdbg("Starting netinit thread\n");
|
||||
ret = pthread_create(&tid, &attr, nsh_netinit_thread, NULL);
|
||||
if (ret != OK)
|
||||
{
|
||||
ndbg("ERROR: Failed to create netinit thread: %d\n", ret);
|
||||
(void)nsh_netinit_thread(NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Detach the thread because we will not be joining to it */
|
||||
|
||||
(void)pthread_detach(tid);
|
||||
|
||||
/* Name the thread */
|
||||
|
||||
pthread_setname_np(tid, "netinit");
|
||||
}
|
||||
|
||||
return OK;
|
||||
|
||||
#else
|
||||
/* Perform network initialization sequentially */
|
||||
|
||||
(void)nsh_netinit_thread(NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NET */
|
||||
|
Loading…
Reference in New Issue
Block a user