diff --git a/board/Linux_Posix/hello_world/CMakeLists.txt b/board/Linux_Posix/hello_world/CMakeLists.txt new file mode 100644 index 00000000..87905723 --- /dev/null +++ b/board/Linux_Posix/hello_world/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.8) + +project(hello_world) + +set(CMAKE_BUILD_TYPE "Debug") +set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb") +set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall") + +set(TINY_ROOT ../../../) + +include_directories(${TINY_ROOT}/osal/cmsis_os) +include_directories(${TINY_ROOT}/kernel/core/include) +include_directories(${TINY_ROOT}/kernel/evtdrv/include) +include_directories(${TINY_ROOT}/kernel/hal/include) +include_directories(${TINY_ROOT}/kernel/pm/include) + +set(CMSIS_SRCS ${TINY_ROOT}/osal/cmsis_os/cmsis_os.c) +aux_source_directory(${TINY_ROOT}/kernel/core CORE_SRCS) +aux_source_directory(${TINY_ROOT}/kernel/evtdrv EVTDRV_SRCS) +aux_source_directory(${TINY_ROOT}/kernel/pm PM_SRCS) + +set(ARCH_ROOT ${TINY_ROOT}/arch/linux) + +include_directories(${ARCH_ROOT}/common/include) +include_directories(${ARCH_ROOT}/posix/gcc) + +aux_source_directory(${ARCH_ROOT}/common ARCH_COMMON_SRCS) +aux_source_directory(${ARCH_ROOT}/posix/gcc ARCH_POSIX_SRCS) + +set(ARCH_SRCS ${ARCH_COMMON_SRCS} ${ARCH_POSIX_SRCS}) + +set(TINY_SRCS ${ARCH_SRCS} ${CMSIS_SRCS} ${EVTDRV_SRCS} ${PM_SRCS} ${CORE_SRCS} ) + +include_directories(./) +include_directories(./inc) + +set(APP_SRCS src/main.c) + +add_executable(hello_world ${APP_SRCS} ${TINY_SRCS}) + +target_link_libraries(hello_world pthread) \ No newline at end of file diff --git a/board/Linux_Posix/hello_world/Makefile b/board/Linux_Posix/hello_world/Makefile new file mode 100644 index 00000000..ab86992e --- /dev/null +++ b/board/Linux_Posix/hello_world/Makefile @@ -0,0 +1,50 @@ +################################################################### +#automatic detection QTOP and LOCALDIR +CUR_DIR := $(patsubst %/,%,$(dir $(realpath $(firstword $(MAKEFILE_LIST))))) +TRYQTOP := $(shell if [ -n "$$QTOP" ] ; then\ + echo $$QTOP;\ + else\ + cd $(CUR_DIR); while /usr/bin/test ! -e qmk ; do \ + dir=`cd ../;pwd`; \ + if [ "$$dir" = "/" ] ; then \ + echo Cannot find QTOP in $(firstword $(MAKEFILE_LIST)) 1>&2; \ + exit 1; \ + fi ; \ + cd $$dir; \ + done ; \ + pwd; \ + fi) +QTOP ?= $(realpath ${TRYQTOP}) + +ifeq ($(QTOP),) +$(error Please run this in a tree) +endif +LOCALDIR = $(patsubst %/,%,$(subst $(realpath $(QTOP))/,,$(CUR_DIR))) +export QTOP + +#################################################################### + + +export BP=Linux_Posix + +TREE_LIB_ENABLE=1 +lib= +subdirs = + + +all:: + make -C ${QTOP}/arch BP=${BP} + make -C ${QTOP}/kernel BP=${BP} + make -C ${QTOP}/osal BP=${BP} + make -C ${QTOP}/net BP=${BP} + make -C ${QTOP}/devices BP=${BP} +exec = +LD_A_FILES += $(LIBDIR)/libarch.a +LD_A_FILES += $(LIBDIR)/libkernel.a +LD_A_FILES += $(LIBDIR)/libhello_world.a +LD_A_FILES += $(LIBDIR)/libcmsis_os.a +LDFLAGS += -lpthread + +include ${QTOP}/qmk/generic/Make.exec + + diff --git a/board/Linux_Posix/hello_world/inc/lwipopts.h b/board/Linux_Posix/hello_world/inc/lwipopts.h new file mode 100644 index 00000000..7e9e2522 --- /dev/null +++ b/board/Linux_Posix/hello_world/inc/lwipopts.h @@ -0,0 +1,236 @@ +/** + ****************************************************************************** + * @file lwipopts.h + * @author MCD Application Team + * @version V1.1.0 + * @date 31-July-2013 + * @brief lwIP Options Configuration. + * This file is based on Utilities\lwip_v1.4.1\src\include\lwip\opt.h + * and contains the lwIP configuration for the STM32F4x7 demonstration. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2013 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +#ifndef __LWIPOPTS_H__ +#define __LWIPOPTS_H__ + +/** + * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain + * critical regions during buffer allocation, deallocation and memory + * allocation and deallocation. + */ +#define SYS_LIGHTWEIGHT_PROT 1 + +/** + * NO_SYS==1: Provides VERY minimal functionality. Otherwise, + * use lwIP facilities. + */ +#define NO_SYS 0 + +/** + * NO_SYS_NO_TIMERS==1: Drop support for sys_timeout when NO_SYS==1 + * Mainly for compatibility to old versions. + */ +#define NO_SYS_NO_TIMERS 0 + +/* ---------- Memory options ---------- */ +/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which + lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2 + byte alignment -> define MEM_ALIGNMENT to 2. */ +#define MEM_ALIGNMENT 4 + +/* MEM_SIZE: the size of the heap memory. If the application will send +a lot of data that needs to be copied, this should be set high. */ +#define MEM_SIZE (5 * 1024) + +/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application + sends a lot of data out of ROM (or other static memory), this + should be set high. */ +#define MEMP_NUM_PBUF 25 +/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One + per active UDP "connection". */ +#define MEMP_NUM_UDP_PCB 4 +/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP + connections. */ +#define MEMP_NUM_TCP_PCB 6 +/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP + connections. */ +#define MEMP_NUM_TCP_PCB_LISTEN 6 +/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP + segments. */ +#define MEMP_NUM_TCP_SEG 150 +/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active + timeouts. */ +#define MEMP_NUM_SYS_TIMEOUT 6 + +/* ---------- Pbuf options ---------- */ +/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */ +#define PBUF_POOL_SIZE 25 +/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */ +#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS + 40 + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN) + +/* ---------- TCP options ---------- */ +#define LWIP_TCP 1 +#define TCP_TTL 255 + +/* Controls if TCP should queue segments that arrive out of + order. Define to 0 if your device is low on memory. */ +#define TCP_QUEUE_OOSEQ 0 + +/* TCP Maximum segment size. */ +#define TCP_MSS (1500 - 40) /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */ + +/* TCP sender buffer space (bytes). */ +#define TCP_SND_BUF (7 * TCP_MSS) + +/* TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least + as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */ + +#define TCP_SND_QUEUELEN (8 * TCP_SND_BUF / TCP_MSS) + +/* TCP receive window. */ +#define TCP_WND (9 * TCP_MSS) + +/* ---------- ICMP options ---------- */ +#define LWIP_ICMP 1 + +/* ---------- DHCP options ---------- */ +/* Define LWIP_DHCP to 1 if you want DHCP configuration of + interfaces. DHCP is not implemented in lwIP 0.5.1, however, so + turning this on does currently not work. */ +#define LWIP_DHCP 1 + +/* ---------- UDP options ---------- */ +#define LWIP_UDP 1 +#define UDP_TTL 255 + +/* ---------- Statistics options ---------- */ +#define LWIP_STATS 0 +#define LWIP_PROVIDE_ERRNO 1 + +/* ---------- link callback options ---------- */ +/* LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface + * whenever the link changes (i.e., link down) + */ +#define LWIP_NETIF_LINK_CALLBACK 0 +/* + -------------------------------------- + ---------- Checksum options ---------- + -------------------------------------- +*/ + +/* +The STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums by hardware: + - To use this feature let the following define uncommented. + - To disable it and process by CPU comment the the checksum. +*/ +#define CHECKSUM_BY_HARDWARE +//#undef CHECKSUM_BY_HARDWARE + +#ifdef CHECKSUM_BY_HARDWARE +/* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*/ +#define CHECKSUM_GEN_IP 0 +/* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/ +#define CHECKSUM_GEN_UDP 0 +/* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/ +#define CHECKSUM_GEN_TCP 0 +/* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/ +#define CHECKSUM_CHECK_IP 0 +/* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/ +#define CHECKSUM_CHECK_UDP 0 +/* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/ +#define CHECKSUM_CHECK_TCP 0 +/* CHECKSUM_CHECK_ICMP==0: Check checksums by hardware for incoming ICMP packets.*/ +#define CHECKSUM_GEN_ICMP 0 +#else +/* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.*/ +#define CHECKSUM_GEN_IP 1 +/* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.*/ +#define CHECKSUM_GEN_UDP 1 +/* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.*/ +#define CHECKSUM_GEN_TCP 1 +/* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.*/ +#define CHECKSUM_CHECK_IP 1 +/* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.*/ +#define CHECKSUM_CHECK_UDP 1 +/* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.*/ +#define CHECKSUM_CHECK_TCP 1 +/* CHECKSUM_CHECK_ICMP==1: Check checksums by hardware for incoming ICMP packets.*/ +#define CHECKSUM_GEN_ICMP 1 +#endif + +#define LWIP_TCPIP_CORE_LOCKING 1 + +/* + ---------------------------------------------- + ---------- Sequential layer options ---------- + ---------------------------------------------- +*/ +/** + * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) + */ +#define LWIP_NETCONN 1 + +/* + ------------------------------------ + ---------- Socket options ---------- + ------------------------------------ +*/ +/** + * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) + */ +#define LWIP_SOCKET 1 + +/* + --------------------------------- + ---------- OS options ---------- + --------------------------------- +*/ + +#define DEFAULT_UDP_RECVMBOX_SIZE 10 +#define DEFAULT_TCP_RECVMBOX_SIZE 10 +#define DEFAULT_ACCEPTMBOX_SIZE 10 +#define DEFAULT_THREAD_STACKSIZE 1024 * 2 + +#define TCPIP_THREAD_NAME "lwip" +#define TCPIP_THREAD_STACKSIZE 1024 +#define TCPIP_MBOX_SIZE 10 +#define TCPIP_THREAD_PRIO 1 + +#define LWIP_DNS_API_DECLARE_STRUCTS 1 +#define LWIP_DNS 1 + +/** DNS server IP address */ +#ifndef DNS_SERVER_ADDRESS +#define DNS_SERVER_ADDRESS(ipaddr) (ip4_addr_set_u32(ipaddr, ipaddr_addr("208.67.222.222"))) /* resolver1.opendns.com */ +#endif + +/* + ---------------------------------------- + ---------- Lwip Debug options ---------- + ---------------------------------------- +*/ +#define LWIP_DEBUG 0 + +#define ethernet_with_mac 1 + +#endif /* __LWIPOPTS_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/board/Linux_Posix/hello_world/inc/tos_config.h b/board/Linux_Posix/hello_world/inc/tos_config.h new file mode 100644 index 00000000..4c75d6e4 --- /dev/null +++ b/board/Linux_Posix/hello_world/inc/tos_config.h @@ -0,0 +1,51 @@ +#ifndef _TOS_CONFIG_H_ +#define _TOS_CONFIG_H_ + +#include "stddef.h" +#include "stdint.h" + +#define TOS_CFG_TASK_PRIO_MAX 10u // 配置TencentOS tiny默认支持的最大优先级数量 + +#define TOS_CFG_ROUND_ROBIN_EN 1u // 配置TencentOS tiny的内核是否开启时间片轮转 + +#define TOS_CFG_OBJECT_VERIFY_EN 1u // 配置TencentOS tiny是否校验指针合法 + +#define TOS_CFG_EVENT_EN 1u // TencentOS tiny 事件模块功能宏 + +#define TOS_CFG_MMHEAP_EN 1u // 配置TencentOS tiny是否开启动态内存模块 + +#define TOS_CFG_MMHEAP_POOL_SIZE 0x100 // 配置TencentOS tiny动态内存池大小 + +#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100 // 配置TencentOS tiny动态内存池大小 + +#define TOS_CFG_MUTEX_EN 1u // 配置TencentOS tiny是否开启互斥锁模块 + +#define TOS_CFG_MESSAGE_QUEUE_EN 1u +#define TOS_CFG_MAIL_QUEUE_EN 1u + +#define TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN 1u + +#define TOS_CFG_PRIORITY_MAIL_QUEUE_EN 1u +#define TOS_CFG_TIMER_EN 1u // 配置TencentOS tiny是否开启软件定时器模块 + +#define TOS_CFG_SEM_EN 1u // 配置TencentOS tiny是否开启信号量模块 + +#define TOS_CFG_MMBLK_EN 1u + +#if (TOS_CFG_QUEUE_EN > 0u) +#define TOS_CFG_MSG_EN 1u +#else +#define TOS_CFG_MSG_EN 0u +#endif + +#define TOS_CFG_MSG_POOL_SIZE 10u // 配置TencentOS tiny消息队列大小 + +#define TOS_CFG_IDLE_TASK_STK_SIZE 256u // 配置TencentOS tiny空闲任务栈大小 + +#define TOS_CFG_CPU_TICK_PER_SECOND 1000u // 配置TencentOS tiny的tick频率 + +#define TOS_CFG_CPU_CLOCK 1000000u // 配置TencentOS tiny CPU频率 + +#define TOS_CFG_TIMER_AS_PROC 1u // 配置是否将TIMER配置成函数模式 + +#endif diff --git a/board/Linux_Posix/hello_world/readme.md b/board/Linux_Posix/hello_world/readme.md new file mode 100644 index 00000000..a35c15da --- /dev/null +++ b/board/Linux_Posix/hello_world/readme.md @@ -0,0 +1,36 @@ +# How to run the demo in linux + +## step1 +make sure your develop environment. ++ `cmake` and version greater than 3.8.2 ++ `gcc` `gdb` `make` is installed + +## step2 +make `build` directory and compile in `build` + +```bash +mkdir build && cd build +cmake .. +make +``` + +## step3 +run program !! + +```bash +# in build directory +./hello_world +``` + +## other +you can copy this demo to other path, but if you want do it, +you need modify `CMakeLists.txt`. find line + +```cmake +set(TINY_ROOT ../../../) +``` + +and modify `path-to-tinyos` +```cmake +set(TINY_ROOT path-to-tinyos) +``` diff --git a/board/Linux_Posix/hello_world/src/main.c b/board/Linux_Posix/hello_world/src/main.c new file mode 100644 index 00000000..ce858a11 --- /dev/null +++ b/board/Linux_Posix/hello_world/src/main.c @@ -0,0 +1,53 @@ +#include "cmsis_os.h" + +#define TASK1_STK_SIZE 512 +void task1(void *arg); +osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE); + +#define TASK2_STK_SIZE 512 +void task2(void *arg); +osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE); + +void task1(void *arg) +{ + int count = 1; + while (1) { + printf("###This is task1, %d\r\n", count++); + osDelay(2000); + } +} + +void task2(void *arg) +{ + int count = 1; + while (1) { +#if TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN > 0u + k_err_t rc; + int depth; + + rc = tos_task_stack_draught_depth(K_NULL, &depth); + printf("%d %d\n", rc, depth); +#endif + + printf("***This is task2, %d\r\n", count++); + osDelay(1000); + } +} + +void application_entry(void *arg) +{ + osThreadCreate(osThread(task1), NULL); // Create task1 + osThreadCreate(osThread(task2), NULL); // Create task2 +} + + +int main(void) +{ + osKernelInitialize(); //TOS Tiny kernel initialize + application_entry(NULL); + osKernelStart(); //Start TOS Tiny + + while (1) + { + } +} diff --git a/board/Linux_Posix/mqtt_demo/CMakeLists.txt b/board/Linux_Posix/mqtt_demo/CMakeLists.txt new file mode 100644 index 00000000..35c3b8b9 --- /dev/null +++ b/board/Linux_Posix/mqtt_demo/CMakeLists.txt @@ -0,0 +1,57 @@ +cmake_minimum_required(VERSION 3.8) + +project(mqtt_demo) + +set(CMAKE_BUILD_TYPE "Debug") +set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb") +set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall") + +set(TINY_ROOT ../../../) + +## kernel +include_directories(${TINY_ROOT}/osal/cmsis_os) +include_directories(${TINY_ROOT}/kernel/core/include) +include_directories(${TINY_ROOT}/kernel/evtdrv/include) +include_directories(${TINY_ROOT}/kernel/hal/include) +include_directories(${TINY_ROOT}/kernel/pm/include) + +set(CMSIS_SRCS ${TINY_ROOT}/osal/cmsis_os/cmsis_os.c) +aux_source_directory(${TINY_ROOT}/kernel/core CORE_SRCS) +aux_source_directory(${TINY_ROOT}/kernel/evtdrv EVTDRV_SRCS) +aux_source_directory(${TINY_ROOT}/kernel/pm PM_SRCS) + +set(KERNEL_SRCS ${CMSIS_SRCS} ${EVTDRV_SRCS} ${PM_SRCS} ${CORE_SRCS}) + +## net +include_directories(${TINY_ROOT}/components/connectivity/Eclipse-Paho-MQTT/3rdparty/include) +include_directories(${TINY_ROOT}/components/connectivity/Eclipse-Paho-MQTT/wrapper/include) +include_directories(${TINY_ROOT}/net/sal_module_wrapper) + +aux_source_directory(${TINY_ROOT}/components/connectivity/Eclipse-Paho-MQTT/3rdparty/src MQTT_3RD_SRCS) +aux_source_directory(${TINY_ROOT}/components/connectivity/Eclipse-Paho-MQTT/wrapper/src MQTT_SRCS) +aux_source_directory(${TINY_ROOT}/net/sal_module_wrapper SAL_SRCS) + +set(NET_SRCS ${MQTT_3RD_SRCS} ${MQTT_SRCS} ${SAL_SRCS}) + +## arch +set(ARCH_ROOT ${TINY_ROOT}/arch/linux) + +include_directories(${ARCH_ROOT}/common/include) +include_directories(${ARCH_ROOT}/posix/gcc) + +aux_source_directory(${ARCH_ROOT}/common ARCH_COMMON_SRCS) +aux_source_directory(${ARCH_ROOT}/posix/gcc ARCH_POSIX_SRCS) + +set(ARCH_SRCS ${ARCH_COMMON_SRCS} ${ARCH_POSIX_SRCS}) + +set(TINY_SRCS ${ARCH_SRCS} ${KERNEL_SRCS} ${NET_SRCS}) + +## app +include_directories(./) +include_directories(./inc) + +aux_source_directory(./src APP_SRCS) + +add_executable(mqtt_demo ${APP_SRCS} ${TINY_SRCS}) + +target_link_libraries(mqtt_demo pthread) \ No newline at end of file diff --git a/board/Linux_Posix/mqtt_demo/Makefile b/board/Linux_Posix/mqtt_demo/Makefile new file mode 100644 index 00000000..180951cb --- /dev/null +++ b/board/Linux_Posix/mqtt_demo/Makefile @@ -0,0 +1,58 @@ +################################################################### +#automatic detection QTOP and LOCALDIR +CUR_DIR := $(patsubst %/,%,$(dir $(realpath $(firstword $(MAKEFILE_LIST))))) +TRYQTOP := $(shell if [ -n "$$QTOP" ] ; then\ + echo $$QTOP;\ + else\ + cd $(CUR_DIR); while /usr/bin/test ! -e qmk ; do \ + dir=`cd ../;pwd`; \ + if [ "$$dir" = "/" ] ; then \ + echo Cannot find QTOP in $(firstword $(MAKEFILE_LIST)) 1>&2; \ + exit 1; \ + fi ; \ + cd $$dir; \ + done ; \ + pwd; \ + fi) +QTOP ?= $(realpath ${TRYQTOP}) + +ifeq ($(QTOP),) +$(error Please run this in a tree) +endif +LOCALDIR = $(patsubst %/,%,$(subst $(realpath $(QTOP))/,,$(CUR_DIR))) +export QTOP + +#################################################################### + + +export BP=Linux_Posix + +TREE_LIB_ENABLE=1 +lib= +subdirs = + +CFGFLAGS += -I$(CUR_DIR)/inc +CFGFLAGS += -I$(QTOP)/net/sal_module_wrapper +CFGFLAGS += -I$(QTOP)/components/connectivity/Eclipse-Paho-MQTT/wrapper/include +CFGFLAGS += -I$(QTOP)/components/connectivity/Eclipse-Paho-MQTT/3rdparty/include + +all:: + make -C ${QTOP}/arch BP=Linux_Posix + make -C ${QTOP}/kernel + make -C ${QTOP}/osal + make -C ${QTOP}/net + make -C ${QTOP}/devices + make -C ${QTOP}/components/connectivity/Eclipse-Paho-MQTT + +exec = +LD_A_FILES += $(LIBDIR)/libarch.a +LD_A_FILES += $(LIBDIR)/libkernel.a +LD_A_FILES += $(LIBDIR)/libhello_world.a +LD_A_FILES += $(LIBDIR)/libcmsis_os.a +LD_A_FILES += $(LIBDIR)/libEclipse-Paho-MQTT.a +LD_A_FILES += $(LIBDIR)/libsal_module_wrapper.a +LDFLAGS += -lpthread + +include ${QTOP}/qmk/generic/Make.exec + + diff --git a/board/Linux_Posix/mqtt_demo/inc/mqtt_config.h b/board/Linux_Posix/mqtt_demo/inc/mqtt_config.h new file mode 100644 index 00000000..a9342b76 --- /dev/null +++ b/board/Linux_Posix/mqtt_demo/inc/mqtt_config.h @@ -0,0 +1,27 @@ +#ifndef TOS_MQTT_CONFIG_H +#define TOS_MQTT_CONFIG_H + +#define MQTT_SERVER_IP "111.230.189.156" +#define MQTT_SERVER_PORT "1883" +#define MQTT_PRODUCT_ID "$product" +#define MQTT_DEV_NAME "$dev" +#define MQTT_CLIENT_ID "$product$dev" +#define MQTT_USR_NAME "$product$dev;21010406;12365;4294967295" +#define MQTT_PASSWORD "$sign;hmacsha1" +#define MQTT_SUBSCRIBE_TOPIC "$product/$dev/$sub" +#define MQTT_PUBLISH_TOPIC "$product/$dev/$pub" + +//#error please replace yourself server configuration +/** + * 1. run python tool + * ``` + * cd tiny/tools/ + * python3 mqtt_config_gen.py + * ``` + * then input your server information + * + * 2. tool will generate `mqtt_config.h` file, copy to replace this file + */ + +#endif + diff --git a/board/Linux_Posix/mqtt_demo/inc/socket_wrapper.h b/board/Linux_Posix/mqtt_demo/inc/socket_wrapper.h new file mode 100644 index 00000000..0df6bc06 --- /dev/null +++ b/board/Linux_Posix/mqtt_demo/inc/socket_wrapper.h @@ -0,0 +1,8 @@ +#ifndef _SOCKET_WRAPPER_ +#define _SOCKET_WRAPPER_ + +#include "sal_module_wrapper.h" + +sal_module_t *get_socket_module(void); + +#endif //_SOCKET_WRAPPER_ \ No newline at end of file diff --git a/board/Linux_Posix/mqtt_demo/inc/tos_config.h b/board/Linux_Posix/mqtt_demo/inc/tos_config.h new file mode 100644 index 00000000..7cd5e2a9 --- /dev/null +++ b/board/Linux_Posix/mqtt_demo/inc/tos_config.h @@ -0,0 +1,46 @@ +#ifndef _TOS_CONFIG_H_ +#define _TOS_CONFIG_H_ + +#include "stddef.h" + +#define TOS_CFG_TASK_PRIO_MAX 10u // 配置TencentOS tiny默认支持的最大优先级数量 + +#define TOS_CFG_ROUND_ROBIN_EN 1u // 配置TencentOS tiny的内核是否开启时间片轮转 + +#define TOS_CFG_OBJECT_VERIFY 0u // 配置TencentOS tiny是否校验指针合法 + +#define TOS_CFG_EVENT_EN 1u // TencentOS tiny 事件模块功能宏 + +#define TOS_CFG_MMHEAP_EN 1u // 配置TencentOS tiny是否开启动态内存模块 + +#define TOS_CFG_MMHEAP_POOL_SIZE 0x100 // 配置TencentOS tiny动态内存池大小 + +#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100 // 配置TencentOS tiny动态内存池大小 + +#define TOS_CFG_MUTEX_EN 1u // 配置TencentOS tiny是否开启互斥锁模块 + +#define TOS_CFG_QUEUE_EN 1u // 配置TencentOS tiny是否开启队列模块 + +#define TOS_CFG_TIMER_EN 1u // 配置TencentOS tiny是否开启软件定时器模块 + +#define TOS_CFG_SEM_EN 1u // 配置TencentOS tiny是否开启信号量模块 + +#define TOS_CFG_MMBLK_EN 1u + +#if (TOS_CFG_QUEUE_EN > 0u) +#define TOS_CFG_MSG_EN 1u +#else +#define TOS_CFG_MSG_EN 0u +#endif + +#define TOS_CFG_MSG_POOL_SIZE 10u // 配置TencentOS tiny消息队列大小 + +#define TOS_CFG_IDLE_TASK_STK_SIZE 256u // 配置TencentOS tiny空闲任务栈大小 + +#define TOS_CFG_CPU_TICK_PER_SECOND 1000u // 配置TencentOS tiny的tick频率 + +#define TOS_CFG_CPU_CLOCK 1000000u // 配置TencentOS tiny CPU频率 + +#define TOS_CFG_TIMER_AS_PROC 1u // 配置是否将TIMER配置成函数模式 + +#endif \ No newline at end of file diff --git a/board/Linux_Posix/mqtt_demo/readme.md b/board/Linux_Posix/mqtt_demo/readme.md new file mode 100644 index 00000000..821f52a1 --- /dev/null +++ b/board/Linux_Posix/mqtt_demo/readme.md @@ -0,0 +1,79 @@ +# How to run the demo in linux + +## step1 +make sure your develop environment. ++ `cmake` and version greater than 3.8.2 ++ `gcc` `gdb` `make` is installed + +## step2 +configure your server and add a transmit rule + +reference [tencent cloud IoT guide?](../../../doc/8.TencentOS-tiny对接腾讯云IoTHub开发指南.md) + +additional thing, add a rule for send a message to the demo +1. select filter topic is the ${demo device}/event and +SELECT * FROM ${demo device}/event +2. select action type is Republish and topic is the ${demo device}/control + +the page like this +_____________________________________________ +|规则引擎 +|-------------------------------------------- +|基本信息 +|规则名称 loop +|规则描述 未填写 +|-------------------------------------------- +|筛选数据 +|字段 * +|Topic ${demo device}/event +|条件 +|当前SQL语句是: +|SELECT * ${demo device}/event +|-------------------------------------------- +|行为操作 +|行为类型 数据转发到另一个Topic ( Republish ) +|Topic ${demo device}/control +| ... +_____________________________________________ + + +## step3 +generate `mqtt_config.h` file to replace `./inc/mqtt_config.h` + +cd `tiny/tools/` directory, run python script +```bash +python3 mqtt_config_gen.py +``` + +then input your server configuration, generate `mqtt_config.h` file +copy to `./inc/` replace old file + +## step4 +make `build` directory and compile in `build` + +```bash +mkdir build && cd build +cmake .. +make +``` + +## step5 +run program !! + +```bash +# in build directory +./mqtt_demo +``` + +## other +you can copy this demo to other path, but if you want do it, +you need modify `CMakeLists.txt`. find line + +```cmake +set(TINY_ROOT ../../../) +``` + +and modify `path-to-tinyos` +```cmake +set(TINY_ROOT path-to-tinyos) +``` diff --git a/board/Linux_Posix/mqtt_demo/src/main.c b/board/Linux_Posix/mqtt_demo/src/main.c new file mode 100644 index 00000000..b2c150cf --- /dev/null +++ b/board/Linux_Posix/mqtt_demo/src/main.c @@ -0,0 +1,104 @@ +#include "cmsis_os.h" +#include "socket_wrapper.h" +#include "sal_module_wrapper.h" +#include "mqtt_wrapper.h" +#include "mqtt_config.h" + +#include + +int sock_id = 0; + +//mqtt_publisher +#define MQTT_PUBLISHER_STK_SIZE 1024 +void mqtt_publisher(void *pdata); +osThreadDef(mqtt_publisher, osPriorityNormal, 1, MQTT_PUBLISHER_STK_SIZE); + +//mqtt_reciever +#define MQTT_RECIEVER_STK_SIZE 1024 +void mqtt_reciever(void *pdata); +osThreadDef(mqtt_reciever, osPriorityNormal, 1, MQTT_RECIEVER_STK_SIZE); + +void mqtt_publisher(void *pdata) +{ + mqtt_con_opt_t con_param; + con_param.keep_alive_interval = 2000; + con_param.cleansession = 1; + con_param.username = MQTT_USR_NAME; + con_param.password = MQTT_PASSWORD; + con_param.client_id = MQTT_CLIENT_ID; + + mqtt_pub_opt_t pub_param; + pub_param.dup = 0; + pub_param.qos = 0; + pub_param.retained = 0; + pub_param.id = 0; + pub_param.payload = "hello tencent cloud"; + pub_param.payload_len = 20; + pub_param.topic = MQTT_PUBLISH_TOPIC; + + mqtt_sub_opt_t sub_param; + sub_param.count = 1; + sub_param.dup = 0; + sub_param.id = 0; + sub_param.req_qos = 0; + sub_param.topic = MQTT_SUBSCRIBE_TOPIC; + + printf("start connect\n"); + tos_sal_module_register(get_socket_module()); + tos_sal_module_init(); + + sock_id = tos_mqtt_connect(MQTT_SERVER_IP, MQTT_SERVER_PORT, &con_param); + if (sock_id == -1) + { + printf("connect failed!!!\n"); + return -1; //to exit thread + } + printf("connect success\n"); + + if (tos_mqtt_subscribe(sock_id, &sub_param) != 0) + { + printf("subscribe failed!!!\n"); + }else{ + printf("subscribe success\n"); + } + + osThreadCreate(osThread(mqtt_reciever), NULL); // start receive + + for (;;) + { + printf("\n"); + printf("publish topic-->%s| data-->%s| \n", pub_param.topic, pub_param.payload); + if (tos_mqtt_publish(sock_id, &pub_param) != 0) { + printf("publish failed!!!\n"); + } + osDelay(2000); + } +} + +void mqtt_reciever(void *pdata) +{ + uint8_t read_data[100]; + int8_t topic[30]; + uint32_t read_len; + + for (;;) + { + read_len = tos_mqtt_receive(topic, sizeof(topic), read_data, sizeof(read_data)); + if (read_len >= 0) + { + printf("receive topic-->%s| data-->%s| \n", topic, read_data); + } + osDelay(100); + } +} + +int main(void) +{ + osKernelInitialize(); //TOS Tiny kernel initialize + osThreadCreate(osThread(mqtt_publisher), NULL); // start connect and publish + osKernelStart(); //Start TOS Tiny + + while (1) + { + } +} diff --git a/board/Linux_Posix/mqtt_demo/src/socket_wrapper.c b/board/Linux_Posix/mqtt_demo/src/socket_wrapper.c new file mode 100644 index 00000000..8ee2b3cd --- /dev/null +++ b/board/Linux_Posix/mqtt_demo/src/socket_wrapper.c @@ -0,0 +1,143 @@ +#include "socket_wrapper.h" +#include "cmsis_os.h" + +#include +#include +#include +#include +#include + +static osMutexId socket_send_lock, socket_recv_lock; + +osMutexDef(socket_send_lock); +osMutexDef(socket_recv_lock); + +static osSemaphoreId socket_recv_event; +osSemaphoreDef(socket_recv_event); + +int socket_init(void) +{ + socket_send_lock = osMutexCreate(osMutex(socket_send_lock)); + socket_recv_lock = osMutexCreate(osMutex(socket_recv_lock)); + socket_recv_event = osSemaphoreCreate(osSemaphore(socket_recv_event),0); + + return ( + (socket_recv_event != NULL) && + (socket_recv_lock != NULL) && + (socket_send_lock != NULL) + ); +} + +void io_signal_handle(int signal) +{ + osSemaphoreRelease(socket_recv_event); +} + +int socket_connect(const char *ip, const char *port, sal_proto_t proto) +{ + struct sockaddr_in addr = { + .sin_family = AF_INET, + .sin_port = htons(atoi(port))}; + int socket_proto = 0; + struct sigaction sig_install; + + inet_pton(AF_INET, ip, &addr.sin_addr); + + if (TOS_SAL_PROTO_TCP == proto) + { + socket_proto = IPPROTO_TCP; + } + else if (TOS_SAL_PROTO_UDP == proto) + { + socket_proto = IPPROTO_UDP; + } + else + { + return -1; + } + + int socket_id = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + + fcntl( socket_id, __F_SETOWN, getpid() ); + fcntl( socket_id, __F_SETSIG, SIGIO ); + fcntl( socket_id, F_SETFL, O_ASYNC ); + + sig_install.sa_flags = 0; + sig_install.sa_handler = io_signal_handle; + sigfillset( &sig_install.sa_mask ); + + if ( 0 != sigaction( SIGIO, &sig_install, NULL ) ) + { + printf( "socket problem installing %d\n",SIGIO ); + } + + connect(socket_id, &addr, sizeof(addr)); + return socket_id; +} + +int socket_send(int sock, const void *buf, size_t len) +{ + ssize_t send_len = 0, state; + if (sock < 0) + return -1; + osMutexWait(socket_send_lock, TOS_TIME_FOREVER); + do + { + state = send(sock, (buf + send_len), (len - send_len), MSG_DONTWAIT); + if (state > 0) + { + send_len += state; + } + if (send_len != len) + { + osSemaphoreWait(socket_recv_event,100); + } + } while (len != send_len); + osMutexRelease(socket_send_lock); + return send_len; +} + +int socket_recv(int sock, void *buf, size_t len) +{ + ssize_t recv_len = 0, state; + if (sock < 0) + return -1; + osMutexWait(socket_recv_lock, TOS_TIME_FOREVER); + do + { + state = recv(sock, (buf + recv_len), (len - recv_len), MSG_DONTWAIT); + if (state > 0) + { + recv_len += state; + } + if (recv_len != len) + { + osSemaphoreWait(socket_recv_event,100); + } + } while (len != recv_len); + osMutexRelease(socket_recv_lock); + return recv_len; +} + +int socket_close(int sock) +{ + close(sock); +} + +static sal_module_t linux_sal = { + .init = socket_init, + .connect = socket_connect, + .send = socket_send, + .recv = socket_recv, + .close = socket_close, + // .sendto = NULL, + // .recv_timeout = NULL, + // .recvfrom = NULL, + // .recvfrom_timeout = NULL, + // .parse_domain = NULL, +}; + +sal_module_t *get_socket_module(void) +{ + return (&linux_sal); +}