stm32/modnetwork: Change lwIP polling to be based on background systick.
This commit is contained in:
parent
4d214edae8
commit
800871c0cb
@ -547,6 +547,7 @@ void stm32_main(uint32_t reset_mode) {
|
||||
// because the system timeout list (next_timeout) is only ever reset by BSS clearing.
|
||||
// So for now we only init the lwIP stack once on power-up.
|
||||
lwip_init();
|
||||
systick_enable_dispatch(SYSTICK_DISPATCH_LWIP, mod_network_lwip_poll_wrapper);
|
||||
#endif
|
||||
|
||||
#if defined(MICROPY_HW_UART_REPL)
|
||||
|
@ -32,6 +32,8 @@
|
||||
#include "py/runtime.h"
|
||||
#include "py/mphal.h"
|
||||
#include "lib/netutils/netutils.h"
|
||||
#include "systick.h"
|
||||
#include "pendsv.h"
|
||||
#include "modnetwork.h"
|
||||
|
||||
#if MICROPY_PY_NETWORK
|
||||
@ -43,11 +45,14 @@
|
||||
#include "lwip/dns.h"
|
||||
#include "lwip/dhcp.h"
|
||||
|
||||
// Poll lwIP every 128ms
|
||||
#define LWIP_TICK(tick) (((tick) & ~(SYSTICK_DISPATCH_NUM_SLOTS - 1) & 0x7f) == 0)
|
||||
|
||||
u32_t sys_now(void) {
|
||||
return mp_hal_ticks_ms();
|
||||
}
|
||||
|
||||
void pyb_lwip_poll(void) {
|
||||
STATIC void pyb_lwip_poll(void) {
|
||||
// Poll all the NICs for incoming data
|
||||
for (struct netif *netif = netif_list; netif != NULL; netif = netif->next) {
|
||||
if (netif->flags & NETIF_FLAG_LINK_UP) {
|
||||
@ -59,6 +64,12 @@ void pyb_lwip_poll(void) {
|
||||
sys_check_timeouts();
|
||||
}
|
||||
|
||||
void mod_network_lwip_poll_wrapper(uint32_t ticks_ms) {
|
||||
if (LWIP_TICK(ticks_ms)) {
|
||||
pendsv_schedule_dispatch(PENDSV_DISPATCH_LWIP, pyb_lwip_poll);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/// \module network - network configuration
|
||||
|
@ -46,6 +46,7 @@ typedef struct _mod_network_nic_type_t {
|
||||
|
||||
extern const mp_obj_type_t mod_network_nic_type_wiznet5k;
|
||||
|
||||
void mod_network_lwip_poll_wrapper(uint32_t ticks_ms);
|
||||
mp_obj_t mod_network_nic_ifconfig(struct netif *netif, size_t n_args, const mp_obj_t *args);
|
||||
|
||||
#else
|
||||
|
@ -213,17 +213,14 @@ extern const struct _mp_obj_module_t mp_module_onewire;
|
||||
// usocket implementation provided by lwIP
|
||||
#define SOCKET_BUILTIN_MODULE { MP_ROM_QSTR(MP_QSTR_usocket), MP_ROM_PTR(&mp_module_lwip) },
|
||||
#define SOCKET_BUILTIN_MODULE_WEAK_LINKS { MP_ROM_QSTR(MP_QSTR_socket), MP_ROM_PTR(&mp_module_lwip) },
|
||||
#define SOCKET_POLL extern void pyb_lwip_poll(void); pyb_lwip_poll();
|
||||
#elif MICROPY_PY_USOCKET
|
||||
// usocket implementation provided by skeleton wrapper
|
||||
#define SOCKET_BUILTIN_MODULE { MP_ROM_QSTR(MP_QSTR_usocket), MP_ROM_PTR(&mp_module_usocket) },
|
||||
#define SOCKET_BUILTIN_MODULE_WEAK_LINKS { MP_ROM_QSTR(MP_QSTR_socket), MP_ROM_PTR(&mp_module_usocket) },
|
||||
#define SOCKET_POLL
|
||||
#else
|
||||
// no usocket module
|
||||
#define SOCKET_BUILTIN_MODULE
|
||||
#define SOCKET_BUILTIN_MODULE_WEAK_LINKS
|
||||
#define SOCKET_POLL
|
||||
#endif
|
||||
|
||||
#if MICROPY_PY_NETWORK
|
||||
@ -339,7 +336,6 @@ static inline mp_uint_t disable_irq(void) {
|
||||
do { \
|
||||
extern void mp_handle_pending(void); \
|
||||
mp_handle_pending(); \
|
||||
SOCKET_POLL \
|
||||
if (pyb_thread_enabled) { \
|
||||
MP_THREAD_GIL_EXIT(); \
|
||||
pyb_thread_yield(); \
|
||||
@ -355,7 +351,6 @@ static inline mp_uint_t disable_irq(void) {
|
||||
do { \
|
||||
extern void mp_handle_pending(void); \
|
||||
mp_handle_pending(); \
|
||||
SOCKET_POLL \
|
||||
__WFI(); \
|
||||
} while (0);
|
||||
|
||||
|
@ -38,13 +38,13 @@
|
||||
// mp_kbd_exception which is in the root-pointer set.
|
||||
void *pendsv_object;
|
||||
|
||||
#if PENDSV_DISPATCH_NUM_SLOTS > 0
|
||||
#if defined(PENDSV_DISPATCH_NUM_SLOTS)
|
||||
uint32_t pendsv_dispatch_active;
|
||||
pendsv_dispatch_t pendsv_dispatch_table[PENDSV_DISPATCH_NUM_SLOTS];
|
||||
#endif
|
||||
|
||||
void pendsv_init(void) {
|
||||
#if PENDSV_DISPATCH_NUM_SLOTS > 0
|
||||
#if defined(PENDSV_DISPATCH_NUM_SLOTS)
|
||||
pendsv_dispatch_active = false;
|
||||
#endif
|
||||
// set PendSV interrupt at lowest priority
|
||||
@ -69,7 +69,7 @@ void pendsv_kbd_intr(void) {
|
||||
}
|
||||
}
|
||||
|
||||
#if PENDSV_DISPATCH_NUM_SLOTS > 0
|
||||
#if defined(PENDSV_DISPATCH_NUM_SLOTS)
|
||||
void pendsv_schedule_dispatch(size_t slot, pendsv_dispatch_t f) {
|
||||
pendsv_dispatch_table[slot] = f;
|
||||
pendsv_dispatch_active = true;
|
||||
@ -119,7 +119,7 @@ __attribute__((naked)) void PendSV_Handler(void) {
|
||||
// sp[0]: ?
|
||||
|
||||
__asm volatile (
|
||||
#if PENDSV_DISPATCH_NUM_SLOTS > 0
|
||||
#if defined(PENDSV_DISPATCH_NUM_SLOTS)
|
||||
// Check if there are any pending calls to dispatch to
|
||||
"ldr r1, pendsv_dispatch_active_ptr\n"
|
||||
"ldr r0, [r1]\n"
|
||||
@ -174,7 +174,7 @@ __attribute__((naked)) void PendSV_Handler(void) {
|
||||
|
||||
// Data
|
||||
".align 2\n"
|
||||
#if PENDSV_DISPATCH_NUM_SLOTS > 0
|
||||
#if defined(PENDSV_DISPATCH_NUM_SLOTS)
|
||||
"pendsv_dispatch_active_ptr: .word pendsv_dispatch_active\n"
|
||||
#endif
|
||||
"pendsv_object_ptr: .word pendsv_object\n"
|
||||
|
@ -26,7 +26,16 @@
|
||||
#ifndef MICROPY_INCLUDED_STM32_PENDSV_H
|
||||
#define MICROPY_INCLUDED_STM32_PENDSV_H
|
||||
|
||||
#define PENDSV_DISPATCH_NUM_SLOTS (0)
|
||||
enum {
|
||||
#if MICROPY_PY_NETWORK && MICROPY_PY_LWIP
|
||||
PENDSV_DISPATCH_LWIP,
|
||||
#endif
|
||||
PENDSV_DISPATCH_MAX
|
||||
};
|
||||
|
||||
#if MICROPY_PY_NETWORK && MICROPY_PY_LWIP
|
||||
#define PENDSV_DISPATCH_NUM_SLOTS PENDSV_DISPATCH_MAX
|
||||
#endif
|
||||
|
||||
typedef void (*pendsv_dispatch_t)(void);
|
||||
|
||||
|
@ -34,6 +34,9 @@ enum {
|
||||
#if MICROPY_HW_ENABLE_STORAGE
|
||||
SYSTICK_DISPATCH_STORAGE,
|
||||
#endif
|
||||
#if MICROPY_PY_NETWORK && MICROPY_PY_LWIP
|
||||
SYSTICK_DISPATCH_LWIP,
|
||||
#endif
|
||||
SYSTICK_DISPATCH_MAX
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user