From e743d03a78609745794762004d12c7379a5ad2ab Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Sat, 30 May 2015 19:11:04 +1000 Subject: [PATCH] Preprocess all binary SDK symbols to add an sdk_ prefix * This fixes the problem of axTLS symbols hmac_md5/hmac_sha1 having same name as symbols in libwpa (which have incompatible signatures) * Also allows for easier identification and piece-by-piece removal of binary functions. * Some libc symbols are not renamed, list is in lib/symbols_norename.txt --- FreeRTOS/Source/portable/esp8266/port.c | 16 +++--- FreeRTOS/Source/portable/esp8266/portmacro.h | 21 ++++--- common.mk | 57 ++++++++++++++++--- examples/http_get/main.c | 10 ++-- include/esp8266.h | 33 +++++++++++ include/espressif/esp_misc.h | 6 +- include/espressif/esp_softap.h | 6 +- include/espressif/esp_sta.h | 28 ++++----- include/espressif/esp_system.h | 32 +++++------ include/espressif/esp_timer.h | 6 +- include/espressif/esp_wifi.h | 33 ++++++----- include/espressif/sdk_prototypes.h | 23 ++++++-- include/espressif/spi_flash.h | 14 ++--- ld/eagle.app.v6.ld | 18 +++--- lib/libhal.a | Bin 162888 -> 0 bytes lib/symbols_norename.txt | 6 ++ lwip/esp_interface.c | 4 +- lwip/include/arch/cc.h | 8 +++ lwip/include/arch/sys_arch.h | 2 + 19 files changed, 220 insertions(+), 103 deletions(-) create mode 100644 include/esp8266.h delete mode 100644 lib/libhal.a create mode 100644 lib/symbols_norename.txt diff --git a/FreeRTOS/Source/portable/esp8266/port.c b/FreeRTOS/Source/portable/esp8266/port.c index 0aaed7b..42cb36a 100644 --- a/FreeRTOS/Source/portable/esp8266/port.c +++ b/FreeRTOS/Source/portable/esp8266/port.c @@ -99,7 +99,7 @@ portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE SET_STKREG( XT_STK_A0, 0 ); /* to terminate GDB backtrace */ SET_STKREG( XT_STK_A1, (uint32_t)sp + XT_STK_FRMSZ ); /* physical top of stack frame */ SET_STKREG( XT_STK_A2, pvParameters ); /* parameters */ - SET_STKREG( XT_STK_EXIT, _xt_user_exit ); /* user exception exit dispatcher */ + SET_STKREG( XT_STK_EXIT, sdk__xt_user_exit ); /* user exception exit dispatcher */ /* Set initial PS to int level 0, EXCM disabled ('rfe' will enable), user mode. */ SET_STKREG( XT_STK_PS, PS_UM | PS_EXCM ); @@ -139,19 +139,19 @@ void PendSV(enum SVC_ReqType req) * after a Blob SV requests a soft interrupt by calling * PendSV(SVC_MACLayer). */ -extern portBASE_TYPE MacIsrSigPostDefHdl(void); +extern portBASE_TYPE sdk_MacIsrSigPostDefHdl(void); void SV_ISR(void) { portBASE_TYPE xHigherPriorityTaskWoken=pdFALSE ; if(pending_maclayer_sv) { - xHigherPriorityTaskWoken = MacIsrSigPostDefHdl(); + xHigherPriorityTaskWoken = sdk_MacIsrSigPostDefHdl(); pending_maclayer_sv = 0; } if( xHigherPriorityTaskWoken || pending_soft_sv) { - _xt_timer_int1(); + sdk__xt_timer_int1(); pending_soft_sv = 0; } } @@ -175,14 +175,14 @@ void xPortSysTickHandle (void) portBASE_TYPE xPortStartScheduler( void ) { _xt_isr_attach(ETS_SOFT_INUM, SV_ISR); - _xt_isr_unmask(1< $@" + $(Q) $(OBJCOPY) --redefine-syms $(word 2,$^) --weaken $< $@ + + +# Generate a regex to match symbols we don't want to rename, by parsing +# a list of symbol names +$(BUILD_DIR)sdklib/norename.match: $(ROOT)lib/symbols_norename.txt | $(BUILD_DIR)sdklib + grep -v "^#" $< | sed ':begin;$!N;s/\n/\\|/;tbegin' > $@ + +# Generate list of symbols to rename from a single library. Uses grep & sed. +$(BUILD_DIR)sdklib/%.rename: $(ROOT)lib/%.a $(BUILD_DIR)sdklib/norename.match + $(vecho) "Building symbol list for $< -> $@" + $(Q) $(NM) --defined $< | grep ' T ' | sed -r 's/(.+) T (.+)/\2 sdk_\2/' | grep -v `cat $(BUILD_DIR)sdklib/norename.match` > $@ + +# Build master list of all SDK-defined symbols to rename +$(BUILD_DIR)sdklib/allsymbols.rename: $(patsubst %.a,%.rename,$(SDK_PROCESSED_LIBS)) + cat $^ > $@ + + ## Include components (this is where the actual compiler sections are generated) $(foreach component,$(COMPONENTS), $(eval include $(ROOT)/$(component)/component.mk)) @@ -167,16 +204,16 @@ target_ROOT=$(TARGET_DIR) $(eval $(call component_compile_rules,target)) # final linking step to produce .elf -$(TARGET_OUT): $(COMPONENT_ARS) +$(TARGET_OUT): $(COMPONENT_ARS) $(SDK_PROCESSED_LIBS) $(vecho) "LD $@" - $(Q) $(LD) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group $(LIB_ARGS) $(COMPONENT_ARS) -Wl,--end-group -o $@ + $(Q) $(LD) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group $(SDK_LIB_ARGS) $(LIB_ARGS) $(COMPONENT_ARS) -Wl,--end-group -o $@ -$(BUILD_DIR) $(FW_BASE): +$(BUILD_DIR) $(FW_BASE) $(BUILD_DIR)sdklib: $(Q) mkdir -p $@ $(FW_FILE_1) $(FW_FILE_2): $(TARGET_OUT) $(FW_BASE) $(vecho) "FW $@" - $(ESPTOOL) elf2image $< -o $(FW_BASE) + $(ESPTOOL) elf2image --entry-symbol $(ENTRY_SYMBOL) $< -o $(FW_BASE) flash: $(FW_FILE_1) $(FW_FILE_2) $(ESPTOOL) -p $(ESPPORT) --baud $(ESPBAUD) write_flash $(FW_1) $(FW_FILE_1) $(FW_2) $(FW_FILE_2) @@ -196,3 +233,7 @@ rebuild: clean: $(Q) rm -rf $(BUILD_DIR) $(Q) rm -rf $(FW_BASE) + +# prevent "intermediate" files from being deleted +.SECONDARY: + diff --git a/examples/http_get/main.c b/examples/http_get/main.c index fc12910..6af7e34 100644 --- a/examples/http_get/main.c +++ b/examples/http_get/main.c @@ -109,17 +109,17 @@ void http_get_task(void *pvParameters) void user_init(void) { - uart_div_modify(0, UART_CLK_FREQ / 115200); - printf("SDK version:%s\n", system_get_sdk_version()); + sdk_uart_div_modify(0, UART_CLK_FREQ / 115200); + printf("SDK version:%s\n", sdk_system_get_sdk_version()); - struct station_config config = { + struct sdk_station_config config = { .ssid = WIFI_SSID, .password = WIFI_PASS, }; /* required to call wifi_set_opmode before station_set_config */ - wifi_set_opmode(STATION_MODE); - wifi_station_set_config(&config); + sdk_wifi_set_opmode(STATION_MODE); + sdk_wifi_station_set_config(&config); xTaskCreate(&http_get_task, (signed char *)"get_task", 256, NULL, 2, NULL); } diff --git a/include/esp8266.h b/include/esp8266.h new file mode 100644 index 0000000..a58a9be --- /dev/null +++ b/include/esp8266.h @@ -0,0 +1,33 @@ +/* esp8266.h + * + * ESP-specific SoC-level addresses, macros, etc. + * Part of esp-open-rtos + * + * Copyright (C) 2105 Superhouse Automation Pty Ltd + * BSD Licensed as described in the file LICENSE + */ +#include + +#ifndef _ESP8266_H +#define _ESP8266_H + +/* Use this macro to store constant values in IROM flash instead + of having them loaded into rodata (which resides in DRAM) + + Unlike the ESP8266 SDK you don't need an attribute like this for + standard functions. They're stored in flash by default. But + variables need them. + + Important to note: IROM flash can only be accessed via 32-bit word + aligned reads. It's up to the user of this attribute to ensure this. +*/ +#define IROM __attribute__((section(".irom0"))) const + + +/* Register addresses + + ESPTODO: break this out to its own header file and clean it up, add other regs, etc. +*/ +static volatile __attribute__((unused)) uint32_t *ESP_REG_WDT = (uint32_t *)0x60000900; + +#endif diff --git a/include/espressif/esp_misc.h b/include/espressif/esp_misc.h index 68d9724..d8ce65e 100644 --- a/include/espressif/esp_misc.h +++ b/include/espressif/esp_misc.h @@ -18,9 +18,9 @@ #define IPSTR "%d.%d.%d.%d" -void os_delay_us(uint16_t us); +void sdk_os_delay_us(uint16_t us); -void os_install_putc1(void (*p)(char c)); -void os_putc(char c); +void sdk_os_install_putc1(void (*p)(char c)); +void sdk_os_putc(char c); #endif diff --git a/include/espressif/esp_softap.h b/include/espressif/esp_softap.h index c2bbe42..44f06cc 100644 --- a/include/espressif/esp_softap.h +++ b/include/espressif/esp_softap.h @@ -6,7 +6,7 @@ #ifndef __ESP_SOFTAP_H__ #define __ESP_SOFTAP_H__ -struct softap_config { +struct sdk_softap_config { uint8_t ssid[32]; uint8_t password[64]; uint8_t ssid_len; @@ -17,7 +17,7 @@ struct softap_config { uint16_t beacon_interval; }; -bool wifi_softap_get_config(struct softap_config *config); -bool wifi_softap_set_config(struct softap_config *config); +bool sdk_wifi_softap_get_config(struct sdk_softap_config *config); +bool sdk_wifi_softap_set_config(struct sdk_softap_config *config); #endif diff --git a/include/espressif/esp_sta.h b/include/espressif/esp_sta.h index 779242f..8b9059a 100644 --- a/include/espressif/esp_sta.h +++ b/include/espressif/esp_sta.h @@ -1,6 +1,8 @@ /* * Copyright (C) 2013 -2014 Espressif System * + * + * Adapted from BSD licensed esp_iot_rtos_sdk v0.9.9 */ #ifndef __ESP_STA_H__ @@ -8,27 +10,27 @@ #include "queue.h" -struct station_config { +struct sdk_station_config { uint8_t ssid[32]; uint8_t password[64]; uint8_t bssid_set; uint8_t bssid[6]; }; -bool wifi_station_get_config(struct station_config *config); -bool wifi_station_set_config(struct station_config *config); +bool sdk_wifi_station_get_config(struct sdk_station_config *config); +bool sdk_wifi_station_set_config(struct sdk_station_config *config); -bool wifi_station_connect(void); -bool wifi_station_disconnect(void); +bool sdk_wifi_station_connect(void); +bool sdk_wifi_station_disconnect(void); -struct scan_config { +struct sdk_scan_config { uint8_t *ssid; uint8_t *bssid; uint8_t channel; uint8_t show_hidden; }; -struct bss_info { +struct sdk_bss_info { STAILQ_ENTRY(bss_info) next; uint8_t bssid[6]; @@ -46,14 +48,14 @@ typedef enum { SCAN_PENDING, SCAN_BUSY, SCAN_CANCEL, -} scan_status_t; +} sdk_scan_status_t; -typedef void (* scan_done_cb_t)(void *arg, scan_status_t status); +typedef void (* sdk_scan_done_cb_t)(void *arg, sdk_scan_status_t status); -bool wifi_station_scan(struct scan_config *config, scan_done_cb_t cb); +bool sdk_wifi_station_scan(struct sdk_scan_config *config, sdk_scan_done_cb_t cb); -uint8_t wifi_station_get_auto_connect(void); -bool wifi_station_set_auto_connect(uint8_t set); +uint8_t sdk_wifi_station_get_auto_connect(void); +bool sdk_wifi_station_set_auto_connect(uint8_t set); enum { STATION_IDLE = 0, @@ -64,6 +66,6 @@ enum { STATION_GOT_IP }; -uint8_t wifi_station_get_connect_status(void); +uint8_t sdk_wifi_station_get_connect_status(void); #endif diff --git a/include/espressif/esp_system.h b/include/espressif/esp_system.h index be3e6a0..265bc8c 100644 --- a/include/espressif/esp_system.h +++ b/include/espressif/esp_system.h @@ -6,14 +6,14 @@ #ifndef __ESP_SYSTEM_H__ #define __ESP_SYSTEM_H__ -enum rst_reason { +enum sdk_rst_reason { DEFAULT_RST = 0, WDT_RST = 1, EXCEPTION_RST = 2, SOFT_RST = 3 }; -struct rst_info{ +struct sdk_rst_info{ uint32_t reason; uint32_t exccause; uint32_t epc1; @@ -24,26 +24,26 @@ struct rst_info{ uint32_t rtn_addr; }; -struct rst_info* system_get_rst_info(void); +struct rst_info* sdk_system_get_rst_info(void); -const char* system_get_sdk_version(void); +const char* sdk_system_get_sdk_version(void); -void system_restore(void); -void system_restart(void); -void system_deep_sleep(uint32_t time_in_us); +void sdk_system_restore(void); +void sdk_system_restart(void); +void sdk_system_deep_sleep(uint32_t time_in_us); -uint32_t system_get_time(void); +uint32_t sdk_system_get_time(void); -void system_print_meminfo(void); -uint32_t system_get_free_heap_size(void); -uint32_t system_get_chip_id(void); +void sdk_system_print_meminfo(void); +uint32_t sdk_system_get_free_heap_size(void); +uint32_t sdk_system_get_chip_id(void); -uint32_t system_rtc_clock_cali_proc(void); -uint32_t system_get_rtc_time(void); +uint32_t sdk_system_rtc_clock_cali_proc(void); +uint32_t sdk_system_get_rtc_time(void); -bool system_rtc_mem_read(uint8_t src, void *dst, uint16_t n); -bool system_rtc_mem_write(uint8_t dst, const void *src, uint16_t n); +bool sdk_system_rtc_mem_read(uint8_t src, void *dst, uint16_t n); +bool sdk_system_rtc_mem_write(uint8_t dst, const void *src, uint16_t n); -void system_uart_swap(void); +void sdk_system_uart_swap(void); #endif diff --git a/include/espressif/esp_timer.h b/include/espressif/esp_timer.h index 8ba6295..6f05547 100644 --- a/include/espressif/esp_timer.h +++ b/include/espressif/esp_timer.h @@ -7,16 +7,16 @@ #define __ESP_TIMER_H__ /* timer related */ -typedef void os_timer_func_t(void *timer_arg); +typedef void sdk_os_timer_func_t(void *timer_arg); typedef struct _os_timer_t { struct _os_timer_t *timer_next; void *freerots_handle; uint32_t timer_expire; uint32_t timer_period; - os_timer_func_t *timer_func; + sdk_os_timer_func_t *timer_func; bool timer_repeat_flag; void *timer_arg; -} os_timer_t; +} sdk_os_timer_t; #endif diff --git a/include/espressif/esp_wifi.h b/include/espressif/esp_wifi.h index 08824d6..e2274f1 100644 --- a/include/espressif/esp_wifi.h +++ b/include/espressif/esp_wifi.h @@ -1,6 +1,9 @@ /* * Copyright (C) 2013 -2014 Espressif System * + * Adapted from BSD licensed esp_iot_rtos_sdk v0.9.9 + * + * Functions declared in this header are defined in libmain.a */ #ifndef __ESP_WIFI_H__ @@ -23,8 +26,8 @@ typedef enum _auth_mode { AUTH_MAX } AUTH_MODE; -uint8_t wifi_get_opmode(void); -bool wifi_set_opmode(uint8_t opmode); +uint8_t sdk_wifi_get_opmode(void); +bool sdk_wifi_set_opmode(uint8_t opmode); enum { STATION_IF = 0, @@ -38,29 +41,29 @@ struct ip_info { struct ip_addr gw; }; -bool wifi_get_ip_info(uint8_t if_index, struct ip_info *info); -bool wifi_set_ip_info(uint8_t if_index, struct ip_info *info); -bool wifi_get_macaddr(uint8_t if_index, uint8_t *macaddr); -bool wifi_set_macaddr(uint8_t if_index, uint8_t *macaddr); +bool sdk_wifi_get_ip_info(uint8_t if_index, struct ip_info *info); +bool sdk_wifi_set_ip_info(uint8_t if_index, struct ip_info *info); +bool sdk_wifi_get_macaddr(uint8_t if_index, uint8_t *macaddr); +bool sdk_wifi_set_macaddr(uint8_t if_index, uint8_t *macaddr); -uint8_t wifi_get_channel(void); -bool wifi_set_channel(uint8_t channel); +uint8_t sdk_wifi_get_channel(void); +bool sdk_wifi_set_channel(uint8_t channel); -void wifi_status_led_install(uint8_t gpio_id, uint32_t gpio_name, uint8_t gpio_func); +void sdk_wifi_status_led_install(uint8_t gpio_id, uint32_t gpio_name, uint8_t gpio_func); -void wifi_promiscuous_enable(uint8_t promiscuous); +void sdk_wifi_promiscuous_enable(uint8_t promiscuous); -typedef void (* wifi_promiscuous_cb_t)(uint8_t *buf, uint16_t len); +typedef void (* sdk_wifi_promiscuous_cb_t)(uint8_t *buf, uint16_t len); -void wifi_set_promiscuous_rx_cb(wifi_promiscuous_cb_t cb); +void sdk_wifi_set_promiscuous_rx_cb(sdk_wifi_promiscuous_cb_t cb); -enum phy_mode { +enum sdk_phy_mode { PHY_MODE_11B = 1, PHY_MODE_11G = 2, PHY_MODE_11N = 3 }; -enum phy_mode wifi_get_phy_mode(void); -bool wifi_set_phy_mode(enum phy_mode mode); +enum phy_mode sdk_wifi_get_phy_mode(void); +bool sdk_wifi_set_phy_mode(enum sdk_phy_mode mode); #endif diff --git a/include/espressif/sdk_prototypes.h b/include/espressif/sdk_prototypes.h index 2817a72..4b5e3df 100644 --- a/include/espressif/sdk_prototypes.h +++ b/include/espressif/sdk_prototypes.h @@ -1,6 +1,11 @@ -/* This source file contains function prototypes for functions defined +/* sdk_prototypes.h + + This source file contains function prototypes for functions defined in the remaining "binary blob" ESP IoT RTOS SDK libraries. Sorted by which library they appear in. + + Function names here have the 'sdk_' prefix that is put on all binary library functions + by the Open RTOS SDK. */ #ifndef SDK_PROTOTYPES_H #define SDK_PROTOTYPES_H @@ -18,18 +23,28 @@ struct ip_addr; uart_no = 0 or 1 for which UART new_divisor = Calculated in the form UART_CLK_FREQ / BAUD */ -void uart_div_modify(uint32_t uart_no, uint32_t new_divisor); +void sdk_uart_div_modify(uint32_t uart_no, uint32_t new_divisor); + +/* Read a single character from the UART. + */ +char sdk_uart_rx_one_char(void); + +/* Write a single character to the UART. + */ +void sdk_os_putc(char c); /* Called when an IP gets set on the "station" (client) interface. */ -void system_station_got_ip_set(struct ip_addr *ip_addr, struct ip_addr *sn_mask, struct ip_addr *gw_addr); +void sdk_system_station_got_ip_set(struct ip_addr *ip_addr, struct ip_addr *sn_mask, struct ip_addr *gw_addr); /* This is a no-op wrapper around ppRecycleRxPkt, which is defined in libpp.a It's called when a pbuf is freed, and allows pp to reuse the 'eb' pointer to ESP-specific pbuf data. (See esp-lwip pbuf.h) */ -void system_pp_recycle_rx_pkt(void *eb); +void sdk_system_pp_recycle_rx_pkt(void *eb); + +const char* sdk_system_get_sdk_version(void); #endif diff --git a/include/espressif/spi_flash.h b/include/espressif/spi_flash.h index b4761f4..719c045 100644 --- a/include/espressif/spi_flash.h +++ b/include/espressif/spi_flash.h @@ -10,15 +10,15 @@ typedef enum { SPI_FLASH_RESULT_OK, SPI_FLASH_RESULT_ERR, SPI_FLASH_RESULT_TIMEOUT -} SpiFlashOpResult; +} sdk_SpiFlashOpResult; #define SPI_FLASH_SEC_SIZE 4096 -uint32_t spi_flash_get_id(void); -SpiFlashOpResult spi_flash_read_status(uint32_t *status); -SpiFlashOpResult spi_flash_write_status(uint32_t status_value); -SpiFlashOpResult spi_flash_erase_sector(uint16_t sec); -SpiFlashOpResult spi_flash_write(uint32_t des_addr, uint32_t *src_addr, uint32_t size); -SpiFlashOpResult spi_flash_read(uint32_t src_addr, uint32_t *des_addr, uint32_t size); +uint32_t sdk_spi_flash_get_id(void); +sdk_SpiFlashOpResult sdk_spi_flash_read_status(uint32_t *status); +sdk_SpiFlashOpResult sdk_spi_flash_write_status(uint32_t status_value); +sdk_SpiFlashOpResult sdk_spi_flash_erase_sector(uint16_t sec); +sdk_SpiFlashOpResult sdk_spi_flash_write(uint32_t des_addr, uint32_t *src_addr, uint32_t size); +sdk_SpiFlashOpResult sdk_spi_flash_read(uint32_t src_addr, uint32_t *des_addr, uint32_t size); #endif diff --git a/ld/eagle.app.v6.ld b/ld/eagle.app.v6.ld index daeff21..538a6c5 100644 --- a/ld/eagle.app.v6.ld +++ b/ld/eagle.app.v6.ld @@ -1,4 +1,8 @@ -/* This linker script generated from xt-genldscripts.tpp for LSP . */ +/* This linker script generated from xt-genldscripts.tpp for LSP . + + Modified for esp open RTOS, this linker script is no longer the same as the esp_iot_rtos_sdk one. +*/ + /* Linker Script for ld -N */ MEMORY { @@ -19,12 +23,12 @@ PHDRS /* Default entry point: */ -ENTRY(call_user_start) -EXTERN(_DebugExceptionVector) -EXTERN(_DoubleExceptionVector) -EXTERN(_KernelExceptionVector) -EXTERN(_NMIExceptionVector) -EXTERN(_UserExceptionVector) +ENTRY(sdk_call_user_start) +EXTERN(sdk__DebugExceptionVector) +EXTERN(sdk__DoubleExceptionVector) +EXTERN(sdk__KernelExceptionVector) +EXTERN(sdk__NMIExceptionVector) +EXTERN(sdk__UserExceptionVector) PROVIDE(_memmap_vecbase_reset = 0x40000000); /* Various memory-map dependent cache attribute settings: */ _memmap_cacheattr_wb_base = 0x00000110; diff --git a/lib/libhal.a b/lib/libhal.a deleted file mode 100644 index 728a0184b3ed8a0a8a65b929ae8262a74140675d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162888 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 { - ieee80211_output_pbuf(netif, q); + sdk_ieee80211_output_pbuf(netif, q); } LINK_STATS_INC(link.xmit); diff --git a/lwip/include/arch/cc.h b/lwip/include/arch/cc.h index 507409c..fe10d25 100644 --- a/lwip/include/arch/cc.h +++ b/lwip/include/arch/cc.h @@ -35,6 +35,14 @@ /* include ESP SDK prototypes as they're used in some LWIP routines */ #include "espressif/sdk_prototypes.h" +/* ESP8266 SDK Interface + + The lwip-esp stack is designed to be also compatible with other ESP8266 SDKs, + so we can't use our 'sdk_' prefixes there +*/ +#define system_station_got_ip_set sdk_system_station_got_ip_set +#define system_pp_recycle_rx_pkt sdk_system_pp_recycle_rx_pkt + /* Include some files for defining library routines */ #include /* printf, fflush, FILE */ #include /* abort */ diff --git a/lwip/include/arch/sys_arch.h b/lwip/include/arch/sys_arch.h index 3daf87b..ac616c9 100644 --- a/lwip/include/arch/sys_arch.h +++ b/lwip/include/arch/sys_arch.h @@ -37,6 +37,8 @@ #include "queue.h" #include "semphr.h" +/* MBOX primitives */ + #define SYS_MBOX_NULL ( ( xQueueHandle ) NULL ) #define SYS_SEM_NULL ( ( xSemaphoreHandle ) NULL ) #define SYS_DEFAULT_THREAD_STACK_DEPTH configMINIMAL_STACK_SIZE