Browse Source

stm32/modnetwork: Change lwIP polling to be based on background systick.

pull/4492/head
Damien George 6 years ago
parent
commit
800871c0cb
  1. 1
      ports/stm32/main.c
  2. 13
      ports/stm32/modnetwork.c
  3. 1
      ports/stm32/modnetwork.h
  4. 5
      ports/stm32/mpconfigport.h
  5. 10
      ports/stm32/pendsv.c
  6. 11
      ports/stm32/pendsv.h
  7. 3
      ports/stm32/systick.h

1
ports/stm32/main.c

@ -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)

13
ports/stm32/modnetwork.c

@ -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

1
ports/stm32/modnetwork.h

@ -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

5
ports/stm32/mpconfigport.h

@ -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);

10
ports/stm32/pendsv.c

@ -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"

11
ports/stm32/pendsv.h

@ -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);

3
ports/stm32/systick.h

@ -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…
Cancel
Save