diff --git a/.vscode/launch.json b/.vscode/launch.json index 38ef27942..cc17ad1f1 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -25,7 +25,7 @@ "executable": "${workspaceFolder}/build/output/kernel.img.out", "symbolFiles": [ "${workspaceFolder}/build/mkrtos/mkrtos_knl/mkrtos.elf", - "${workspaceFolder}/build/mkrtos/mkrtos_user/server/init/init.elf", + // "${workspaceFolder}/build/mkrtos/mkrtos_user/server/app/app.elf", ], "servertype": "jlink", "cwd": "${fileDirname}", @@ -48,7 +48,8 @@ "cwd": "${fileDirname}", "environment": [], "externalConsole": false, - "miDebuggerPath": "/opt/homebrew/bin/arm-none-eabi-gdb", + // "miDebuggerPath": "/opt/homebrew/bin/arm-none-eabi-gdb", + "miDebuggerPath": "/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb", // "miDebuggerPath": "/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gdb", "miDebuggerServerAddress": "127.0.0.1:3333", "MIMode": "gdb", diff --git a/.vscode/settings.json b/.vscode/settings.json index 444819ad9..7c8e8d0dc 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -146,7 +146,12 @@ "ns_cli.h": "c", "fs_cli.h": "c", "u_rpc_1.h": "c", - "__config": "c" + "__config": "c", + "stm32f10x.h": "c", + "variant": "c", + "soft_iic.h": "c", + "sysinfo.h": "c", + "u_sleep.h": "c" }, "cortex-debug.showRTOS": false, "cortex-debug.variableUseNaturalFormat": false, diff --git a/build.sh b/build.sh index 145fd4363..113bf6ab3 100755 --- a/build.sh +++ b/build.sh @@ -2,9 +2,8 @@ # export TOOLCHAIN=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/ # export TOOLCHAIN_LIB=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/lib/gcc/arm-none-eabi/5.4.1/armv7-m -export TOOLCHAIN=/opt/homebrew/bin/ -export TOOLCHAIN_LIB=/opt/homebrew/lib/gcc/arm-none-eabi/13.2.0/thumb -export KNL=mkrtos +export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/ +export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp export KEN_OFFSET=0x2000 export INIT_OFFSET=0x10000 export BOOTFS_ADDR_OFFSET=0x20000 diff --git a/build_stm32f1.sh b/build_stm32f1.sh index e1914e8a2..cc644192c 100755 --- a/build_stm32f1.sh +++ b/build_stm32f1.sh @@ -2,8 +2,8 @@ # export TOOLCHAIN=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/bin/ # export TOOLCHAIN_LIB=/home/zhangzheng/gcc-arm-none-eabi-5_4-2016q3/lib/gcc/arm-none-eabi/5.4.1/armv7-m -export TOOLCHAIN=/opt/homebrew/bin/ -export TOOLCHAIN_LIB=/opt/homebrew/lib/gcc/arm-none-eabi/13.2.0/thumb +export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/ +export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp export KNL=mkrtos export KEN_OFFSET=0x2000 export INIT_OFFSET=0x10000 diff --git a/mkrtos_knl/inc/knl/config.h b/mkrtos_knl/inc/knl/config.h index cd09ea97c..18aa92a50 100644 --- a/mkrtos_knl/inc/knl/config.h +++ b/mkrtos_knl/inc/knl/config.h @@ -1,3 +1,3 @@ #pragma once -#define SYS_SCHE_HZ 100 //!< 系统调度频率 +#define SYS_SCHE_HZ 1000 //!< 系统调度频率 diff --git a/mkrtos_knl/knl/ipc.c b/mkrtos_knl/knl/ipc.c index 1eca3731d..28cef04dc 100755 --- a/mkrtos_knl/knl/ipc.c +++ b/mkrtos_knl/knl/ipc.c @@ -256,7 +256,7 @@ static msg_tag_t ipc_call(ipc_t *ipc, thread_t *th, entry_frame_t *f, msg_tag_t assert(th != ipc->svr_th); __check: status = spinlock_lock(&ipc->lock); - if (ipc->svr_th->status != THREAD_SUSPEND) + if (ipc->svr_th == NULL || ipc->svr_th->status != THREAD_SUSPEND) { ret = add_wait_unlock(ipc, &ipc->wait_send, th, timeout.send_timeout, &ipc->lock, status); diff --git a/mkrtos_knl/knl/task.c b/mkrtos_knl/knl/task.c index 80b4bd293..cd3860142 100755 --- a/mkrtos_knl/knl/task.c +++ b/mkrtos_knl/knl/task.c @@ -172,7 +172,7 @@ static void task_release_stage2(kobject_t *kobj) thread_sched(); } scheduler_reset(); - mm_trace(); + // mm_trace(); printk("release tk %x\n", tk); } void task_kill(task_t *tk) diff --git a/mkrtos_user/lib/libc_backend/inc/syscall_backend.h b/mkrtos_user/lib/libc_backend/inc/syscall_backend.h index fb38f2aea..88bfb4c81 100644 --- a/mkrtos_user/lib/libc_backend/inc/syscall_backend.h +++ b/mkrtos_user/lib/libc_backend/inc/syscall_backend.h @@ -39,3 +39,4 @@ long syscall_backend(long sys_inx, ...); umword_t be_mmap2(va_list ap); umword_t be_munmap(va_list ap); +void be_exit(va_list ap); diff --git a/mkrtos_user/lib/libc_backend/src/misc_backend.c b/mkrtos_user/lib/libc_backend/src/misc_backend.c index 87918c55f..961a396c7 100644 --- a/mkrtos_user/lib/libc_backend/src/misc_backend.c +++ b/mkrtos_user/lib/libc_backend/src/misc_backend.c @@ -2,7 +2,8 @@ #include "syscall_backend.h" #include "u_prot.h" #include "u_ipc.h" - +#include "u_task.h" +#include "u_env.h" #include long be_set_tid_address(va_list ap) @@ -47,3 +48,9 @@ unsigned long get_thread_area(void) return i_msg->user[0]; } +void be_exit(va_list ap) +{ + /*TODO:暂时先这样*/ + task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, TASK_THIS)); + ulog_write_str(u_get_global_env()->log_hd, "It shouldn't go here.\n"); +} \ No newline at end of file diff --git a/mkrtos_user/lib/libc_backend/src/syscall_backend.c b/mkrtos_user/lib/libc_backend/src/syscall_backend.c index bcf61db06..c2a6eb8e2 100644 --- a/mkrtos_user/lib/libc_backend/src/syscall_backend.c +++ b/mkrtos_user/lib/libc_backend/src/syscall_backend.c @@ -16,6 +16,7 @@ static const sys_call_func sys_call_list[] = { [SYS_ioctl] = sys_be_ioctl, [SYS_set_tid_address] = be_set_tid_address, [__ARM_NR_set_tls] = be_set_thread_area, + [SYS_exit] = be_exit, }; static const sys_call_func_nr = sizeof(sys_call_list) / sizeof(sys_call_func); diff --git a/mkrtos_user/lib/mlibc/include/time.h b/mkrtos_user/lib/mlibc/include/time.h index 3d9483720..9ab02dad8 100644 --- a/mkrtos_user/lib/mlibc/include/time.h +++ b/mkrtos_user/lib/mlibc/include/time.h @@ -12,8 +12,10 @@ extern "C" { #elif defined(__cplusplus) #define NULL 0L #else +#ifndef NULL #define NULL ((void*)0) #endif +#endif #define __NEED_size_t diff --git a/mkrtos_user/lib/sys/inc/u_arch.h b/mkrtos_user/lib/sys/inc/u_arch.h index 5aa21a542..cbb9fee97 100644 --- a/mkrtos_user/lib/sys/inc/u_arch.h +++ b/mkrtos_user/lib/sys/inc/u_arch.h @@ -1,5 +1,7 @@ #pragma once +#define SYS_SCHE_HZ 1000 //!< 系统调度频率 + #define WORD_BYTES (sizeof(void *)) #define WORD_BITS (WORD_BYTES * 8) @@ -13,4 +15,3 @@ :); \ _val; \ }) - diff --git a/mkrtos_user/lib/sys/inc/u_log.h b/mkrtos_user/lib/sys/inc/u_log.h index 9e3c45c03..438d21cdf 100644 --- a/mkrtos_user/lib/sys/inc/u_log.h +++ b/mkrtos_user/lib/sys/inc/u_log.h @@ -2,7 +2,9 @@ #include "u_arch.h" #include "u_types.h" + #define ULOG_RW_MAX_BYTES (WORD_BYTES * 5) + void ulog_write_bytes(obj_handler_t obj_inx, const uint8_t *data, umword_t len); void ulog_write_str(obj_handler_t obj_inx, const char *str); int ulog_read_bytes(obj_handler_t obj_inx, uint8_t *data, umword_t len); diff --git a/mkrtos_user/lib/sys/src/u_log.c b/mkrtos_user/lib/sys/src/u_log.c index 1fc126455..5fd00f1dc 100644 --- a/mkrtos_user/lib/sys/src/u_log.c +++ b/mkrtos_user/lib/sys/src/u_log.c @@ -26,10 +26,10 @@ static msg_tag_t ulog_read_bytes_raw(obj_handler_t obj_inx, umword_t data[5], in 0, 0, 0); - asm __volatile__("" + asm __volatile__("" : : - : "r0", "r1", "r2", "r3", "r4", "r5"); + : "r0","r1","r2","r3","r4","r5"); msg_tag_t tag = msg_tag_init(r0); { ((umword_t *)data)[0] = r1; diff --git a/mkrtos_user/lib/sys_util/inc/u_sleep.h b/mkrtos_user/lib/sys_util/inc/u_sleep.h new file mode 100644 index 000000000..8eecb8c7a --- /dev/null +++ b/mkrtos_user/lib/sys_util/inc/u_sleep.h @@ -0,0 +1,7 @@ +#pragma once + +#include "u_types.h" +#include + +void u_sleep_init(void); +void u_sleep_ms(size_t ms); diff --git a/mkrtos_user/lib/sys_util/src/u_sleep.c b/mkrtos_user/lib/sys_util/src/u_sleep.c new file mode 100644 index 000000000..7c7c21f56 --- /dev/null +++ b/mkrtos_user/lib/sys_util/src/u_sleep.c @@ -0,0 +1,24 @@ +#include "u_types.h" +#include "u_hd_man.h" +#include "u_prot.h" +#include "u_task.h" +#include "u_arch.h" +#include "u_ipc.h" +#include "u_factory.h" +#include +#include +static obj_handler_t hd; +void u_sleep_init(void) +{ + msg_tag_t tag; + + hd = handler_alloc(); + assert(hd != HANDLER_INVALID); + tag = factory_create_ipc(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, hd)); + assert(msg_tag_get_val(tag) >= 0); +} + +void u_sleep_ms(size_t ms) +{ + ipc_call(hd, msg_tag_init4(0, 0, 0, 0), ipc_timeout_create2((1000 / SYS_SCHE_HZ) * ms, 0)); +} diff --git a/mkrtos_user/server/app/CMakeLists.txt b/mkrtos_user/server/app/CMakeLists.txt index c9c36907e..a1913aadc 100644 --- a/mkrtos_user/server/app/CMakeLists.txt +++ b/mkrtos_user/server/app/CMakeLists.txt @@ -24,6 +24,8 @@ target_include_directories( ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/server/app/drv + ${CMAKE_SOURCE_DIR}/mkrtos_user/server/app/test ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/ ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic diff --git a/mkrtos_user/server/app/drv/delay.c b/mkrtos_user/server/app/drv/delay.c new file mode 100644 index 000000000..3b7ccae23 --- /dev/null +++ b/mkrtos_user/server/app/drv/delay.c @@ -0,0 +1,12 @@ +#include "delay.h" +#include "u_sleep.h" +void delay_us(int n) +{ + volatile int i = 10 * n; + while (i--) + ; +} +void delay_ms(int i) +{ + u_sleep_ms(i); +} \ No newline at end of file diff --git a/mkrtos_user/server/app/drv/delay.h b/mkrtos_user/server/app/drv/delay.h new file mode 100644 index 000000000..e55f21d7d --- /dev/null +++ b/mkrtos_user/server/app/drv/delay.h @@ -0,0 +1,4 @@ +#pragma once + +void delay_us(int n); +void delay_ms(int i); diff --git a/mkrtos_user/server/app/drv/drv.c b/mkrtos_user/server/app/drv/drv.c new file mode 100644 index 000000000..e7f31fb37 --- /dev/null +++ b/mkrtos_user/server/app/drv/drv.c @@ -0,0 +1,24 @@ + +#include "u_types.h" +#include "u_prot.h" +#include "u_mm.h" +#include "u_sleep.h" +#include "led.h" +#include "relay.h" +#include "soft_iic.h" +#include "spl06.h" +#include + +void drv_init(void) +{ + msg_tag_t tag; + u_sleep_init(); + + tag = mm_align_alloc(MM_PROT, (void *)0x40000000, 0x50000000 - 0x40000000); + assert(msg_tag_get_val(tag) >= 0); + + led_init(); + relay_init(); + IIC_Init(); + spl0601_init(); +} diff --git a/mkrtos_user/server/app/drv/drv.h b/mkrtos_user/server/app/drv/drv.h new file mode 100644 index 000000000..e36ccb5df --- /dev/null +++ b/mkrtos_user/server/app/drv/drv.h @@ -0,0 +1,3 @@ +#pragma once + +void drv_init(void); diff --git a/mkrtos_user/server/app/drv/led.c b/mkrtos_user/server/app/drv/led.c new file mode 100644 index 000000000..aac7d95c2 --- /dev/null +++ b/mkrtos_user/server/app/drv/led.c @@ -0,0 +1,12 @@ + +#include "stm32_sys.h" + +void led_init(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_Init(GPIOC, &GPIO_InitStructure); +} diff --git a/mkrtos_user/server/app/drv/led.h b/mkrtos_user/server/app/drv/led.h new file mode 100644 index 000000000..75793b78d --- /dev/null +++ b/mkrtos_user/server/app/drv/led.h @@ -0,0 +1,6 @@ +#pragma once + +#include "stm32_sys.h" +void led_init(void); + +#define toogle_led_0() PCout(13) = !PCin(13) \ No newline at end of file diff --git a/mkrtos_user/server/app/drv/relay.c b/mkrtos_user/server/app/drv/relay.c new file mode 100644 index 000000000..cab69ff44 --- /dev/null +++ b/mkrtos_user/server/app/drv/relay.c @@ -0,0 +1,98 @@ + +#include "u_types.h" +#include "sysinfo.h" +#include "stm32_sys.h" +#include + +void relay_init(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_Init(GPIOB, &GPIO_InitStructure); +} +void relay_ctrl(uint8_t index, uint8_t state) +{ + state = !state; + sys_info.relay[index] = state; + + switch (index) + { + case 0: + if (state) + { + GPIO_SetBits(GPIOA, GPIO_Pin_8); + } + else + { + GPIO_ResetBits(GPIOA, GPIO_Pin_8); + } + break; + case 1: + if (state) + { + GPIO_SetBits(GPIOC, GPIO_Pin_6); + } + else + { + GPIO_ResetBits(GPIOC, GPIO_Pin_6); + } + break; + case 2: + if (state) + { + GPIO_SetBits(GPIOC, GPIO_Pin_7); + } + else + { + GPIO_ResetBits(GPIOC, GPIO_Pin_7); + } + break; + case 3: + if (state) + { + GPIO_SetBits(GPIOC, GPIO_Pin_8); + } + else + { + GPIO_ResetBits(GPIOC, GPIO_Pin_8); + } + break; + case 4: + if (state) + { + GPIO_SetBits(GPIOC, GPIO_Pin_9); + } + else + { + GPIO_ResetBits(GPIOC, GPIO_Pin_9); + } + break; + case 5: + if (state) + { + GPIO_SetBits(GPIOB, GPIO_Pin_7); + } + else + { + GPIO_ResetBits(GPIOB, GPIO_Pin_7); + } + break; + default: + assert(0); + break; + } +} diff --git a/mkrtos_user/server/app/drv/relay.h b/mkrtos_user/server/app/drv/relay.h new file mode 100644 index 000000000..818ba8547 --- /dev/null +++ b/mkrtos_user/server/app/drv/relay.h @@ -0,0 +1,4 @@ +#pragma once +#include "u_types.h" +void relay_init(void); +void relay_ctrl(uint8_t index, uint8_t state); diff --git a/mkrtos_user/server/app/drv/soft_iic.c b/mkrtos_user/server/app/drv/soft_iic.c new file mode 100644 index 000000000..3e1963867 --- /dev/null +++ b/mkrtos_user/server/app/drv/soft_iic.c @@ -0,0 +1,151 @@ +#include "soft_iic.h" +#include "delay.h" + +void IIC_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); + GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); + + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOB, &GPIO_InitStructure); + + IIC_SCL = 1; + IIC_SDA = 1; +} +void IIC_Start(void) +{ + SDA_OUT(); + IIC_SDA = 1; + IIC_SCL = 1; + delay_us(4); + IIC_SDA = 0; + delay_us(4); + IIC_SCL = 0; +} +void IIC_Stop(void) +{ + SDA_OUT(); + IIC_SCL = 0; + IIC_SDA = 0; + delay_us(4); + IIC_SCL = 1; + IIC_SDA = 1; + delay_us(4); +} + +u8 IIC_Wait_Ack(void) +{ + u8 ucErrTime = 0; + SDA_IN(); + IIC_SDA = 1; + delay_us(1); + IIC_SCL = 1; + delay_us(1); + while (READ_SDA) + { + ucErrTime++; + if (ucErrTime > 250) + { + IIC_Stop(); + return 1; + } + } + IIC_SCL = 0; + return 0; +} +void IIC_Ack(void) +{ + IIC_SCL = 0; + SDA_OUT(); + IIC_SDA = 0; + delay_us(2); + IIC_SCL = 1; + delay_us(2); + IIC_SCL = 0; +} +void IIC_NAck(void) +{ + IIC_SCL = 0; + SDA_OUT(); + IIC_SDA = 1; + delay_us(2); + IIC_SCL = 1; + delay_us(2); + IIC_SCL = 0; +} + +void IIC_Send_Byte(u8 txd) +{ + u8 t; + SDA_OUT(); + IIC_SCL = 0; + for (t = 0; t < 8; t++) + { + IIC_SDA = (txd & 0x80) >> 7; + txd <<= 1; + delay_us(2); + IIC_SCL = 1; + delay_us(2); + IIC_SCL = 0; + delay_us(2); + } +} +u8 IIC_Read_Byte(unsigned char ack) +{ + unsigned char i, receive = 0; + SDA_IN(); + for (i = 0; i < 8; i++) + { + IIC_SCL = 0; + delay_us(2); + IIC_SCL = 1; + receive <<= 1; + if (READ_SDA) + receive++; + delay_us(1); + } + if (!ack) + IIC_NAck(); + else + IIC_Ack(); + return receive; +} +u8 IIC_Write_1Byte(u8 SlaveAddress, u8 REG_Address, u8 REG_data) +{ + IIC_Start(); + IIC_Send_Byte(SlaveAddress << 1); + if (IIC_Wait_Ack()) + { + IIC_Stop(); + return 1; + } + IIC_Send_Byte(REG_Address); + IIC_Wait_Ack(); + IIC_Send_Byte(REG_data); + IIC_Wait_Ack(); + IIC_Stop(); + return 0; +} + +u8 IIC_Read_1Byte(u8 SlaveAddress, u8 REG_Address, u8 *REG_data) +{ + IIC_Start(); + IIC_Send_Byte(SlaveAddress << 1); + if (IIC_Wait_Ack()) + { + IIC_Stop(); + return 1; + } + IIC_Send_Byte(REG_Address); + IIC_Wait_Ack(); + IIC_Start(); + IIC_Send_Byte(SlaveAddress << 1 | 0x01); + IIC_Wait_Ack(); + *REG_data = IIC_Read_Byte(0); + IIC_Stop(); + return 0; +} diff --git a/mkrtos_user/server/app/drv/soft_iic.h b/mkrtos_user/server/app/drv/soft_iic.h new file mode 100644 index 000000000..8bf0b4d1c --- /dev/null +++ b/mkrtos_user/server/app/drv/soft_iic.h @@ -0,0 +1,33 @@ +#pragma once + +#include "stm32_sys.h" + +#define SDA_IN() \ + { \ + GPIOB->CRL &= 0XFF0FFFFF; \ + GPIOB->CRL |= 8 << 20; \ + } +#define SDA_OUT() \ + { \ + GPIOB->CRL &= 0XFF0FFFFF; \ + GPIOB->CRL |= 3 << 20; \ + } + +#define IIC_SCL PBout(4) // SCL +#define IIC_SDA PBout(5) // SDA +#define READ_SDA PBin(5) + +void IIC_Init(void); +void IIC_Start(void); +void IIC_Stop(void); +void IIC_Send_Byte(u8 txd); +u8 IIC_Read_Byte(unsigned char ack); +u8 IIC_Wait_Ack(void); +void IIC_Ack(void); +void IIC_NAck(void); + +void IIC_Write_One_Byte(u8 daddr, u8 addr, u8 data); +u8 IIC_Read_One_Byte(u8 daddr, u8 addr); + +u8 IIC_Write_1Byte(u8 SlaveAddress, u8 REG_Address, u8 REG_data); +u8 IIC_Read_1Byte(u8 SlaveAddress, u8 REG_Address, u8 *REG_data); diff --git a/mkrtos_user/server/app/drv/spl06.c b/mkrtos_user/server/app/drv/spl06.c new file mode 100644 index 000000000..f03320223 --- /dev/null +++ b/mkrtos_user/server/app/drv/spl06.c @@ -0,0 +1,458 @@ +#include "spl06.h" +#include "soft_iic.h" +#include "sysinfo.h" + +#define PRESSURE_REG 0X00 +#define TEMP_REG 0X03 +#define PRS_CFG 0x06 +#define TMP_CFG 0x07 +#define MEAS_CFG 0x08 + +#define SPL06_REST_VALUE 0x09 +#define SPL06_REST_REG 0x0C + +#define PRODUCT_ID 0X0D + +#define uint32_t unsigned int + +static struct spl0601_t spl0601; +static struct spl0601_t *p_spl0601; + +void spl0601_write(uint8_t hwadr, uint8_t regadr, uint8_t val); +uint8_t spl0601_read(uint8_t hwadr, uint8_t regadr); +void spl0601_get_calib_param(void); + +/***************************************************************************** + 函 数 名 : spl0601_write + 功能描述 : I2C 寄存器写入子函数 + 输入参数 : uint8_t hwadr 硬件地址 + uint8_t regadr 寄存器地址 + uint8_t val 值 + 输出参数 : 无 + 返 回 值 : + 调用函数 : + 被调函数 : + + 修改历史 : + 1.日 期 : 2015年11月30日 + 作 者 : WL + 修改内容 : 新生成函数 + +*****************************************************************************/ +void spl0601_write(unsigned char hwadr, unsigned char regadr, unsigned char val) +{ + // hwI2C0_Device_Addr = hwadr; + // bI2C0_TxM_Data[0] = regadr; + // bI2C0_TxM_Data[1] = val; + // + // I2C0_Engine(2,0,0); + IIC_Write_1Byte(hwadr, regadr, val); +} + +/***************************************************************************** + 函 数 名 : spl0601_read + 功能描述 : I2C 寄存器读取子函数 + 输入参数 : uint8_t hwadr 硬件地址 + uint8_t regadr 寄存器地址 + 输出参数 : + 返 回 值 : uint8_t 读出值 + 调用函数 : + 被调函数 : + + 修改历史 : + 1.日 期 : 2015年11月30日 + 作 者 : WL + 修改内容 : 新生成函数 + +*****************************************************************************/ +uint8_t spl0601_read(unsigned char hwadr, unsigned char regadr) +{ + uint8_t reg_data; + + // hwI2C0_Device_Addr = hwadr; + // bI2C0_TxM_Data[0] = regadr; // + // I2C0_Engine(1,1,1); + + // reg_data = bI2C0_RxM_Data[0]; + IIC_Read_1Byte(hwadr, regadr, ®_data); + return reg_data; +} + +/***************************************************************************** + 函 数 名 : spl0601_init + 功能描述 : SPL06-01 初始化函数 + 输入参数 : void + 输出参数 : 无 + 返 回 值 : + 调用函数 : + 被调函数 : + + 修改历史 : + 1.日 期 : 2015年11月30日 + 作 者 : WL + 修改内容 : 新生成函数 + +*****************************************************************************/ +void spl0601_init(void) +{ + p_spl0601 = &spl0601; /* read Chip Id */ + p_spl0601->i32rawPressure = 0; + p_spl0601->i32rawTemperature = 0; + p_spl0601->chip_id = 0x34; + spl0601_get_calib_param(); + + // // sampling rate = 32Hz; Pressure oversample = 8; + // spl0601_rateset(PRESSURE_SENSOR,32, 8); + // // sampling rate = 32Hz; Temperature oversample = 8; + // spl0601_rateset(TEMPERATURE_SENSOR,32, 8); + + spl0601_rateset(PRESSURE_SENSOR, 128, 32); + // sampling rate = 1Hz; Temperature oversample = 1; + spl0601_rateset(TEMPERATURE_SENSOR, 32, 8); + + // Start background measurement + spl0601_start_continuous(CONTINUOUS_P_AND_T); +} + +/***************************************************************************** + 函 数 名 : spl0601_rateset + 功能描述 : 设置温度传感器的每秒采样次数以及过采样率 + 输入参数 : uint8_t u8OverSmpl 过采样率 Maximal = 128 + uint8_t u8SmplRate 每秒采样次数(Hz) Maximal = 128 + uint8_t iSensor 0: Pressure; 1: Temperature + 输出参数 : 无 + 返 回 值 : 无 + 调用函数 : + 被调函数 : + + 修改历史 : + 1.日 期 : 2015年11月24日 + 作 者 : WL + 修改内容 : 新生成函数 + +*****************************************************************************/ +void spl0601_rateset(uint8_t iSensor, uint8_t u8SmplRate, uint8_t u8OverSmpl) +{ + uint8_t reg = 0; + int32_t i32kPkT = 0; + switch (u8SmplRate) + { + case 2: + reg |= (1 << 5); + break; + case 4: + reg |= (2 << 5); + break; + case 8: + reg |= (3 << 5); + break; + case 16: + reg |= (4 << 5); + break; + case 32: + reg |= (5 << 5); + break; + case 64: + reg |= (6 << 5); + break; + case 128: + reg |= (7 << 5); + break; + case 1: + default: + break; + } + switch (u8OverSmpl) + { + case 2: + reg |= 1; + i32kPkT = 1572864; + break; + case 4: + reg |= 2; + i32kPkT = 3670016; + break; + case 8: + reg |= 3; + i32kPkT = 7864320; + break; + case 16: + i32kPkT = 253952; + reg |= 4; + break; + case 32: + i32kPkT = 516096; + reg |= 5; + break; + case 64: + i32kPkT = 1040384; + reg |= 6; + break; + case 128: + i32kPkT = 2088960; + reg |= 7; + break; + case 1: + default: + i32kPkT = 524288; + break; + } + + if (iSensor == 0) + { + p_spl0601->i32kP = i32kPkT; + spl0601_write(HW_ADR, 0x06, reg); + if (u8OverSmpl > 8) + { + reg = spl0601_read(HW_ADR, 0x09); + spl0601_write(HW_ADR, 0x09, reg | 0x04); + } + } + if (iSensor == 1) + { + p_spl0601->i32kT = i32kPkT; + spl0601_write(HW_ADR, 0x07, reg | 0x80); // Using mems temperature + if (u8OverSmpl > 8) + { + reg = spl0601_read(HW_ADR, 0x09); + spl0601_write(HW_ADR, 0x09, reg | 0x08); + } + } +} + +/***************************************************************************** + 函 数 名 : spl0601_get_calib_param + 功能描述 : 获取校准参数 + 输入参数 : void + 输出参数 : 无 + 返 回 值 : + 调用函数 : + 被调函数 : + + 修改历史 : + 1.日 期 : 2015年11月30日 + 作 者 : WL + 修改内容 : 新生成函数 + +*****************************************************************************/ +void spl0601_get_calib_param(void) +{ + uint32_t h; + uint32_t m; + uint32_t l; + h = spl0601_read(HW_ADR, 0x10); + l = spl0601_read(HW_ADR, 0x11); + p_spl0601->calib_param.c0 = (int16_t)h << 4 | l >> 4; + p_spl0601->calib_param.c0 = (p_spl0601->calib_param.c0 & 0x0800) ? (0xF000 | p_spl0601->calib_param.c0) : p_spl0601->calib_param.c0; + h = spl0601_read(HW_ADR, 0x11); + l = spl0601_read(HW_ADR, 0x12); + p_spl0601->calib_param.c1 = (int16_t)(h & 0x0F) << 8 | l; + p_spl0601->calib_param.c1 = (p_spl0601->calib_param.c1 & 0x0800) ? (0xF000 | p_spl0601->calib_param.c1) : p_spl0601->calib_param.c1; + h = spl0601_read(HW_ADR, 0x13); + m = spl0601_read(HW_ADR, 0x14); + l = spl0601_read(HW_ADR, 0x15); + p_spl0601->calib_param.c00 = (int32_t)h << 12 | (int32_t)m << 4 | (int32_t)l >> 4; + p_spl0601->calib_param.c00 = (p_spl0601->calib_param.c00 & 0x080000) ? (0xFFF00000 | p_spl0601->calib_param.c00) : p_spl0601->calib_param.c00; + h = spl0601_read(HW_ADR, 0x15); + m = spl0601_read(HW_ADR, 0x16); + l = spl0601_read(HW_ADR, 0x17); + p_spl0601->calib_param.c10 = (int32_t)h << 16 | (int32_t)m << 8 | l; + p_spl0601->calib_param.c10 = (p_spl0601->calib_param.c10 & 0x080000) ? (0xFFF00000 | p_spl0601->calib_param.c10) : p_spl0601->calib_param.c10; + h = spl0601_read(HW_ADR, 0x18); + l = spl0601_read(HW_ADR, 0x19); + p_spl0601->calib_param.c01 = (int16_t)h << 8 | l; + h = spl0601_read(HW_ADR, 0x1A); + l = spl0601_read(HW_ADR, 0x1B); + p_spl0601->calib_param.c11 = (int16_t)h << 8 | l; + h = spl0601_read(HW_ADR, 0x1C); + l = spl0601_read(HW_ADR, 0x1D); + p_spl0601->calib_param.c20 = (int16_t)h << 8 | l; + h = spl0601_read(HW_ADR, 0x1E); + l = spl0601_read(HW_ADR, 0x1F); + p_spl0601->calib_param.c21 = (int16_t)h << 8 | l; + h = spl0601_read(HW_ADR, 0x20); + l = spl0601_read(HW_ADR, 0x21); + p_spl0601->calib_param.c30 = (int16_t)h << 8 | l; +} + +/***************************************************************************** + 函 数 名 : spl0601_start_temperature + 功能描述 : 发起一次温度测量 + 输入参数 : void + 输出参数 : 无 + 返 回 值 : + 调用函数 : + 被调函数 : + + 修改历史 : + 1.日 期 : 2015年11月30日 + 作 者 : WL + 修改内容 : 新生成函数 + +*****************************************************************************/ +void spl0601_start_temperature(void) +{ + spl0601_write(HW_ADR, 0x08, 0x02); +} + +/***************************************************************************** + 函 数 名 : spl0601_start_pressure + 功能描述 : 发起一次压力值测量 + 输入参数 : void + 输出参数 : 无 + 返 回 值 : + 调用函数 : + 被调函数 : + + 修改历史 : + 1.日 期 : 2015年11月30日 + 作 者 : WL + 修改内容 : 新生成函数 + +*****************************************************************************/ +void spl0601_start_pressure(void) +{ + spl0601_write(HW_ADR, 0x08, 0x01); +} + +/***************************************************************************** + 函 数 名 : spl0601_start_continuous + 功能描述 : Select node for the continuously measurement + 输入参数 : uint8_t mode 1: pressure; 2: temperature; 3: pressure and temperature + 输出参数 : 无 + 返 回 值 : + 调用函数 : + 被调函数 : + + 修改历史 : + 1.日 期 : 2015年11月25日 + 作 者 : WL + 修改内容 : 新生成函数 + +*****************************************************************************/ +void spl0601_start_continuous(uint8_t mode) +{ + spl0601_write(HW_ADR, 0x08, mode + 4); +} + +/***************************************************************************** + 函 数 名 : spl0601_get_raw_temp + 功能描述 : 获取温度的原始值,并转换成32Bits整数 + 输入参数 : void + 输出参数 : 无 + 返 回 值 : + 调用函数 : + 被调函数 : + + 修改历史 : + 1.日 期 : 2015年11月30日 + 作 者 : WL + 修改内容 : 新生成函数 + +*****************************************************************************/ +void spl0601_get_raw_temp(void) +{ + uint8_t h[3] = {0}; + + h[0] = spl0601_read(HW_ADR, 0x03); + h[1] = spl0601_read(HW_ADR, 0x04); + h[2] = spl0601_read(HW_ADR, 0x05); + + p_spl0601->i32rawTemperature = (int32_t)h[0] << 16 | (int32_t)h[1] << 8 | (int32_t)h[2]; + p_spl0601->i32rawTemperature = (p_spl0601->i32rawTemperature & 0x800000) ? (0xFF000000 | p_spl0601->i32rawTemperature) : p_spl0601->i32rawTemperature; +} + +/***************************************************************************** + 函 数 名 : spl0601_get_raw_pressure + 功能描述 : 获取压力原始值,并转换成32bits整数 + 输入参数 : void + 输出参数 : 无 + 返 回 值 : + 调用函数 : + 被调函数 : + + 修改历史 : + 1.日 期 : 2015年11月30日 + 作 者 : WL + 修改内容 : 新生成函数 + +*****************************************************************************/ +void spl0601_get_raw_pressure(void) +{ + uint8_t h[3]; + + h[0] = spl0601_read(HW_ADR, 0x00); + h[1] = spl0601_read(HW_ADR, 0x01); + h[2] = spl0601_read(HW_ADR, 0x02); + + p_spl0601->i32rawPressure = (int32_t)h[0] << 16 | (int32_t)h[1] << 8 | (int32_t)h[2]; + p_spl0601->i32rawPressure = (p_spl0601->i32rawPressure & 0x800000) ? (0xFF000000 | p_spl0601->i32rawPressure) : p_spl0601->i32rawPressure; +} + +/***************************************************************************** + 函 数 名 : spl0601_get_temperature + 功能描述 : 在获取原始值的基础上,返回浮点校准后的温度值 + 输入参数 : void + 输出参数 : 无 + 返 回 值 : + 调用函数 : + 被调函数 : + + 修改历史 : + 1.日 期 : 2015年11月30日 + 作 者 : WL + 修改内容 : 新生成函数 + +*****************************************************************************/ +float spl0601_get_temperature(void) +{ + float fTCompensate; + float fTsc; + struct spl0601_t *spl = p_spl0601; + + fTsc = spl->i32rawTemperature / (float)spl->i32kT; + fTCompensate = spl->calib_param.c0 * 0.5 + spl->calib_param.c1 * fTsc; + return fTCompensate; +} + +/***************************************************************************** + 函 数 名 : spl0601_get_pressure + 功能描述 : 在获取原始值的基础上,返回浮点校准后的压力值 + 输入参数 : void + 输出参数 : 无 + 返 回 值 : + 调用函数 : + 被调函数 : + + 修改历史 : + 1.日 期 : 2015年11月30日 + 作 者 : WL + 修改内容 : 新生成函数 + +*****************************************************************************/ +float spl0601_get_pressure(void) +{ + float fTsc, fPsc; + float qua2, qua3; + float fPCompensate; + + fTsc = p_spl0601->i32rawTemperature / (float)p_spl0601->i32kT; + fPsc = p_spl0601->i32rawPressure / (float)p_spl0601->i32kP; + qua2 = p_spl0601->calib_param.c10 + fPsc * (p_spl0601->calib_param.c20 + fPsc * p_spl0601->calib_param.c30); + qua3 = fTsc * fPsc * (p_spl0601->calib_param.c11 + fPsc * p_spl0601->calib_param.c21); + // qua3 = 0.9f *fTsc * fPsc * (p_spl0601->calib_param.c11 + fPsc * p_spl0601->calib_param.c21); + + fPCompensate = p_spl0601->calib_param.c00 + fPsc * qua2 + fTsc * p_spl0601->calib_param.c01 + qua3; + // fPCompensate = p_spl0601->calib_param.c00 + fPsc * qua2 + 0.9f *fTsc * p_spl0601->calib_param.c01 + qua3; + return fPCompensate; +} + +float user_spl0601_get() +{ + spl0601_get_raw_temp(); + sys_info.board_temp = spl0601_get_temperature(); + + spl0601_get_raw_pressure(); + sys_info.pressure = spl0601_get_pressure(); + return 0; +} diff --git a/mkrtos_user/server/app/drv/spl06.h b/mkrtos_user/server/app/drv/spl06.h new file mode 100644 index 000000000..286abbdd8 --- /dev/null +++ b/mkrtos_user/server/app/drv/spl06.h @@ -0,0 +1,51 @@ +#ifndef SPL06_01_H +#define SPL06_01_H + +#include "stm32_sys.h" + +#define s32 int32_t +#define HW_ADR 0x76 // SDO LOW +#define CONTINUOUS_PRESSURE 1 +#define CONTINUOUS_TEMPERATURE 2 +#define CONTINUOUS_P_AND_T 3 +#define PRESSURE_SENSOR 0 +#define TEMPERATURE_SENSOR 1 + +struct spl0601_calib_param_t +{ + int16_t c0; + int16_t c1; + int32_t c00; + int32_t c10; + int16_t c01; + int16_t c11; + int16_t c20; + int16_t c21; + int16_t c30; +}; + +struct spl0601_t +{ + struct spl0601_calib_param_t calib_param; /** +sys_info_t sys_info = {0}; + +static pthread_spinlock_t lock; + +void sys_info_lock(void) +{ + pthread_spin_lock(&lock); +} +void sys_info_unlock(void) +{ + pthread_spin_unlock(&lock); +} diff --git a/mkrtos_user/server/app/drv/sysinfo.h b/mkrtos_user/server/app/drv/sysinfo.h new file mode 100644 index 000000000..17353c171 --- /dev/null +++ b/mkrtos_user/server/app/drv/sysinfo.h @@ -0,0 +1,28 @@ + +#include "u_types.h" + +#define CTRL_IO_NUM 10 + +typedef struct +{ + float temp[6]; + int16_t target_val; + + float board_temp; + float pressure; + char text_info[8][12]; + + int auto_ctrl_tick[CTRL_IO_NUM]; + + float noise[3]; + float noise_temp[3]; + uint8_t relay[6]; + + uint8_t netID; + uint8_t devID; +} sys_info_t; + +extern sys_info_t sys_info; + +void sys_info_lock(void); +void sys_info_unlock(void); diff --git a/mkrtos_user/server/app/src/main.c b/mkrtos_user/server/app/src/main.c index 2e193f7dd..17701906c 100644 --- a/mkrtos_user/server/app/src/main.c +++ b/mkrtos_user/server/app/src/main.c @@ -9,23 +9,28 @@ #include "u_env.h" #include "u_hd_man.h" #include "u_ns.h" -#include "test.h" #include "u_rpc.h" +#include "u_sleep.h" +#include "drv.h" +#include "led.h" +#include "test.h" +#include "spl06.h" +#include "sysinfo.h" #include #include int main(int argc, char *args[]) { + drv_init(); printf("argc:%d args[0]:%s\n", argc, args[0]); - ulog_write_str(u_get_global_env()->log_hd, "MKRTOS:\n"); -#if 0 - malloc_test(); - rpc_test(); - ns_test(); -#endif - irq_test(); - // fs_test(); - task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, TASK_THIS)); - ulog_write_str(u_get_global_env()->log_hd, "Error.\n"); + ulog_write_str(u_get_global_env()->log_hd, "app start..\n"); + relay_test(); + while (1) + { + user_spl0601_get(); + u_sleep_ms(500); + printf("temp:%d press:%d\n", (int)(sys_info.board_temp), (int)(sys_info.pressure)); + toogle_led_0(); + } return 0; } diff --git a/mkrtos_user/server/app/src/test.h b/mkrtos_user/server/app/src/test.h deleted file mode 100644 index 23cbdbe70..000000000 --- a/mkrtos_user/server/app/src/test.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -void irq_test(void); -void rpc_test(void); -void fs_test(void); -void ns_test(void); -void malloc_test(void); diff --git a/mkrtos_user/server/app/test/fs_test.c b/mkrtos_user/server/app/test/fs_test.c deleted file mode 100644 index 72c5edc42..000000000 --- a/mkrtos_user/server/app/test/fs_test.c +++ /dev/null @@ -1,21 +0,0 @@ - - -#include "fs_cli.h" -#include -#include -#include -#include -void fs_test(void) -{ - char tmp[4] = "123"; - int fd = fs_open("/test", 0, 0x1 | 0x2 | 0x8); - assert(fd >= 0); - int wlen = fs_write(fd, tmp, 4); - assert(wlen == 4); - int ret = fs_lseek(fd, 0, SEEK_SET); - assert(ret >= 0); - int rlen = fs_read(fd, tmp, 4); - assert(rlen == 4); - assert(strcmp(tmp, "123") == 0); - fs_close(fd); -} diff --git a/mkrtos_user/server/app/test/irq_test.c b/mkrtos_user/server/app/test/irq_test.c deleted file mode 100644 index 5ab4f11d0..000000000 --- a/mkrtos_user/server/app/test/irq_test.c +++ /dev/null @@ -1,59 +0,0 @@ - -#include "u_types.h" -#include "u_prot.h" -#include "u_factory.h" -#include "u_hd_man.h" -#include "u_irq_sender.h" -#include "u_mm.h" -#include "u_log.h" -#include -#include -#include -void timer_init(void) -{ - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); - - TIM_TimeBaseStructure.TIM_Period = 100 - 1; // 自动重装值(此时改为100ms) - TIM_TimeBaseStructure.TIM_Prescaler = 720 - 1; // 时钟预分频 - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数 - TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频1 - TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; - TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); - - TIM_ClearFlag(TIM2, TIM_FLAG_Update); - TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); - TIM_Cmd(TIM2, ENABLE); -} - -void irq_test(void) -{ - obj_handler_t obj = handler_alloc(); - assert(obj != HANDLER_INVALID); - msg_tag_t tag = factory_create_irq_sender(FACTORY_PROT, vpage_create_raw3(0, 0, obj)); - assert(msg_tag_get_val(tag) >= 0); - uirq_bind(obj, TIM2_IRQn, 0); - - tag = mm_align_alloc(MM_PROT, (void *)0x40000000, 0x50000000 - 0x40000000); - assert(msg_tag_get_val(tag) >= 0); - - timer_init(); - - while (1) - { - static int i = 0; - uirq_wait(obj); - ulog_write_str(LOG_PROT, "."); - uirq_ack(obj, TIM2_IRQn); - if ((i++ % 20) == 0) - { - ulog_write_str(LOG_PROT, "\n"); - } - if (i >= 100) - { - break; - } - } - ulog_write_str(LOG_PROT, "irq test success.\n"); - handler_free_umap(obj); -} \ No newline at end of file diff --git a/mkrtos_user/server/app/test/malloc_test.c b/mkrtos_user/server/app/test/malloc_test.c deleted file mode 100644 index fa190fa71..000000000 --- a/mkrtos_user/server/app/test/malloc_test.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -#include -void malloc_test(void) -{ - void *mem = malloc(1024); - assert(mem); - void *mem1 = malloc(1024); - assert(mem1); - free(mem); - free(mem1); - mem = malloc(4 * 1024); - assert(mem); - free(mem); - mem1 = malloc(1024); - assert(mem1); - free(mem1); -} diff --git a/mkrtos_user/server/app/test/ns_test.c b/mkrtos_user/server/app/test/ns_test.c deleted file mode 100644 index a832fb229..000000000 --- a/mkrtos_user/server/app/test/ns_test.c +++ /dev/null @@ -1,43 +0,0 @@ - -#include "u_log.h" -#include "u_prot.h" -#include "u_mm.h" -#include "u_factory.h" -#include "u_thread.h" -#include "u_task.h" -#include "u_ipc.h" -#include "u_env.h" -#include "u_hd_man.h" -#include "u_ns.h" -#include "ns_cli.h" -#include - -void ns_test(void) -{ -#if 0 - int ret; - obj_handler_t tmp_ipc_hd; - - tmp_ipc_hd = handler_alloc(); - assert(tmp_ipc_hd != HANDLER_INVALID); - msg_tag_t tag = factory_create_ipc(FACTORY_PROT, vpage_create_raw3(0, 0, tmp_ipc_hd)); - assert(msg_tag_get_val(tag) >= 0); - ret = cli_ns_register("shell", tmp_ipc_hd); - assert(ret >= 0); - ret = cli_ns_query("shell", &tmp_ipc_hd); - assert(ret >= 0); - ulog_write_str(u_get_global_env()->log_hd, "ns test success.\n"); -#endif - obj_handler_t tmp_ipc_hd; - - tmp_ipc_hd = handler_alloc(); - assert(tmp_ipc_hd != HANDLER_INVALID); - msg_tag_t tag = factory_create_ipc(FACTORY_PROT, vpage_create_raw3(0, 0, tmp_ipc_hd)); - - assert(ns_register("shell", tmp_ipc_hd) >= 0); - obj_handler_t rcv_ipc_hd; - - assert(ns_query("shell", &rcv_ipc_hd) >= 0); - - handler_free_umap(rcv_ipc_hd); -} \ No newline at end of file diff --git a/mkrtos_user/server/app/test/relay_test.c b/mkrtos_user/server/app/test/relay_test.c new file mode 100644 index 000000000..33d59cc25 --- /dev/null +++ b/mkrtos_user/server/app/test/relay_test.c @@ -0,0 +1,12 @@ + +#include "relay.h" + +void relay_test(void) +{ + relay_ctrl(0, 1); + relay_ctrl(1, 1); + relay_ctrl(2, 1); + relay_ctrl(3, 1); + relay_ctrl(4, 1); + relay_ctrl(5, 1); +} diff --git a/mkrtos_user/server/app/test/rpc_test.c b/mkrtos_user/server/app/test/rpc_test.c deleted file mode 100644 index 10e8f9b2e..000000000 --- a/mkrtos_user/server/app/test/rpc_test.c +++ /dev/null @@ -1,147 +0,0 @@ - -#include "u_rpc.h" -#include -#include -typedef struct test_svr -{ - -} test_svr_t; - -static test_svr_t test; - -#if 0 -RPC_GENERATION_OP1(test_svr_t, 0, register, rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0) -{ - printf("var0 val is %d\n", var0->data); - var0->data = 0x112233; - return 1; -} -RPC_GENERATION_DISPATCH1(test_svr_t, 0, register, rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0) -RPC_GENERATION_CALL1(test_svr_t, 0, register, rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0) -#endif -#if 0 -RPC_GENERATION_OP2(test_svr_t, 0, query, - rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, - rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1) -{ - printf("var0 val is %d\n", var0->data); - printf("var1 val is %d\n", var1->data); - var0->data = 0x112233; - var1->data = 0x123456; - return 2; -} - -RPC_GENERATION_DISPATCH2(test_svr_t, 0, query, - rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, - rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1) -RPC_GENERATION_CALL2(test_svr_t, 0, query, - rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, - rpc_int_t, rpc_int_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1) - -msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg) -{ - tag = test_svr_t_query_dispatch(&test, tag, msg); -} -#endif - -#if 0 -RPC_GENERATION_OP2(test_svr_t, 0, query, - rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, - rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1) -{ - printf("var0 val is %s\n", var0->data); - printf("var1 val is %s\n", var1->data); - strcpy(var0->data, "...."); - var0->len = 5; - strcpy(var1->data, "____"); - var1->len = 5; - return 2; -} - -RPC_GENERATION_DISPATCH2(test_svr_t, 0, query, - rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, - rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1) - -RPC_GENERATION_CALL2(test_svr_t, 0, query, - rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, - rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var1) - -msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg) -{ - tag = test_svr_t_query_dispatch(&test, tag, msg); -} -#endif -#if 0 -RPC_GENERATION_OP2(test_svr_t, 0, query, - rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, - rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) -{ - printf("var0 val is %s\n", var0->data); - strcpy(var0->data, "...."); - var0->len = 5; - return 2; -} - -RPC_GENERATION_DISPATCH2(test_svr_t, 0, query, - rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, - rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) - -RPC_GENERATION_CALL2(test_svr_t, 0, query, - rpc_ref_array_uint32_t_uint8_t_32_t, rpc_array_uint32_t_uint8_t_32_t, RPC_DIR_INOUT, RPC_TYPE_DATA, var0, - rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) - -msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg) -{ - tag = test_svr_t_query_dispatch(&test, tag, msg); -} -#endif -RPC_GENERATION_OP2(test_svr_t, 0, query, - rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0, - rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) -{ - printf("dispath ok.\n"); - var0->data = vpage_create_raw3(0, 0, 30).raw; - return 2; -} - -RPC_GENERATION_DISPATCH2(test_svr_t, 0, query, - rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0, - rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) -RPC_GENERATION_CALL2(test_svr_t, 0, query, - rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_OUT, RPC_TYPE_BUF, var0, - rpc_obj_handler_t_t, rpc_obj_handler_t_t, RPC_DIR_IN, RPC_TYPE_BUF, var1) - -msg_tag_t dispatch_test(msg_tag_t tag, ipc_msg_t *msg) -{ - tag = test_svr_t_query_dispatch(&test, tag, msg); -} -void rpc_test(void) -{ - msg_tag_t tag; -#if 0 - rpc_int_t var0 = {.data = 456}; - tag = test_svr_t_register_call(15, &var0); - printf("ret:%d, val is 0x%x\n", msg_tag_get_val(tag), var0.data); -#endif -#if 0 - rpc_int_t var1 = {.data = 123}; - tag = test_svr_t_query_call(15, &var0, &var1); - printf("ret:%d, val is 0x%x, val is 0x%x\n", msg_tag_get_val(tag), var0.data, var1.data); -#endif -#if 0 - uint8_t data_cache[10] = "test"; - uint8_t data_cache1[10] = "tttt"; - rpc_ref_array_uint32_t_uint8_t_32_t var0 = { - .data = data_cache, - .len = strlen(data_cache) + 1}; - rpc_ref_array_uint32_t_uint8_t_32_t var1 = { - .data = data_cache1, - .len = strlen(data_cache1) + 1}; - tag = test_svr_t_query_call(15, &var0, &var1); - printf("ret:%d, val is %s, val is %s.\n", msg_tag_get_val(tag), var0.data, var1.data); -#endif - rpc_obj_handler_t_t var0 = {.data = 0}; - rpc_obj_handler_t_t var1 = {.data = 12}; - tag = test_svr_t_query_call(15, &var0, &var1); - printf("ret:%d\n", msg_tag_get_val(tag)); -} \ No newline at end of file diff --git a/mkrtos_user/server/app/test/test.h b/mkrtos_user/server/app/test/test.h new file mode 100644 index 000000000..5862b1eb0 --- /dev/null +++ b/mkrtos_user/server/app/test/test.h @@ -0,0 +1,3 @@ +#pragma once + +void relay_test(void); diff --git a/setting.cmake b/setting.cmake index dd24d9477..e9e6d89bb 100755 --- a/setting.cmake +++ b/setting.cmake @@ -20,7 +20,7 @@ set(CMAKE_SIZE "${CROSS_COMPILE}size" CACHE PATH "" FORCE) # -mfloat-abi=soft -u _printf_float -set(CMAKE_C_FLAGS "-mcpu=cortex-m3 -mthumb -Os -g -lc -lrdimon -mfloat-abi=soft \ +set(CMAKE_C_FLAGS "-mcpu=cortex-m3 -mthumb -O0 -g -lc -lrdimon -msoft-float -u _printf_float \ -std=gnu11 -ffunction-sections -fdata-sections -fno-builtin \ -nostartfiles -nodefaultlibs -nostdlib -nostdinc -Xlinker \ --gc-sections -fno-stack-protector \