Merge branch 'master' of https://github.com/Tencent/TencentOS-tiny
This commit is contained in:
383
board/TencentOS_tiny_EVB_MX/GCC/tencent_cloud_sdk_mqtt/Makefile
Normal file
383
board/TencentOS_tiny_EVB_MX/GCC/tencent_cloud_sdk_mqtt/Makefile
Normal file
@@ -0,0 +1,383 @@
|
|||||||
|
######################################
|
||||||
|
# target
|
||||||
|
######################################
|
||||||
|
TARGET = TencentOS_tiny
|
||||||
|
|
||||||
|
######################################
|
||||||
|
# building variables
|
||||||
|
######################################
|
||||||
|
# debug build?
|
||||||
|
DEBUG = 1
|
||||||
|
# optimization
|
||||||
|
OPT = -O0
|
||||||
|
|
||||||
|
TOP_DIR = ../../../../
|
||||||
|
#######################################
|
||||||
|
# paths
|
||||||
|
#######################################
|
||||||
|
# Build path
|
||||||
|
BUILD_DIR = build
|
||||||
|
|
||||||
|
######################################
|
||||||
|
# source
|
||||||
|
######################################
|
||||||
|
# C sources
|
||||||
|
KERNEL_SRC = \
|
||||||
|
${wildcard $(TOP_DIR)/kernel/core/*.c}
|
||||||
|
C_SOURCES += $(KERNEL_SRC)
|
||||||
|
|
||||||
|
ARCH_SRC = \
|
||||||
|
${wildcard $(TOP_DIR)/arch/arm/arm-v7m/cortex-m4/gcc/*.c} \
|
||||||
|
${wildcard $(TOP_DIR)/arch/arm/arm-v7m/common/*.c}
|
||||||
|
C_SOURCES += $(ARCH_SRC)
|
||||||
|
|
||||||
|
CMSIS_SRC = \
|
||||||
|
${wildcard $(TOP_DIR)/osal/cmsis_os/*.c}
|
||||||
|
C_SOURCES += $(CMSIS_SRC)
|
||||||
|
|
||||||
|
PLATFORM_SRC = \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dac.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dac_ex.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c \
|
||||||
|
$(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c \
|
||||||
|
$(TOP_DIR)/platform/hal/st/stm32l4xx/src/tos_hal_uart.c
|
||||||
|
C_SOURCES += $(PLATFORM_SRC)
|
||||||
|
|
||||||
|
NET_SRC = \
|
||||||
|
$(TOP_DIR)/net/at/src/tos_at.c \
|
||||||
|
$(TOP_DIR)/net/at/src/tos_at_utils.c \
|
||||||
|
$(TOP_DIR)/net/sal_module_wrapper/sal_module_wrapper.c \
|
||||||
|
$(TOP_DIR)/devices/esp8266/esp8266.c
|
||||||
|
C_SOURCES += $(NET_SRC)
|
||||||
|
|
||||||
|
BSP_SRC = \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/gpio.c \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/main.c \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/mcu_init.c \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/stm32l4xx_hal_msp.c \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/stm32l4xx_it_module.c \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/usart.c \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/adc.c \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/dac.c \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/i2c.c \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/spi.c \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Src/system_stm32l4xx.c \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/DHT11/DHT11_BUS.c \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/OLED/oled.c \
|
||||||
|
$(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/E53_IA1/E53_IA1.c
|
||||||
|
C_SOURCES += $(BSP_SRC)
|
||||||
|
|
||||||
|
COMPONENTS_SRC = \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/wrapper/src/entropy_hardware_alt.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/wrapper/src/net_module_alt.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/wrapper/src/timing_alt.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/aes.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/aesni.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/arc4.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/aria.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/asn1parse.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/asn1write.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/base64.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/bignum.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/blowfish.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/camellia.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ccm.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/certs.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/chacha20.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/chachapoly.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/cipher.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/cipher_wrap.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/cmac.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ctr_drbg.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/debug.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/des.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/dhm.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ecdh.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ecdsa.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ecjpake.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ecp.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ecp_curves.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/entropy.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/entropy_poll.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/error.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/gcm.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/havege.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/hkdf.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/hmac_drbg.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/md.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/md_wrap.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/md2.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/md4.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/md5.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/memory_buffer_alloc.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/net_sockets.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/nist_kw.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/oid.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/padlock.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/pem.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/pk.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/pk_wrap.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/pkcs5.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/pkcs11.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/pkcs12.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/pkparse.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/pkwrite.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/platform.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/platform_util.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/poly1305.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ripemd160.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/rsa.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/rsa_internal.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/sha1.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/sha256.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/sha512.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ssl_cache.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ssl_ciphersuites.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ssl_cli.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ssl_cookie.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ssl_srv.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ssl_ticket.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/ssl_tls.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/threading.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/timing.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/version.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/version_features.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/x509.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/x509_create.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/x509_crl.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/x509_crt.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/x509_csr.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/x509write_crt.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/x509write_csr.c \
|
||||||
|
$(TOP_DIR)/components/security/mbedtls/3rdparty/src/xtea.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/qcloud_log.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/qcloud_network.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/qcloud_device.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/qcloud_tls.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/utils/qcloud_aes.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/utils/qcloud_base64.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/utils/qcloud_hmac.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/utils/qcloud_httpc.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/utils/qcloud_json_parser.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/utils/qcloud_json_token.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/utils/qcloud_md5.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/utils/qcloud_sha1.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/utils/qcloud_string_utils.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/mqtt/qcloud_mqtt_client.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/mqtt/qcloud_mqtt_common.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/mqtt/qcloud_mqtt_connect.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/mqtt/qcloud_mqtt_glue.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/mqtt/qcloud_mqtt_publish.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/mqtt/qcloud_mqtt_subscribe.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/mqtt/qcloud_mqtt_unsubscribe.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/mqtt/qcloud_mqtt_yield.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/port/TencentOS_tiny/osal_dtls.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/port/TencentOS_tiny/osal_os.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/port/TencentOS_tiny/osal_tcp_module.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/port/TencentOS_tiny/osal_timer.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/port/TencentOS_tiny/osal_tls.c \
|
||||||
|
$(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/src/port/TencentOS_tiny/osal_udp_module.c
|
||||||
|
C_SOURCES += $(COMPONENTS_SRC)
|
||||||
|
|
||||||
|
EXAMPLES_SRC = \
|
||||||
|
$(TOP_DIR)/examples/tencent_cloud_sdk_mqtt/mqtt_sample.c \
|
||||||
|
$(TOP_DIR)/examples/tencent_cloud_sdk_mqtt/tencent_cloud_sdk_mqtt.c
|
||||||
|
C_SOURCES += $(EXAMPLES_SRC)
|
||||||
|
|
||||||
|
# ASM sources
|
||||||
|
ASM_SOURCES = \
|
||||||
|
startup_stm32l431xx.s \
|
||||||
|
|
||||||
|
ASM_SOURCES_S = \
|
||||||
|
$(TOP_DIR)/arch/arm/arm-v7m/cortex-m4/gcc/port_s.S
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# binaries
|
||||||
|
#######################################
|
||||||
|
PREFIX = arm-none-eabi-
|
||||||
|
# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)
|
||||||
|
# either it can be added to the PATH environment variable.
|
||||||
|
ifdef GCC_PATH
|
||||||
|
CC = $(GCC_PATH)/$(PREFIX)gcc
|
||||||
|
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
|
||||||
|
CP = $(GCC_PATH)/$(PREFIX)objcopy
|
||||||
|
SZ = $(GCC_PATH)/$(PREFIX)size
|
||||||
|
else
|
||||||
|
CC = $(PREFIX)gcc
|
||||||
|
AS = $(PREFIX)gcc -x assembler-with-cpp
|
||||||
|
CP = $(PREFIX)objcopy
|
||||||
|
SZ = $(PREFIX)size
|
||||||
|
endif
|
||||||
|
HEX = $(CP) -O ihex
|
||||||
|
BIN = $(CP) -O binary -S
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# CFLAGS
|
||||||
|
#######################################
|
||||||
|
# cpu
|
||||||
|
CPU = -mcpu=cortex-m4
|
||||||
|
|
||||||
|
# fpu
|
||||||
|
FPU = -mfpu=fpv4-sp-d16
|
||||||
|
|
||||||
|
# float-abi
|
||||||
|
FLOAT-ABI = -mfloat-abi=hard
|
||||||
|
|
||||||
|
# mcu
|
||||||
|
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)
|
||||||
|
|
||||||
|
# macros for gcc
|
||||||
|
# AS defines
|
||||||
|
AS_DEFS =
|
||||||
|
|
||||||
|
# C defines
|
||||||
|
C_DEFS = \
|
||||||
|
-DUSE_HAL_DRIVER \
|
||||||
|
-DSTM32L431xx \
|
||||||
|
-DMBEDTLS_CONFIG_FILE='<qcloud/tls_psk_config.h>'
|
||||||
|
|
||||||
|
# AS includes
|
||||||
|
AS_INCLUDES =
|
||||||
|
|
||||||
|
# C includes
|
||||||
|
KERNEL_INC = \
|
||||||
|
-I $(TOP_DIR)/kernel/core/include \
|
||||||
|
-I $(TOP_DIR)/kernel/pm/include \
|
||||||
|
-I $(TOP_DIR)/kernel/hal/include \
|
||||||
|
-I $(TOP_DIR)/arch/arm/arm-v7m/common/include \
|
||||||
|
-I $(TOP_DIR)/arch/arm/arm-v7m/cortex-m4/gcc
|
||||||
|
C_INCLUDES += $(KERNEL_INC)
|
||||||
|
|
||||||
|
CMSIS_INC = \
|
||||||
|
-I $(TOP_DIR)/osal/cmsis_os
|
||||||
|
C_INCLUDES += $(CMSIS_INC)
|
||||||
|
|
||||||
|
PLATFORM_INC = \
|
||||||
|
-I $(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Inc \
|
||||||
|
-I $(TOP_DIR)/platform/vendor_bsp/st/STM32L4xx_HAL_Driver/Inc/Legacy \
|
||||||
|
-I $(TOP_DIR)/platform/vendor_bsp/st/CMSIS/Device/ST/STM32L4xx/Include \
|
||||||
|
-I $(TOP_DIR)/platform/vendor_bsp/st/CMSIS/Include
|
||||||
|
C_INCLUDES += $(PLATFORM_INC)
|
||||||
|
|
||||||
|
BOARD_INC = \
|
||||||
|
-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/TOS-CONFIG \
|
||||||
|
-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Inc \
|
||||||
|
-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/DHT11 \
|
||||||
|
-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/BH1750 \
|
||||||
|
-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/E53_IA1 \
|
||||||
|
-I $(TOP_DIR)/board/TencentOS_tiny_EVB_MX/BSP/Hardware/OLED
|
||||||
|
C_INCLUDES += $(BOARD_INC)
|
||||||
|
|
||||||
|
NET_INC = \
|
||||||
|
-I $(TOP_DIR)/net/at/include \
|
||||||
|
-I $(TOP_DIR)/net/sal_module_wrapper \
|
||||||
|
-I $(TOP_DIR)/devices/esp8266_tencent_firmware \
|
||||||
|
-I $(TOP_DIR)/devices/rhf76_lora \
|
||||||
|
-I $(TOP_DIR)/net/lora_module_wrapper \
|
||||||
|
-I $(TOP_DIR)/net/tencent_firmware_module_wrapper \
|
||||||
|
-I $(TOP_DIR)/devices/bc35_28_95 \
|
||||||
|
-I $(TOP_DIR)/devices/esp8266
|
||||||
|
C_INCLUDES += $(NET_INC)
|
||||||
|
|
||||||
|
COMPONENTS_INC = \
|
||||||
|
-I $(TOP_DIR)/components/security/mbedtls/wrapper/include \
|
||||||
|
-I $(TOP_DIR)/components/security/mbedtls/wrapper/include/qcloud \
|
||||||
|
-I $(TOP_DIR)/components/connectivity/TencentCloud_SDK/source/include \
|
||||||
|
-I $(TOP_DIR)/components/security/mbedtls/3rdparty/include \
|
||||||
|
-I $(TOP_DIR)/components/security/mbedtls/3rdparty/include/mbedtls
|
||||||
|
C_INCLUDES += $(COMPONENTS_INC)
|
||||||
|
|
||||||
|
EXAMPLES_INC =
|
||||||
|
C_INCLUDES += $(EXAMPLES_INC)
|
||||||
|
|
||||||
|
# compile gcc flags
|
||||||
|
ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
|
||||||
|
|
||||||
|
CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
|
||||||
|
|
||||||
|
ifeq ($(DEBUG), 1)
|
||||||
|
CFLAGS += -g -gdwarf-2
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Generate dependency information
|
||||||
|
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# LDFLAGS
|
||||||
|
#######################################
|
||||||
|
# link script
|
||||||
|
LDSCRIPT = STM32L431RCTx_FLASH.ld
|
||||||
|
|
||||||
|
# libraries
|
||||||
|
LIBS = -lc -lm -lnosys
|
||||||
|
LIBDIR =
|
||||||
|
LDFLAGS = $(MCU) -u _printf_float -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) \
|
||||||
|
-Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections
|
||||||
|
|
||||||
|
# default action: build all
|
||||||
|
all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# build the application
|
||||||
|
#######################################
|
||||||
|
# list of objects
|
||||||
|
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
|
||||||
|
vpath %.c $(sort $(dir $(C_SOURCES)))
|
||||||
|
# list of ASM program objects
|
||||||
|
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
|
||||||
|
vpath %.s $(sort $(dir $(ASM_SOURCES)))
|
||||||
|
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES_S:.S=.o)))
|
||||||
|
vpath %.S $(sort $(dir $(ASM_SOURCES_S)))
|
||||||
|
|
||||||
|
$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
|
||||||
|
$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@
|
||||||
|
|
||||||
|
$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
|
||||||
|
$(AS) -c $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
$(BUILD_DIR)/%.o: %.S Makefile | $(BUILD_DIR)
|
||||||
|
$(AS) -c $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
|
||||||
|
$(CC) $(OBJECTS) $(LDFLAGS) -o $@
|
||||||
|
$(SZ) $@
|
||||||
|
|
||||||
|
$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
|
||||||
|
$(HEX) $< $@
|
||||||
|
|
||||||
|
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
|
||||||
|
$(BIN) $< $@
|
||||||
|
|
||||||
|
$(BUILD_DIR):
|
||||||
|
mkdir $@
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# clean up
|
||||||
|
#######################################
|
||||||
|
clean:
|
||||||
|
-rm -fR $(BUILD_DIR)
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# dependencies
|
||||||
|
#######################################
|
||||||
|
-include $(wildcard $(BUILD_DIR)/*.d)
|
@@ -0,0 +1,203 @@
|
|||||||
|
/*
|
||||||
|
******************************************************************************
|
||||||
|
**
|
||||||
|
|
||||||
|
** File : LinkerScript.ld
|
||||||
|
**
|
||||||
|
** Author : Auto-generated by Ac6 System Workbench
|
||||||
|
**
|
||||||
|
** Abstract : Linker script for STM32L431RCTx series
|
||||||
|
** 256Kbytes FLASH and 64Kbytes RAM
|
||||||
|
**
|
||||||
|
** Set heap size, stack size and stack location according
|
||||||
|
** to application requirements.
|
||||||
|
**
|
||||||
|
** Set memory bank area and size if external memory is used.
|
||||||
|
**
|
||||||
|
** Target : STMicroelectronics STM32
|
||||||
|
**
|
||||||
|
** Distribution: The file is distributed “as is,” without any warranty
|
||||||
|
** of any kind.
|
||||||
|
**
|
||||||
|
*****************************************************************************
|
||||||
|
** @attention
|
||||||
|
**
|
||||||
|
** <h2><center>© COPYRIGHT(c) 2014 Ac6</center></h2>
|
||||||
|
**
|
||||||
|
** Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
** are permitted provided that the following conditions are met:
|
||||||
|
** 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
** this list of conditions and the following disclaimer.
|
||||||
|
** 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
** this list of conditions and the following disclaimer in the documentation
|
||||||
|
** and/or other materials provided with the distribution.
|
||||||
|
** 3. Neither the name of Ac6 nor the names of its contributors
|
||||||
|
** may be used to endorse or promote products derived from this software
|
||||||
|
** without specific prior written permission.
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
**
|
||||||
|
*****************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Entry Point */
|
||||||
|
ENTRY(Reset_Handler)
|
||||||
|
|
||||||
|
/* Highest address of the user mode stack */
|
||||||
|
_estack = 0x20010000; /* end of RAM */
|
||||||
|
/* Generate a link error if heap and stack don't fit into RAM */
|
||||||
|
_Min_Heap_Size = 0x200; /* required amount of heap */
|
||||||
|
_Min_Stack_Size = 0x400; /* required amount of stack */
|
||||||
|
|
||||||
|
/* Specify the memory areas */
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
|
||||||
|
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 256K
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Define output sections */
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
/* The startup code goes first into FLASH */
|
||||||
|
.isr_vector :
|
||||||
|
{
|
||||||
|
. = ALIGN(8);
|
||||||
|
KEEP(*(.isr_vector)) /* Startup code */
|
||||||
|
. = ALIGN(8);
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
/* The program code and other data goes into FLASH */
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
. = ALIGN(8);
|
||||||
|
*(.text) /* .text sections (code) */
|
||||||
|
*(.text*) /* .text* sections (code) */
|
||||||
|
*(.glue_7) /* glue arm to thumb code */
|
||||||
|
*(.glue_7t) /* glue thumb to arm code */
|
||||||
|
*(.eh_frame)
|
||||||
|
|
||||||
|
KEEP (*(.init))
|
||||||
|
KEEP (*(.fini))
|
||||||
|
|
||||||
|
. = ALIGN(8);
|
||||||
|
_etext = .; /* define a global symbols at end of code */
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
/* Constant data goes into FLASH */
|
||||||
|
.rodata :
|
||||||
|
{
|
||||||
|
. = ALIGN(8);
|
||||||
|
*(.rodata) /* .rodata sections (constants, strings, etc.) */
|
||||||
|
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
|
||||||
|
. = ALIGN(8);
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
.ARM.extab :
|
||||||
|
{
|
||||||
|
. = ALIGN(8);
|
||||||
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||||
|
. = ALIGN(8);
|
||||||
|
} >FLASH
|
||||||
|
.ARM : {
|
||||||
|
. = ALIGN(8);
|
||||||
|
__exidx_start = .;
|
||||||
|
*(.ARM.exidx*)
|
||||||
|
__exidx_end = .;
|
||||||
|
. = ALIGN(8);
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
.preinit_array :
|
||||||
|
{
|
||||||
|
. = ALIGN(8);
|
||||||
|
PROVIDE_HIDDEN (__preinit_array_start = .);
|
||||||
|
KEEP (*(.preinit_array*))
|
||||||
|
PROVIDE_HIDDEN (__preinit_array_end = .);
|
||||||
|
. = ALIGN(8);
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
.init_array :
|
||||||
|
{
|
||||||
|
. = ALIGN(8);
|
||||||
|
PROVIDE_HIDDEN (__init_array_start = .);
|
||||||
|
KEEP (*(SORT(.init_array.*)))
|
||||||
|
KEEP (*(.init_array*))
|
||||||
|
PROVIDE_HIDDEN (__init_array_end = .);
|
||||||
|
. = ALIGN(8);
|
||||||
|
} >FLASH
|
||||||
|
.fini_array :
|
||||||
|
{
|
||||||
|
. = ALIGN(8);
|
||||||
|
PROVIDE_HIDDEN (__fini_array_start = .);
|
||||||
|
KEEP (*(SORT(.fini_array.*)))
|
||||||
|
KEEP (*(.fini_array*))
|
||||||
|
PROVIDE_HIDDEN (__fini_array_end = .);
|
||||||
|
. = ALIGN(8);
|
||||||
|
} >FLASH
|
||||||
|
|
||||||
|
/* used by the startup to initialize data */
|
||||||
|
_sidata = LOADADDR(.data);
|
||||||
|
|
||||||
|
/* Initialized data sections goes into RAM, load LMA copy after code */
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
. = ALIGN(8);
|
||||||
|
_sdata = .; /* create a global symbol at data start */
|
||||||
|
*(.data) /* .data sections */
|
||||||
|
*(.data*) /* .data* sections */
|
||||||
|
|
||||||
|
. = ALIGN(8);
|
||||||
|
_edata = .; /* define a global symbol at data end */
|
||||||
|
} >RAM AT> FLASH
|
||||||
|
|
||||||
|
|
||||||
|
/* Uninitialized data section */
|
||||||
|
. = ALIGN(4);
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
/* This is used by the startup in order to initialize the .bss secion */
|
||||||
|
_sbss = .; /* define a global symbol at bss start */
|
||||||
|
__bss_start__ = _sbss;
|
||||||
|
*(.bss)
|
||||||
|
*(.bss*)
|
||||||
|
*(COMMON)
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
_ebss = .; /* define a global symbol at bss end */
|
||||||
|
__bss_end__ = _ebss;
|
||||||
|
} >RAM
|
||||||
|
|
||||||
|
/* User_heap_stack section, used to check that there is enough RAM left */
|
||||||
|
._user_heap_stack :
|
||||||
|
{
|
||||||
|
. = ALIGN(8);
|
||||||
|
PROVIDE ( end = . );
|
||||||
|
PROVIDE ( _end = . );
|
||||||
|
. = . + _Min_Heap_Size;
|
||||||
|
. = . + _Min_Stack_Size;
|
||||||
|
. = ALIGN(8);
|
||||||
|
} >RAM
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Remove information from the standard libraries */
|
||||||
|
/DISCARD/ :
|
||||||
|
{
|
||||||
|
libc.a ( * )
|
||||||
|
libm.a ( * )
|
||||||
|
libgcc.a ( * )
|
||||||
|
}
|
||||||
|
|
||||||
|
.ARM.attributes 0 : { *(.ARM.attributes) }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@@ -0,0 +1,474 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file startup_stm32l431xx.s
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @brief STM32L431xx devices vector table for GCC toolchain.
|
||||||
|
* This module performs:
|
||||||
|
* - Set the initial SP
|
||||||
|
* - Set the initial PC == Reset_Handler,
|
||||||
|
* - Set the vector table entries with the exceptions ISR address,
|
||||||
|
* - Configure the clock system
|
||||||
|
* - Branches to main in the C library (which eventually
|
||||||
|
* calls main()).
|
||||||
|
* After Reset the Cortex-M4 processor is in Thread mode,
|
||||||
|
* priority is Privileged, and the Stack is set to Main.
|
||||||
|
******************************************************************************
|
||||||
|
* @attention
|
||||||
|
*
|
||||||
|
* <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of STMicroelectronics nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
.syntax unified
|
||||||
|
.cpu cortex-m4
|
||||||
|
.fpu softvfp
|
||||||
|
.thumb
|
||||||
|
|
||||||
|
.global g_pfnVectors
|
||||||
|
.global Default_Handler
|
||||||
|
|
||||||
|
/* start address for the initialization values of the .data section.
|
||||||
|
defined in linker script */
|
||||||
|
.word _sidata
|
||||||
|
/* start address for the .data section. defined in linker script */
|
||||||
|
.word _sdata
|
||||||
|
/* end address for the .data section. defined in linker script */
|
||||||
|
.word _edata
|
||||||
|
/* start address for the .bss section. defined in linker script */
|
||||||
|
.word _sbss
|
||||||
|
/* end address for the .bss section. defined in linker script */
|
||||||
|
.word _ebss
|
||||||
|
|
||||||
|
.equ BootRAM, 0xF1E0F85F
|
||||||
|
/**
|
||||||
|
* @brief This is the code that gets called when the processor first
|
||||||
|
* starts execution following a reset event. Only the absolutely
|
||||||
|
* necessary set is performed, after which the application
|
||||||
|
* supplied main() routine is called.
|
||||||
|
* @param None
|
||||||
|
* @retval : None
|
||||||
|
*/
|
||||||
|
|
||||||
|
.section .text.Reset_Handler
|
||||||
|
.weak Reset_Handler
|
||||||
|
.type Reset_Handler, %function
|
||||||
|
Reset_Handler:
|
||||||
|
ldr sp, =_estack /* Atollic update: set stack pointer */
|
||||||
|
|
||||||
|
/* Copy the data segment initializers from flash to SRAM */
|
||||||
|
movs r1, #0
|
||||||
|
b LoopCopyDataInit
|
||||||
|
|
||||||
|
CopyDataInit:
|
||||||
|
ldr r3, =_sidata
|
||||||
|
ldr r3, [r3, r1]
|
||||||
|
str r3, [r0, r1]
|
||||||
|
adds r1, r1, #4
|
||||||
|
|
||||||
|
LoopCopyDataInit:
|
||||||
|
ldr r0, =_sdata
|
||||||
|
ldr r3, =_edata
|
||||||
|
adds r2, r0, r1
|
||||||
|
cmp r2, r3
|
||||||
|
bcc CopyDataInit
|
||||||
|
ldr r2, =_sbss
|
||||||
|
b LoopFillZerobss
|
||||||
|
/* Zero fill the bss segment. */
|
||||||
|
FillZerobss:
|
||||||
|
movs r3, #0
|
||||||
|
str r3, [r2], #4
|
||||||
|
|
||||||
|
LoopFillZerobss:
|
||||||
|
ldr r3, = _ebss
|
||||||
|
cmp r2, r3
|
||||||
|
bcc FillZerobss
|
||||||
|
|
||||||
|
/* Call the clock system intitialization function.*/
|
||||||
|
bl SystemInit
|
||||||
|
/* Call static constructors */
|
||||||
|
bl __libc_init_array
|
||||||
|
/* Call the application's entry point.*/
|
||||||
|
bl main
|
||||||
|
|
||||||
|
LoopForever:
|
||||||
|
b LoopForever
|
||||||
|
|
||||||
|
.size Reset_Handler, .-Reset_Handler
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This is the code that gets called when the processor receives an
|
||||||
|
* unexpected interrupt. This simply enters an infinite loop, preserving
|
||||||
|
* the system state for examination by a debugger.
|
||||||
|
*
|
||||||
|
* @param None
|
||||||
|
* @retval : None
|
||||||
|
*/
|
||||||
|
.section .text.Default_Handler,"ax",%progbits
|
||||||
|
Default_Handler:
|
||||||
|
Infinite_Loop:
|
||||||
|
b Infinite_Loop
|
||||||
|
.size Default_Handler, .-Default_Handler
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* The minimal vector table for a Cortex-M4. Note that the proper constructs
|
||||||
|
* must be placed on this to ensure that it ends up at physical address
|
||||||
|
* 0x0000.0000.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
.section .isr_vector,"a",%progbits
|
||||||
|
.type g_pfnVectors, %object
|
||||||
|
.size g_pfnVectors, .-g_pfnVectors
|
||||||
|
|
||||||
|
|
||||||
|
g_pfnVectors:
|
||||||
|
.word _estack
|
||||||
|
.word Reset_Handler
|
||||||
|
.word NMI_Handler
|
||||||
|
.word HardFault_Handler
|
||||||
|
.word MemManage_Handler
|
||||||
|
.word BusFault_Handler
|
||||||
|
.word UsageFault_Handler
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word SVC_Handler
|
||||||
|
.word DebugMon_Handler
|
||||||
|
.word 0
|
||||||
|
.word PendSV_Handler
|
||||||
|
.word SysTick_Handler
|
||||||
|
.word WWDG_IRQHandler
|
||||||
|
.word PVD_PVM_IRQHandler
|
||||||
|
.word TAMP_STAMP_IRQHandler
|
||||||
|
.word RTC_WKUP_IRQHandler
|
||||||
|
.word FLASH_IRQHandler
|
||||||
|
.word RCC_IRQHandler
|
||||||
|
.word EXTI0_IRQHandler
|
||||||
|
.word EXTI1_IRQHandler
|
||||||
|
.word EXTI2_IRQHandler
|
||||||
|
.word EXTI3_IRQHandler
|
||||||
|
.word EXTI4_IRQHandler
|
||||||
|
.word DMA1_Channel1_IRQHandler
|
||||||
|
.word DMA1_Channel2_IRQHandler
|
||||||
|
.word DMA1_Channel3_IRQHandler
|
||||||
|
.word DMA1_Channel4_IRQHandler
|
||||||
|
.word DMA1_Channel5_IRQHandler
|
||||||
|
.word DMA1_Channel6_IRQHandler
|
||||||
|
.word DMA1_Channel7_IRQHandler
|
||||||
|
.word ADC1_IRQHandler
|
||||||
|
.word CAN1_TX_IRQHandler
|
||||||
|
.word CAN1_RX0_IRQHandler
|
||||||
|
.word CAN1_RX1_IRQHandler
|
||||||
|
.word CAN1_SCE_IRQHandler
|
||||||
|
.word EXTI9_5_IRQHandler
|
||||||
|
.word TIM1_BRK_TIM15_IRQHandler
|
||||||
|
.word TIM1_UP_TIM16_IRQHandler
|
||||||
|
.word TIM1_TRG_COM_IRQHandler
|
||||||
|
.word TIM1_CC_IRQHandler
|
||||||
|
.word TIM2_IRQHandler
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word I2C1_EV_IRQHandler
|
||||||
|
.word I2C1_ER_IRQHandler
|
||||||
|
.word I2C2_EV_IRQHandler
|
||||||
|
.word I2C2_ER_IRQHandler
|
||||||
|
.word SPI1_IRQHandler
|
||||||
|
.word SPI2_IRQHandler
|
||||||
|
.word USART1_IRQHandler
|
||||||
|
.word USART2_IRQHandler
|
||||||
|
.word USART3_IRQHandler
|
||||||
|
.word EXTI15_10_IRQHandler
|
||||||
|
.word RTC_Alarm_IRQHandler
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word SDMMC1_IRQHandler
|
||||||
|
.word 0
|
||||||
|
.word SPI3_IRQHandler
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word TIM6_DAC_IRQHandler
|
||||||
|
.word TIM7_IRQHandler
|
||||||
|
.word DMA2_Channel1_IRQHandler
|
||||||
|
.word DMA2_Channel2_IRQHandler
|
||||||
|
.word DMA2_Channel3_IRQHandler
|
||||||
|
.word DMA2_Channel4_IRQHandler
|
||||||
|
.word DMA2_Channel5_IRQHandler
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word COMP_IRQHandler
|
||||||
|
.word LPTIM1_IRQHandler
|
||||||
|
.word LPTIM2_IRQHandler
|
||||||
|
.word 0
|
||||||
|
.word DMA2_Channel6_IRQHandler
|
||||||
|
.word DMA2_Channel7_IRQHandler
|
||||||
|
.word LPUART1_IRQHandler
|
||||||
|
.word QUADSPI_IRQHandler
|
||||||
|
.word I2C3_EV_IRQHandler
|
||||||
|
.word I2C3_ER_IRQHandler
|
||||||
|
.word SAI1_IRQHandler
|
||||||
|
.word 0
|
||||||
|
.word SWPMI1_IRQHandler
|
||||||
|
.word TSC_IRQHandler
|
||||||
|
.word 0
|
||||||
|
.word 0
|
||||||
|
.word RNG_IRQHandler
|
||||||
|
.word FPU_IRQHandler
|
||||||
|
.word CRS_IRQHandler
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
*
|
||||||
|
* Provide weak aliases for each Exception handler to the Default_Handler.
|
||||||
|
* As they are weak aliases, any function with the same name will override
|
||||||
|
* this definition.
|
||||||
|
*
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
.weak NMI_Handler
|
||||||
|
.thumb_set NMI_Handler,Default_Handler
|
||||||
|
|
||||||
|
.weak HardFault_Handler
|
||||||
|
.thumb_set HardFault_Handler,Default_Handler
|
||||||
|
|
||||||
|
.weak MemManage_Handler
|
||||||
|
.thumb_set MemManage_Handler,Default_Handler
|
||||||
|
|
||||||
|
.weak BusFault_Handler
|
||||||
|
.thumb_set BusFault_Handler,Default_Handler
|
||||||
|
|
||||||
|
.weak UsageFault_Handler
|
||||||
|
.thumb_set UsageFault_Handler,Default_Handler
|
||||||
|
|
||||||
|
.weak SVC_Handler
|
||||||
|
.thumb_set SVC_Handler,Default_Handler
|
||||||
|
|
||||||
|
.weak DebugMon_Handler
|
||||||
|
.thumb_set DebugMon_Handler,Default_Handler
|
||||||
|
|
||||||
|
.weak PendSV_Handler
|
||||||
|
.thumb_set PendSV_Handler,Default_Handler
|
||||||
|
|
||||||
|
.weak SysTick_Handler
|
||||||
|
.thumb_set SysTick_Handler,Default_Handler
|
||||||
|
|
||||||
|
.weak WWDG_IRQHandler
|
||||||
|
.thumb_set WWDG_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak PVD_PVM_IRQHandler
|
||||||
|
.thumb_set PVD_PVM_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak TAMP_STAMP_IRQHandler
|
||||||
|
.thumb_set TAMP_STAMP_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak RTC_WKUP_IRQHandler
|
||||||
|
.thumb_set RTC_WKUP_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak FLASH_IRQHandler
|
||||||
|
.thumb_set FLASH_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak RCC_IRQHandler
|
||||||
|
.thumb_set RCC_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak EXTI0_IRQHandler
|
||||||
|
.thumb_set EXTI0_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak EXTI1_IRQHandler
|
||||||
|
.thumb_set EXTI1_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak EXTI2_IRQHandler
|
||||||
|
.thumb_set EXTI2_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak EXTI3_IRQHandler
|
||||||
|
.thumb_set EXTI3_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak EXTI4_IRQHandler
|
||||||
|
.thumb_set EXTI4_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA1_Channel1_IRQHandler
|
||||||
|
.thumb_set DMA1_Channel1_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA1_Channel2_IRQHandler
|
||||||
|
.thumb_set DMA1_Channel2_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA1_Channel3_IRQHandler
|
||||||
|
.thumb_set DMA1_Channel3_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA1_Channel4_IRQHandler
|
||||||
|
.thumb_set DMA1_Channel4_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA1_Channel5_IRQHandler
|
||||||
|
.thumb_set DMA1_Channel5_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA1_Channel6_IRQHandler
|
||||||
|
.thumb_set DMA1_Channel6_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA1_Channel7_IRQHandler
|
||||||
|
.thumb_set DMA1_Channel7_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak ADC1_IRQHandler
|
||||||
|
.thumb_set ADC1_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak CAN1_TX_IRQHandler
|
||||||
|
.thumb_set CAN1_TX_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak CAN1_RX0_IRQHandler
|
||||||
|
.thumb_set CAN1_RX0_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak CAN1_RX1_IRQHandler
|
||||||
|
.thumb_set CAN1_RX1_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak CAN1_SCE_IRQHandler
|
||||||
|
.thumb_set CAN1_SCE_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak EXTI9_5_IRQHandler
|
||||||
|
.thumb_set EXTI9_5_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak TIM1_BRK_TIM15_IRQHandler
|
||||||
|
.thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak TIM1_UP_TIM16_IRQHandler
|
||||||
|
.thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak TIM1_TRG_COM_IRQHandler
|
||||||
|
.thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak TIM1_CC_IRQHandler
|
||||||
|
.thumb_set TIM1_CC_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak TIM2_IRQHandler
|
||||||
|
.thumb_set TIM2_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak I2C1_EV_IRQHandler
|
||||||
|
.thumb_set I2C1_EV_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak I2C1_ER_IRQHandler
|
||||||
|
.thumb_set I2C1_ER_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak I2C2_EV_IRQHandler
|
||||||
|
.thumb_set I2C2_EV_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak I2C2_ER_IRQHandler
|
||||||
|
.thumb_set I2C2_ER_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak SPI1_IRQHandler
|
||||||
|
.thumb_set SPI1_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak SPI2_IRQHandler
|
||||||
|
.thumb_set SPI2_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak USART1_IRQHandler
|
||||||
|
.thumb_set USART1_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak USART2_IRQHandler
|
||||||
|
.thumb_set USART2_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak USART3_IRQHandler
|
||||||
|
.thumb_set USART3_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak EXTI15_10_IRQHandler
|
||||||
|
.thumb_set EXTI15_10_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak RTC_Alarm_IRQHandler
|
||||||
|
.thumb_set RTC_Alarm_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak SDMMC1_IRQHandler
|
||||||
|
.thumb_set SDMMC1_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak SPI3_IRQHandler
|
||||||
|
.thumb_set SPI3_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak TIM6_DAC_IRQHandler
|
||||||
|
.thumb_set TIM6_DAC_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak TIM7_IRQHandler
|
||||||
|
.thumb_set TIM7_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA2_Channel1_IRQHandler
|
||||||
|
.thumb_set DMA2_Channel1_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA2_Channel2_IRQHandler
|
||||||
|
.thumb_set DMA2_Channel2_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA2_Channel3_IRQHandler
|
||||||
|
.thumb_set DMA2_Channel3_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA2_Channel4_IRQHandler
|
||||||
|
.thumb_set DMA2_Channel4_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA2_Channel5_IRQHandler
|
||||||
|
.thumb_set DMA2_Channel5_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak COMP_IRQHandler
|
||||||
|
.thumb_set COMP_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak LPTIM1_IRQHandler
|
||||||
|
.thumb_set LPTIM1_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak LPTIM2_IRQHandler
|
||||||
|
.thumb_set LPTIM2_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA2_Channel6_IRQHandler
|
||||||
|
.thumb_set DMA2_Channel6_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak DMA2_Channel7_IRQHandler
|
||||||
|
.thumb_set DMA2_Channel7_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak LPUART1_IRQHandler
|
||||||
|
.thumb_set LPUART1_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak QUADSPI_IRQHandler
|
||||||
|
.thumb_set QUADSPI_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak I2C3_EV_IRQHandler
|
||||||
|
.thumb_set I2C3_EV_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak I2C3_ER_IRQHandler
|
||||||
|
.thumb_set I2C3_ER_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak SAI1_IRQHandler
|
||||||
|
.thumb_set SAI1_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak SWPMI1_IRQHandler
|
||||||
|
.thumb_set SWPMI1_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak TSC_IRQHandler
|
||||||
|
.thumb_set TSC_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak RNG_IRQHandler
|
||||||
|
.thumb_set RNG_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak FPU_IRQHandler
|
||||||
|
.thumb_set FPU_IRQHandler,Default_Handler
|
||||||
|
|
||||||
|
.weak CRS_IRQHandler
|
||||||
|
.thumb_set CRS_IRQHandler,Default_Handler
|
||||||
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
@@ -43,6 +43,8 @@
|
|||||||
#include <tos_mutex.h>
|
#include <tos_mutex.h>
|
||||||
#include <tos_sem.h>
|
#include <tos_sem.h>
|
||||||
#include <tos_event.h>
|
#include <tos_event.h>
|
||||||
|
#include <tos_countdownlatch.h>
|
||||||
|
#include <tos_completion.h>
|
||||||
#include <tos_timer.h>
|
#include <tos_timer.h>
|
||||||
#include <tos_time.h>
|
#include <tos_time.h>
|
||||||
#include <tos_mmblk.h>
|
#include <tos_mmblk.h>
|
||||||
|
151
kernel/core/include/tos_completion.h
Normal file
151
kernel/core/include/tos_completion.h
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Tencent is pleased to support the open source community by making TencentOS
|
||||||
|
* available.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
|
||||||
|
* If you have downloaded a copy of the TencentOS binary from Tencent, please
|
||||||
|
* note that the TencentOS binary is licensed under the BSD 3-Clause License.
|
||||||
|
*
|
||||||
|
* If you have downloaded a copy of the TencentOS source code from Tencent,
|
||||||
|
* please note that TencentOS source code is licensed under the BSD 3-Clause
|
||||||
|
* License, except for the third-party components listed below which are
|
||||||
|
* subject to different license terms. Your integration of TencentOS into your
|
||||||
|
* own projects may require compliance with the BSD 3-Clause License, as well
|
||||||
|
* as the other licenses applicable to the third-party components included
|
||||||
|
* within TencentOS.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef _TOS_COMPLETION_H_
|
||||||
|
#define _TOS_COMPLETION_H_
|
||||||
|
|
||||||
|
#if TOS_CFG_COMPLETION_EN > 0u
|
||||||
|
|
||||||
|
typedef uint16_t completion_done_t;
|
||||||
|
|
||||||
|
typedef struct k_completion_st {
|
||||||
|
pend_obj_t pend_obj;
|
||||||
|
completion_done_t done;
|
||||||
|
} k_completion_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create a completion.
|
||||||
|
* create a completion.
|
||||||
|
*
|
||||||
|
* @attention None
|
||||||
|
*
|
||||||
|
* @param[in] completion pointer to the handler of the completion.
|
||||||
|
*
|
||||||
|
* @return errcode
|
||||||
|
* @retval #K_ERR_NONE return successfully.
|
||||||
|
*/
|
||||||
|
__API__ k_err_t tos_completion_create(k_completion_t *completion);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destroy a completion.
|
||||||
|
* destroy a completion.
|
||||||
|
*
|
||||||
|
* @attention None
|
||||||
|
*
|
||||||
|
* @param[in] completion pointer to the handler of the completion.
|
||||||
|
*
|
||||||
|
* @return errcode
|
||||||
|
* @retval #K_ERR_OBJ_INVALID completion is not a valid pointer to completion
|
||||||
|
* @retval #K_ERR_NONE return successfully.
|
||||||
|
*/
|
||||||
|
__API__ k_err_t tos_completion_destroy(k_completion_t *completion);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Pend a completion.
|
||||||
|
* pend a completion.
|
||||||
|
*
|
||||||
|
* @attention None
|
||||||
|
*
|
||||||
|
* @param[in] completion pointer to the handler of the completion.
|
||||||
|
* @param[in] timeout how much time(in k_tick_t) we would like to wait.
|
||||||
|
*
|
||||||
|
* @return errcode
|
||||||
|
* @retval #K_ERR_PEND_NOWAIT we get nothing, and we don't wanna wait.
|
||||||
|
* @retval #K_ERR_PEND_SCHED_LOCKED we can wait, but scheduler is locked.
|
||||||
|
* @retval #K_ERR_PEND_TIMEOUT the time we wait is up, we get nothing.
|
||||||
|
* @retval #K_ERR_PEND_DESTROY the completion we are pending is destroyed.
|
||||||
|
* @retval #K_ERR_NONE return successfully.
|
||||||
|
*/
|
||||||
|
__API__ k_err_t tos_completion_pend_timed(k_completion_t *completion, k_tick_t timeout);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Pend a completion.
|
||||||
|
* pend a completion.
|
||||||
|
*
|
||||||
|
* @attention None
|
||||||
|
*
|
||||||
|
* @param[in] completion pointer to the handler of the completion.
|
||||||
|
* @param[in] timeout how much time(in k_tick_t) we would like to wait.
|
||||||
|
*
|
||||||
|
* @return errcode
|
||||||
|
* @retval #K_ERR_PEND_NOWAIT we get nothing, and we don't wanna wait.
|
||||||
|
* @retval #K_ERR_PEND_SCHED_LOCKED we can wait, but scheduler is locked.
|
||||||
|
* @retval #K_ERR_PEND_TIMEOUT the time we wait is up, we get nothing.
|
||||||
|
* @retval #K_ERR_PEND_DESTROY the completion we are pending is destroyed.
|
||||||
|
* @retval #K_ERR_NONE return successfully.
|
||||||
|
*/
|
||||||
|
__API__ k_err_t tos_completion_pend(k_completion_t *completion);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Post a completion.
|
||||||
|
* post a completion and wakeup one pending task.
|
||||||
|
*
|
||||||
|
* @attention when tos_completion_post return successfully, only one task who are waitting for the completion will be woken up.
|
||||||
|
*
|
||||||
|
* @param[in] completion pointer to the handler of the completion.
|
||||||
|
*
|
||||||
|
* @return errcode
|
||||||
|
* @retval #K_ERR_COMPLETION_OVERFLOW we are nesting post a completion too much.
|
||||||
|
* @retval #K_ERR_NONE return successfully.
|
||||||
|
*/
|
||||||
|
__API__ k_err_t tos_completion_post(k_completion_t *completion);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Post a completion.
|
||||||
|
* post a completion and wakeup all the pending task.
|
||||||
|
*
|
||||||
|
* @attention when tos_completion_post_all return successfully, all of the tasks who are waitting for the completion will be woken up.
|
||||||
|
*
|
||||||
|
* @param[in] completion pointer to the handler of the completion.
|
||||||
|
*
|
||||||
|
* @return errcode
|
||||||
|
* @retval #K_ERR_COMPLETION_OVERFLOW we are nesting post a completion too much.
|
||||||
|
* @retval #K_ERR_NONE return successfully.
|
||||||
|
*/
|
||||||
|
__API__ k_err_t tos_completion_post_all(k_completion_t *completion);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reset a completion.
|
||||||
|
* reset a completion to un-done.
|
||||||
|
*
|
||||||
|
* @attention None.
|
||||||
|
*
|
||||||
|
* @param[in] completion pointer to the handler of the completion.
|
||||||
|
*
|
||||||
|
* @return errcode
|
||||||
|
* @retval #K_ERR_NONE return successfully.
|
||||||
|
*/
|
||||||
|
__API__ k_err_t tos_completion_reset(k_completion_t *completion);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Test whether a completion is done.
|
||||||
|
* test whether a completion is done.
|
||||||
|
*
|
||||||
|
* @attention None
|
||||||
|
*
|
||||||
|
* @param[in] completion pointer to the handler of the completion.
|
||||||
|
*
|
||||||
|
* @return whether a completion is done
|
||||||
|
* @retval K_TRUE the completion is done.
|
||||||
|
* @retval K_FALSE the completion is not done.
|
||||||
|
*/
|
||||||
|
__API__ int tos_completion_is_done(k_completion_t *completion);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@@ -69,6 +69,24 @@
|
|||||||
/////////////////////////////////////////
|
/////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////
|
||||||
|
// disable countdownlatch
|
||||||
|
#ifdef TOS_CFG_COUNTDOWNLATCH_EN
|
||||||
|
#undef TOS_CFG_COUNTDOWNLATCH_EN
|
||||||
|
#endif
|
||||||
|
#define TOS_CFG_COUNTDOWNLATCH_EN 0u
|
||||||
|
/////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////
|
||||||
|
// disable completion
|
||||||
|
#ifdef TOS_CFG_COMPLETION_EN
|
||||||
|
#undef TOS_CFG_COMPLETION_EN
|
||||||
|
#endif
|
||||||
|
#define TOS_CFG_COMPLETION_EN 0u
|
||||||
|
/////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////
|
/////////////////////////////////////////
|
||||||
// disable the "traditional" timer
|
// disable the "traditional" timer
|
||||||
#ifdef TOS_CFG_TIMER_EN
|
#ifdef TOS_CFG_TIMER_EN
|
||||||
@@ -172,6 +190,14 @@
|
|||||||
#define TOS_CFG_SEM_EN 0u
|
#define TOS_CFG_SEM_EN 0u
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef TOS_CFG_COUNTDOWNLATCH_EN
|
||||||
|
#define TOS_CFG_COUNTDOWNLATCH_EN 0u
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TOS_CFG_COMPLETION_EN
|
||||||
|
#define TOS_CFG_COMPLETION_EN 0u
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef TOS_CFG_MMHEAP_EN
|
#ifndef TOS_CFG_MMHEAP_EN
|
||||||
#define TOS_CFG_MMHEAP_EN 0u
|
#define TOS_CFG_MMHEAP_EN 0u
|
||||||
#endif
|
#endif
|
||||||
|
116
kernel/core/include/tos_countdownlatch.h
Normal file
116
kernel/core/include/tos_countdownlatch.h
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Tencent is pleased to support the open source community by making TencentOS
|
||||||
|
* available.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
|
||||||
|
* If you have downloaded a copy of the TencentOS binary from Tencent, please
|
||||||
|
* note that the TencentOS binary is licensed under the BSD 3-Clause License.
|
||||||
|
*
|
||||||
|
* If you have downloaded a copy of the TencentOS source code from Tencent,
|
||||||
|
* please note that TencentOS source code is licensed under the BSD 3-Clause
|
||||||
|
* License, except for the third-party components listed below which are
|
||||||
|
* subject to different license terms. Your integration of TencentOS into your
|
||||||
|
* own projects may require compliance with the BSD 3-Clause License, as well
|
||||||
|
* as the other licenses applicable to the third-party components included
|
||||||
|
* within TencentOS.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef _TOS_COUNTDOWNLATCH_H_
|
||||||
|
#define _TOS_COUNTDOWNLATCH_H_
|
||||||
|
|
||||||
|
#if TOS_CFG_COUNTDOWNLATCH_EN > 0u
|
||||||
|
|
||||||
|
typedef struct k_countdownlatch_st {
|
||||||
|
pend_obj_t pend_obj;
|
||||||
|
k_countdownlatch_cnt_t count;
|
||||||
|
} k_countdownlatch_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create a countdown-latch.
|
||||||
|
* create a countdown latch.
|
||||||
|
*
|
||||||
|
* @attention the count is how many posts have been done the pender would wakeup.
|
||||||
|
*
|
||||||
|
* @param[in] countdownlatch pointer to the handler of the countdown-latch.
|
||||||
|
* @param[in] count the count to wait of the countdown-latch.
|
||||||
|
*
|
||||||
|
* @return errcode
|
||||||
|
* @retval #K_ERR_NONE return successfully.
|
||||||
|
*/
|
||||||
|
__API__ k_err_t tos_countdownlatch_create(k_countdownlatch_t *countdownlatch, k_countdownlatch_cnt_t count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destroy a countdown-latch.
|
||||||
|
* destroy a countdown-latch.
|
||||||
|
*
|
||||||
|
* @attention None
|
||||||
|
*
|
||||||
|
* @param[in] countdownlatch pointer to the handler of the countdown-latch.
|
||||||
|
*
|
||||||
|
* @return errcode
|
||||||
|
* @retval #K_ERR_NONE return successfully.
|
||||||
|
*/
|
||||||
|
__API__ k_err_t tos_countdownlatch_destroy(k_countdownlatch_t *countdownlatch);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Pend a countdown-latch.
|
||||||
|
* pend a countdown-latch.
|
||||||
|
*
|
||||||
|
* @attention The task will keep blocked until the countdown-latch is obtained or a timeout comes.
|
||||||
|
*
|
||||||
|
* @param[in] countdownlatch pointer to the handler of the countdown-latch.
|
||||||
|
* @param[in] timeout how much time(in k_tick_t) we would like to wait.
|
||||||
|
*
|
||||||
|
* @return errcode
|
||||||
|
* @retval #K_ERR_PEND_NOWAIT we get nothing, and we don't wanna wait.
|
||||||
|
* @retval #K_ERR_PEND_SCHED_LOCKED we can wait, but scheduler is locked.
|
||||||
|
* @retval #K_ERR_PEND_TIMEOUT the time we wait is up, we get nothing.
|
||||||
|
* @retval #K_ERR_NONE return successfully.
|
||||||
|
*/
|
||||||
|
__API__ k_err_t tos_countdownlatch_pend_timed(k_countdownlatch_t *countdownlatch, k_tick_t timeout);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Pend a countdown-latch.
|
||||||
|
* pend a countdown latch.
|
||||||
|
*
|
||||||
|
* @attention until (countdownlatch->count) of tasks have done the post, the pender would wake up.
|
||||||
|
*
|
||||||
|
* @param[in] countdownlatch pointer to the handler of the countdown-latch.
|
||||||
|
*
|
||||||
|
* @return errcode
|
||||||
|
* @retval #K_ERR_PEND_SCHED_LOCKED the schedule is locked.
|
||||||
|
* @retval #K_ERR_NONE return successfully.
|
||||||
|
*/
|
||||||
|
__API__ k_err_t tos_countdownlatch_pend(k_countdownlatch_t *countdownlatch);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Post a countdown-latch.
|
||||||
|
* post a countdown-latch.
|
||||||
|
*
|
||||||
|
* @attention until (countdownlatch->count) of tasks have done the post, the pender would wake up.
|
||||||
|
*
|
||||||
|
* @param[in] countdownlatch pointer to the handler of the countdown-latch.
|
||||||
|
*
|
||||||
|
* @return errcode
|
||||||
|
* @retval #K_ERR_COUNTDOWNLATCH_OVERFLOW we are posting the countdown-latch too much.
|
||||||
|
* @retval #K_ERR_NONE return successfully.
|
||||||
|
*/
|
||||||
|
__API__ k_err_t tos_countdownlatch_post(k_countdownlatch_t *countdownlatch);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reset a countdown-latch.
|
||||||
|
* reset a countdown-latch's count.
|
||||||
|
*
|
||||||
|
* @attention None.
|
||||||
|
*
|
||||||
|
* @param[in] countdownlatch pointer to the handler of the countdown-latch.
|
||||||
|
*
|
||||||
|
* @return errcode
|
||||||
|
* @retval #K_ERR_NONE return successfully.
|
||||||
|
*/
|
||||||
|
__API__ k_err_t tos_countdownlatch_reset(k_countdownlatch_t *countdownlatch, k_countdownlatch_cnt_t count);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@@ -21,6 +21,10 @@
|
|||||||
typedef enum k_err_en {
|
typedef enum k_err_en {
|
||||||
K_ERR_NONE = 0u,
|
K_ERR_NONE = 0u,
|
||||||
|
|
||||||
|
K_ERR_COMPLETION_OVERFLOW = 25u,
|
||||||
|
|
||||||
|
K_ERR_COUNTDOWNLATCH_OVERFLOW = 50u,
|
||||||
|
|
||||||
K_ERR_DELAY_ZERO = 100u,
|
K_ERR_DELAY_ZERO = 100u,
|
||||||
K_ERR_DELAY_FOREVER,
|
K_ERR_DELAY_FOREVER,
|
||||||
|
|
||||||
|
@@ -29,6 +29,7 @@ typedef uint8_t k_nesting_t;
|
|||||||
typedef uint16_t k_opt_t;
|
typedef uint16_t k_opt_t;
|
||||||
typedef uint16_t k_sem_cnt_t;
|
typedef uint16_t k_sem_cnt_t;
|
||||||
typedef uint32_t k_event_flag_t;
|
typedef uint32_t k_event_flag_t;
|
||||||
|
typedef uint16_t k_countdownlatch_cnt_t;
|
||||||
|
|
||||||
typedef uint32_t k_time_t;
|
typedef uint32_t k_time_t;
|
||||||
typedef uint32_t k_timeslice_t;
|
typedef uint32_t k_timeslice_t;
|
||||||
|
@@ -25,7 +25,7 @@ typedef struct k_mutex_st {
|
|||||||
k_nesting_t pend_nesting;
|
k_nesting_t pend_nesting;
|
||||||
k_task_t *owner;
|
k_task_t *owner;
|
||||||
k_prio_t owner_orig_prio;
|
k_prio_t owner_orig_prio;
|
||||||
k_list_t owner_list;
|
k_list_t owner_anchor;
|
||||||
} k_mutex_t;
|
} k_mutex_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -42,6 +42,8 @@ typedef enum pend_type_en {
|
|||||||
PEND_TYPE_MUTEX = 0x2BEE,
|
PEND_TYPE_MUTEX = 0x2BEE,
|
||||||
PEND_TYPE_EVENT = 0x3BEE,
|
PEND_TYPE_EVENT = 0x3BEE,
|
||||||
PEND_TYPE_QUEUE = 0x4BEE,
|
PEND_TYPE_QUEUE = 0x4BEE,
|
||||||
|
PEND_TYPE_COUNTDOWNLATCH = 0x5BEE,
|
||||||
|
PEND_TYPE_COMPLETION = 0x6BEE,
|
||||||
} pend_type_t;
|
} pend_type_t;
|
||||||
|
|
||||||
typedef enum opt_post_en {
|
typedef enum opt_post_en {
|
||||||
@@ -62,7 +64,9 @@ __KERNEL__ int pend_object_verify(pend_obj_t *object, pend_type_t type);
|
|||||||
|
|
||||||
__KERNEL__ int pend_is_nopending(pend_obj_t *object);
|
__KERNEL__ int pend_is_nopending(pend_obj_t *object);
|
||||||
|
|
||||||
__KERNEL__ k_prio_t pend_highest_prio_get(pend_obj_t *object);
|
__KERNEL__ k_prio_t pend_highest_pending_prio_get(pend_obj_t *object);
|
||||||
|
|
||||||
|
__KERNEL__ k_task_t *pend_highest_pending_task_get(pend_obj_t *object);
|
||||||
|
|
||||||
__KERNEL__ void pend_list_remove(k_task_t *task);
|
__KERNEL__ void pend_list_remove(k_task_t *task);
|
||||||
|
|
||||||
|
189
kernel/core/tos_completion.c
Normal file
189
kernel/core/tos_completion.c
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Tencent is pleased to support the open source community by making TencentOS
|
||||||
|
* available.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
|
||||||
|
* If you have downloaded a copy of the TencentOS binary from Tencent, please
|
||||||
|
* note that the TencentOS binary is licensed under the BSD 3-Clause License.
|
||||||
|
*
|
||||||
|
* If you have downloaded a copy of the TencentOS source code from Tencent,
|
||||||
|
* please note that TencentOS source code is licensed under the BSD 3-Clause
|
||||||
|
* License, except for the third-party components listed below which are
|
||||||
|
* subject to different license terms. Your integration of TencentOS into your
|
||||||
|
* own projects may require compliance with the BSD 3-Clause License, as well
|
||||||
|
* as the other licenses applicable to the third-party components included
|
||||||
|
* within TencentOS.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "tos.h"
|
||||||
|
|
||||||
|
#if TOS_CFG_COMPLETION_EN > 0u
|
||||||
|
|
||||||
|
__API__ k_err_t tos_completion_create(k_completion_t *completion)
|
||||||
|
{
|
||||||
|
TOS_PTR_SANITY_CHECK(completion);
|
||||||
|
|
||||||
|
pend_object_init(&completion->pend_obj, PEND_TYPE_COMPLETION);
|
||||||
|
completion->done = (completion_done_t)0u;
|
||||||
|
|
||||||
|
return K_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
__API__ k_err_t tos_completion_destroy(k_completion_t *completion)
|
||||||
|
{
|
||||||
|
TOS_CPU_CPSR_ALLOC();
|
||||||
|
|
||||||
|
TOS_PTR_SANITY_CHECK(completion);
|
||||||
|
|
||||||
|
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||||
|
if (!pend_object_verify(&completion->pend_obj, PEND_TYPE_COMPLETION)) {
|
||||||
|
return K_ERR_OBJ_INVALID;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TOS_CPU_INT_DISABLE();
|
||||||
|
|
||||||
|
if (!pend_is_nopending(&completion->pend_obj)) {
|
||||||
|
pend_wakeup_all(&completion->pend_obj, PEND_STATE_DESTROY);
|
||||||
|
}
|
||||||
|
|
||||||
|
pend_object_deinit(&completion->pend_obj);
|
||||||
|
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
knl_sched();
|
||||||
|
|
||||||
|
return K_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
__API__ k_err_t tos_completion_pend_timed(k_completion_t *completion, k_tick_t timeout)
|
||||||
|
{
|
||||||
|
TOS_CPU_CPSR_ALLOC();
|
||||||
|
|
||||||
|
TOS_PTR_SANITY_CHECK(completion);
|
||||||
|
|
||||||
|
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||||
|
if (!pend_object_verify(&completion->pend_obj, PEND_TYPE_COMPLETION)) {
|
||||||
|
return K_ERR_OBJ_INVALID;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TOS_CPU_INT_DISABLE();
|
||||||
|
|
||||||
|
if (completion->done > (completion_done_t)0u) {
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
return K_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timeout == TOS_TIME_NOWAIT) { // no wait, return immediately
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
return K_ERR_PEND_NOWAIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (knl_is_inirq()) {
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
return K_ERR_PEND_IN_IRQ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (knl_is_sched_locked()) {
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
return K_ERR_PEND_SCHED_LOCKED;
|
||||||
|
}
|
||||||
|
|
||||||
|
pend_task_block(k_curr_task, &completion->pend_obj, timeout);
|
||||||
|
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
knl_sched();
|
||||||
|
|
||||||
|
return pend_state2errno(k_curr_task->pend_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
__API__ k_err_t tos_completion_pend(k_completion_t *completion)
|
||||||
|
{
|
||||||
|
return tos_completion_pend_timed(completion, TOS_TIME_FOREVER);
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC__ k_err_t completion_do_post(k_completion_t *completion, opt_post_t opt)
|
||||||
|
{
|
||||||
|
TOS_CPU_CPSR_ALLOC();
|
||||||
|
|
||||||
|
TOS_PTR_SANITY_CHECK(completion);
|
||||||
|
|
||||||
|
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||||
|
if (!pend_object_verify(&completion->pend_obj, PEND_TYPE_COMPLETION)) {
|
||||||
|
return K_ERR_OBJ_INVALID;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TOS_CPU_INT_DISABLE();
|
||||||
|
|
||||||
|
if (completion->done == (completion_done_t)-1) {
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
return K_ERR_COMPLETION_OVERFLOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
++completion->done;
|
||||||
|
|
||||||
|
if (pend_is_nopending(&completion->pend_obj)) {
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
return K_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pend_wakeup(&completion->pend_obj, PEND_STATE_POST, opt);
|
||||||
|
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
knl_sched();
|
||||||
|
|
||||||
|
return K_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
__API__ k_err_t tos_completion_post(k_completion_t *completion)
|
||||||
|
{
|
||||||
|
return completion_do_post(completion, OPT_POST_ONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
__API__ k_err_t tos_completion_post_all(k_completion_t *completion)
|
||||||
|
{
|
||||||
|
return completion_do_post(completion, OPT_POST_ALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
__API__ k_err_t tos_completion_reset(k_completion_t *completion)
|
||||||
|
{
|
||||||
|
TOS_CPU_CPSR_ALLOC();
|
||||||
|
|
||||||
|
TOS_PTR_SANITY_CHECK(completion);
|
||||||
|
|
||||||
|
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||||
|
if (!pend_object_verify(&completion->pend_obj, PEND_TYPE_COMPLETION)) {
|
||||||
|
return K_ERR_OBJ_INVALID;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TOS_CPU_INT_DISABLE();
|
||||||
|
completion->done = (completion_done_t)0u;
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
|
||||||
|
return K_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
__API__ int tos_completion_is_done(k_completion_t *completion)
|
||||||
|
{
|
||||||
|
TOS_CPU_CPSR_ALLOC();
|
||||||
|
int is_done = K_FALSE;
|
||||||
|
|
||||||
|
TOS_PTR_SANITY_CHECK(completion);
|
||||||
|
|
||||||
|
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||||
|
if (!pend_object_verify(&completion->pend_obj, PEND_TYPE_COMPLETION)) {
|
||||||
|
return K_ERR_OBJ_INVALID;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TOS_CPU_INT_DISABLE();
|
||||||
|
is_done = (completion->done > (completion_done_t)0u ? K_TRUE : K_FALSE);
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
|
||||||
|
return is_done;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
159
kernel/core/tos_countdownlatch.c
Normal file
159
kernel/core/tos_countdownlatch.c
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Tencent is pleased to support the open source community by making TencentOS
|
||||||
|
* available.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
|
||||||
|
* If you have downloaded a copy of the TencentOS binary from Tencent, please
|
||||||
|
* note that the TencentOS binary is licensed under the BSD 3-Clause License.
|
||||||
|
*
|
||||||
|
* If you have downloaded a copy of the TencentOS source code from Tencent,
|
||||||
|
* please note that TencentOS source code is licensed under the BSD 3-Clause
|
||||||
|
* License, except for the third-party components listed below which are
|
||||||
|
* subject to different license terms. Your integration of TencentOS into your
|
||||||
|
* own projects may require compliance with the BSD 3-Clause License, as well
|
||||||
|
* as the other licenses applicable to the third-party components included
|
||||||
|
* within TencentOS.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "tos.h"
|
||||||
|
|
||||||
|
#if TOS_CFG_COUNTDOWNLATCH_EN > 0u
|
||||||
|
|
||||||
|
__API__ k_err_t tos_countdownlatch_create(k_countdownlatch_t *countdownlatch, k_countdownlatch_cnt_t count)
|
||||||
|
{
|
||||||
|
TOS_PTR_SANITY_CHECK(countdownlatch);
|
||||||
|
|
||||||
|
pend_object_init(&countdownlatch->pend_obj, PEND_TYPE_COUNTDOWNLATCH);
|
||||||
|
countdownlatch->count = count;
|
||||||
|
|
||||||
|
return K_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
__API__ k_err_t tos_countdownlatch_destroy(k_countdownlatch_t *countdownlatch)
|
||||||
|
{
|
||||||
|
TOS_CPU_CPSR_ALLOC();
|
||||||
|
|
||||||
|
TOS_PTR_SANITY_CHECK(countdownlatch);
|
||||||
|
|
||||||
|
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||||
|
if (!pend_object_verify(&countdownlatch->pend_obj, PEND_TYPE_COUNTDOWNLATCH)) {
|
||||||
|
return K_ERR_OBJ_INVALID;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TOS_CPU_INT_DISABLE();
|
||||||
|
|
||||||
|
if (!pend_is_nopending(&countdownlatch->pend_obj)) {
|
||||||
|
pend_wakeup_all(&countdownlatch->pend_obj, PEND_STATE_DESTROY);
|
||||||
|
}
|
||||||
|
|
||||||
|
pend_object_deinit(&countdownlatch->pend_obj);
|
||||||
|
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
knl_sched();
|
||||||
|
|
||||||
|
return K_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
__API__ k_err_t tos_countdownlatch_pend_timed(k_countdownlatch_t *countdownlatch, k_tick_t timeout)
|
||||||
|
{
|
||||||
|
TOS_CPU_CPSR_ALLOC();
|
||||||
|
|
||||||
|
TOS_PTR_SANITY_CHECK(countdownlatch);
|
||||||
|
|
||||||
|
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||||
|
if (!pend_object_verify(&countdownlatch->pend_obj, PEND_TYPE_COUNTDOWNLATCH)) {
|
||||||
|
return K_ERR_OBJ_INVALID;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TOS_CPU_INT_DISABLE();
|
||||||
|
|
||||||
|
if (countdownlatch->count == (k_countdownlatch_cnt_t)0u) {
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
return K_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timeout == TOS_TIME_NOWAIT) { // no wait, return immediately
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
return K_ERR_PEND_NOWAIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (knl_is_inirq()) {
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
return K_ERR_PEND_IN_IRQ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (knl_is_sched_locked()) {
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
return K_ERR_PEND_SCHED_LOCKED;
|
||||||
|
}
|
||||||
|
|
||||||
|
pend_task_block(k_curr_task, &countdownlatch->pend_obj, timeout);
|
||||||
|
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
knl_sched();
|
||||||
|
|
||||||
|
return pend_state2errno(k_curr_task->pend_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
__API__ k_err_t tos_countdownlatch_pend(k_countdownlatch_t *countdownlatch)
|
||||||
|
{
|
||||||
|
return tos_countdownlatch_pend_timed(countdownlatch, TOS_TIME_FOREVER);
|
||||||
|
}
|
||||||
|
|
||||||
|
__API__ k_err_t tos_countdownlatch_post(k_countdownlatch_t *countdownlatch)
|
||||||
|
{
|
||||||
|
TOS_CPU_CPSR_ALLOC();
|
||||||
|
|
||||||
|
TOS_PTR_SANITY_CHECK(countdownlatch);
|
||||||
|
|
||||||
|
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||||
|
if (!pend_object_verify(&countdownlatch->pend_obj, PEND_TYPE_COUNTDOWNLATCH)) {
|
||||||
|
return K_ERR_OBJ_INVALID;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TOS_CPU_INT_DISABLE();
|
||||||
|
|
||||||
|
if (countdownlatch->count == (k_countdownlatch_cnt_t)0) {
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
return K_ERR_COUNTDOWNLATCH_OVERFLOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
--countdownlatch->count;
|
||||||
|
|
||||||
|
if (countdownlatch->count > (k_countdownlatch_cnt_t)0) {
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
return K_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pend_wakeup_one(&countdownlatch->pend_obj, PEND_STATE_POST);
|
||||||
|
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
knl_sched();
|
||||||
|
|
||||||
|
return K_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
__API__ k_err_t tos_countdownlatch_reset(k_countdownlatch_t *countdownlatch, k_countdownlatch_cnt_t count)
|
||||||
|
{
|
||||||
|
TOS_CPU_CPSR_ALLOC();
|
||||||
|
|
||||||
|
TOS_PTR_SANITY_CHECK(countdownlatch);
|
||||||
|
|
||||||
|
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
|
||||||
|
if (!pend_object_verify(&countdownlatch->pend_obj, PEND_TYPE_COUNTDOWNLATCH)) {
|
||||||
|
return K_ERR_OBJ_INVALID;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TOS_CPU_INT_DISABLE();
|
||||||
|
countdownlatch->count = count;
|
||||||
|
TOS_CPU_INT_ENABLE();
|
||||||
|
|
||||||
|
return K_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@@ -25,8 +25,9 @@ __STATIC_INLINE__ void mutex_old_owner_release(k_mutex_t *mutex)
|
|||||||
|
|
||||||
owner = mutex->owner;
|
owner = mutex->owner;
|
||||||
|
|
||||||
tos_list_del(&mutex->owner_list);
|
tos_list_del(&mutex->owner_anchor);
|
||||||
mutex->owner = K_NULL;
|
mutex->owner = K_NULL;
|
||||||
|
mutex->pend_nesting = (k_nesting_t)0u;
|
||||||
|
|
||||||
// the right time comes! let's do it!
|
// the right time comes! let's do it!
|
||||||
if (owner->prio_pending != K_TASK_PRIO_INVALID) {
|
if (owner->prio_pending != K_TASK_PRIO_INVALID) {
|
||||||
@@ -40,11 +41,11 @@ __STATIC_INLINE__ void mutex_old_owner_release(k_mutex_t *mutex)
|
|||||||
|
|
||||||
__STATIC_INLINE__ void mutex_fresh_owner_mark(k_mutex_t *mutex, k_task_t *task)
|
__STATIC_INLINE__ void mutex_fresh_owner_mark(k_mutex_t *mutex, k_task_t *task)
|
||||||
{
|
{
|
||||||
mutex->pend_nesting = (k_nesting_t)1u;
|
|
||||||
mutex->owner = task;
|
mutex->owner = task;
|
||||||
mutex->owner_orig_prio = task->prio;
|
mutex->owner_orig_prio = task->prio;
|
||||||
|
mutex->pend_nesting = (k_nesting_t)1u;
|
||||||
|
|
||||||
tos_list_add(&mutex->owner_list, &task->mutex_own_list);
|
tos_list_add(&mutex->owner_anchor, &task->mutex_own_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
__STATIC_INLINE__ void mutex_new_owner_mark(k_mutex_t *mutex, k_task_t *task)
|
__STATIC_INLINE__ void mutex_new_owner_mark(k_mutex_t *mutex, k_task_t *task)
|
||||||
@@ -54,7 +55,7 @@ __STATIC_INLINE__ void mutex_new_owner_mark(k_mutex_t *mutex, k_task_t *task)
|
|||||||
mutex_fresh_owner_mark(mutex, task);
|
mutex_fresh_owner_mark(mutex, task);
|
||||||
|
|
||||||
// we own the mutex now, make sure our priority is higher than any one in the pend list.
|
// we own the mutex now, make sure our priority is higher than any one in the pend list.
|
||||||
highest_pending_prio = pend_highest_prio_get(&mutex->pend_obj);
|
highest_pending_prio = pend_highest_pending_prio_get(&mutex->pend_obj);
|
||||||
if (task->prio > highest_pending_prio) {
|
if (task->prio > highest_pending_prio) {
|
||||||
tos_task_prio_change(task, highest_pending_prio);
|
tos_task_prio_change(task, highest_pending_prio);
|
||||||
}
|
}
|
||||||
@@ -76,7 +77,7 @@ __API__ k_err_t tos_mutex_create(k_mutex_t *mutex)
|
|||||||
mutex->pend_nesting = (k_nesting_t)0u;
|
mutex->pend_nesting = (k_nesting_t)0u;
|
||||||
mutex->owner = K_NULL;
|
mutex->owner = K_NULL;
|
||||||
mutex->owner_orig_prio = K_TASK_PRIO_INVALID;
|
mutex->owner_orig_prio = K_TASK_PRIO_INVALID;
|
||||||
tos_list_init(&mutex->owner_list);
|
tos_list_init(&mutex->owner_anchor);
|
||||||
|
|
||||||
return K_ERR_NONE;
|
return K_ERR_NONE;
|
||||||
}
|
}
|
||||||
@@ -101,7 +102,6 @@ __API__ k_err_t tos_mutex_destroy(k_mutex_t *mutex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pend_object_deinit(&mutex->pend_obj);
|
pend_object_deinit(&mutex->pend_obj);
|
||||||
mutex->pend_nesting = (k_nesting_t)0u;
|
|
||||||
|
|
||||||
if (mutex->owner) {
|
if (mutex->owner) {
|
||||||
mutex_old_owner_release(mutex);
|
mutex_old_owner_release(mutex);
|
||||||
@@ -116,7 +116,6 @@ __API__ k_err_t tos_mutex_destroy(k_mutex_t *mutex)
|
|||||||
__API__ k_err_t tos_mutex_pend_timed(k_mutex_t *mutex, k_tick_t timeout)
|
__API__ k_err_t tos_mutex_pend_timed(k_mutex_t *mutex, k_tick_t timeout)
|
||||||
{
|
{
|
||||||
TOS_CPU_CPSR_ALLOC();
|
TOS_CPU_CPSR_ALLOC();
|
||||||
k_err_t err;
|
|
||||||
|
|
||||||
TOS_PTR_SANITY_CHECK(mutex);
|
TOS_PTR_SANITY_CHECK(mutex);
|
||||||
TOS_IN_IRQ_CHECK();
|
TOS_IN_IRQ_CHECK();
|
||||||
@@ -166,16 +165,7 @@ __API__ k_err_t tos_mutex_pend_timed(k_mutex_t *mutex, k_tick_t timeout)
|
|||||||
TOS_CPU_INT_ENABLE();
|
TOS_CPU_INT_ENABLE();
|
||||||
knl_sched();
|
knl_sched();
|
||||||
|
|
||||||
err = pend_state2errno(k_curr_task->pend_state);
|
return pend_state2errno(k_curr_task->pend_state);
|
||||||
|
|
||||||
if (err == K_ERR_NONE) {
|
|
||||||
// good, we are the owner now.
|
|
||||||
TOS_CPU_INT_DISABLE();
|
|
||||||
mutex_new_owner_mark(mutex, k_curr_task);
|
|
||||||
TOS_CPU_INT_ENABLE();
|
|
||||||
}
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
__API__ k_err_t tos_mutex_pend(k_mutex_t *mutex)
|
__API__ k_err_t tos_mutex_pend(k_mutex_t *mutex)
|
||||||
@@ -186,6 +176,7 @@ __API__ k_err_t tos_mutex_pend(k_mutex_t *mutex)
|
|||||||
__API__ k_err_t tos_mutex_post(k_mutex_t *mutex)
|
__API__ k_err_t tos_mutex_post(k_mutex_t *mutex)
|
||||||
{
|
{
|
||||||
TOS_CPU_CPSR_ALLOC();
|
TOS_CPU_CPSR_ALLOC();
|
||||||
|
k_task_t *pending_task;
|
||||||
|
|
||||||
TOS_PTR_SANITY_CHECK(mutex);
|
TOS_PTR_SANITY_CHECK(mutex);
|
||||||
TOS_IN_IRQ_CHECK();
|
TOS_IN_IRQ_CHECK();
|
||||||
@@ -215,6 +206,14 @@ __API__ k_err_t tos_mutex_post(k_mutex_t *mutex)
|
|||||||
return K_ERR_NONE;
|
return K_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* must do the mutex owner switch right here
|
||||||
|
if the pender don't get a chance to schedule, the poster(old owner) may obtain the mutex immediately again
|
||||||
|
but the pender already get ready(already in the critical section).
|
||||||
|
we switch the owner right here to avoid the old owner obtain the mutex again
|
||||||
|
*/
|
||||||
|
pending_task = pend_highest_pending_task_get(&mutex->pend_obj);
|
||||||
|
mutex_new_owner_mark(mutex, pending_task);
|
||||||
|
|
||||||
pend_wakeup_one(&mutex->pend_obj, PEND_STATE_POST);
|
pend_wakeup_one(&mutex->pend_obj, PEND_STATE_POST);
|
||||||
TOS_CPU_INT_ENABLE();
|
TOS_CPU_INT_ENABLE();
|
||||||
knl_sched();
|
knl_sched();
|
||||||
|
@@ -39,7 +39,7 @@ __STATIC__ void pend_list_add(k_task_t *task, pend_obj_t *pend_obj)
|
|||||||
task_state_set_pend(task);
|
task_state_set_pend(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
__KERNEL__ k_prio_t pend_highest_prio_get(pend_obj_t *object)
|
__KERNEL__ k_prio_t pend_highest_pending_prio_get(pend_obj_t *object)
|
||||||
{
|
{
|
||||||
k_task_t *task;
|
k_task_t *task;
|
||||||
|
|
||||||
@@ -48,6 +48,11 @@ __KERNEL__ k_prio_t pend_highest_prio_get(pend_obj_t *object)
|
|||||||
return task ? task->prio : K_TASK_PRIO_INVALID;
|
return task ? task->prio : K_TASK_PRIO_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__KERNEL__ k_task_t *pend_highest_pending_task_get(pend_obj_t *object)
|
||||||
|
{
|
||||||
|
return TOS_LIST_FIRST_ENTRY(&object->list, k_task_t, pend_list);
|
||||||
|
}
|
||||||
|
|
||||||
__KERNEL__ void pend_list_remove(k_task_t *task)
|
__KERNEL__ void pend_list_remove(k_task_t *task)
|
||||||
{
|
{
|
||||||
tos_list_del(&task->pend_list);
|
tos_list_del(&task->pend_list);
|
||||||
|
@@ -78,8 +78,7 @@ __KERNEL__ k_task_t *readyqueue_highest_ready_task_get(void)
|
|||||||
k_list_t *task_list;
|
k_list_t *task_list;
|
||||||
|
|
||||||
task_list = &k_rdyq.task_list_head[k_rdyq.highest_prio];
|
task_list = &k_rdyq.task_list_head[k_rdyq.highest_prio];
|
||||||
k_task_t *fuck = TOS_LIST_FIRST_ENTRY(task_list, k_task_t, pend_list);
|
return TOS_LIST_FIRST_ENTRY(task_list, k_task_t, pend_list);
|
||||||
return fuck;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
__KERNEL__ void readyqueue_init(void)
|
__KERNEL__ void readyqueue_init(void)
|
||||||
|
@@ -53,8 +53,8 @@ __STATIC__ k_prio_t task_highest_pending_prio_get(k_task_t *task)
|
|||||||
k_prio_t prio, highest_prio_pending = K_TASK_PRIO_INVALID;
|
k_prio_t prio, highest_prio_pending = K_TASK_PRIO_INVALID;
|
||||||
|
|
||||||
TOS_LIST_FOR_EACH(curr, &task->mutex_own_list) {
|
TOS_LIST_FOR_EACH(curr, &task->mutex_own_list) {
|
||||||
mutex = TOS_LIST_ENTRY(curr, k_mutex_t, owner_list);
|
mutex = TOS_LIST_ENTRY(curr, k_mutex_t, owner_anchor);
|
||||||
prio = pend_highest_prio_get(&mutex->pend_obj);
|
prio = pend_highest_pending_prio_get(&mutex->pend_obj);
|
||||||
if (prio < highest_prio_pending) {
|
if (prio < highest_prio_pending) {
|
||||||
highest_prio_pending = prio;
|
highest_prio_pending = prio;
|
||||||
}
|
}
|
||||||
@@ -67,7 +67,7 @@ __STATIC__ void task_mutex_release(k_task_t *task)
|
|||||||
k_list_t *curr, *next;
|
k_list_t *curr, *next;
|
||||||
|
|
||||||
TOS_LIST_FOR_EACH_SAFE(curr, next, &task->mutex_own_list) {
|
TOS_LIST_FOR_EACH_SAFE(curr, next, &task->mutex_own_list) {
|
||||||
mutex_release(TOS_LIST_ENTRY(curr, k_mutex_t, owner_list));
|
mutex_release(TOS_LIST_ENTRY(curr, k_mutex_t, owner_anchor));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -358,6 +358,7 @@ __API__ k_err_t tos_task_delay(k_tick_t delay)
|
|||||||
|
|
||||||
if (tick_list_add(k_curr_task, delay) != K_ERR_NONE) {
|
if (tick_list_add(k_curr_task, delay) != K_ERR_NONE) {
|
||||||
TOS_CPU_INT_ENABLE();
|
TOS_CPU_INT_ENABLE();
|
||||||
|
// if you wanna delay your task forever, why don't just suspend?
|
||||||
return K_ERR_DELAY_FOREVER;
|
return K_ERR_DELAY_FOREVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -113,6 +113,7 @@ __API__ k_err_t tos_timer_create(k_timer_t *tmr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (opt == TOS_OPT_TIMER_ONESHOT && delay == (k_tick_t)0u) {
|
if (opt == TOS_OPT_TIMER_ONESHOT && delay == (k_tick_t)0u) {
|
||||||
|
// if you create a oneshot timer and delay 0 to trigger, why don't just call the timer_callback?
|
||||||
return K_ERR_TIMER_INVALID_DELAY;
|
return K_ERR_TIMER_INVALID_DELAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user