|  | 
 
| 腾讯物联网终端操作系统(TencentOS tiny)是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,安全可靠等特点,可有效提升物联网终端产品开发效率。TencentOS tiny 提供精简的 RTOS 内核,内核组件可裁剪可配置,可快速移植到多种主流 MCU 及模组芯片上。而且,基于RTOS内核提供了丰富的物联网组件,内部集成主流物联网协议栈(如 CoAP/MQTT/TLS/DTLS/LoRaWAN/NB-IoT 等),可助力物联网终端设备及业务快速接入腾讯云物联网平台。 在tencentos 移植机智云协议,可以为后续腾讯云平台联合机智云平台开发提供便捷的途径。
 
 首先,新建一个项目,选择腾讯os,选择对应的单片机芯片
 
 
 
  
 然后,我们创建Gizwits 和utils文件夹,并且把从机智云平台下载的通用代码对应文件夹内的文件复制进去
 
 
 
  
 然后到编译器里包含对应的文件夹,格式如图所示:
 
 
 
  
 配置对应的串口中断和定时器中断:
 
 
 复制代码void UART5_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void TIM6_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
/* Global Variable */
void Uart5_Init(void){
    GPIO_InitTypeDef  GPIO_InitStructure = {0};
    USART_InitTypeDef USART_InitStructure = {0};
    NVIC_InitTypeDef  NVIC_InitStructure = {0};
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_Init(UART5, &USART_InitStructure);
    USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);
    NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    USART_Cmd(UART5, ENABLE);
}
void Tim6_init(){
    TIM_TimeBaseInitTypeDef TIM_InitStructure={0};
    NVIC_InitTypeDef  NVIC_InitStructure = {0};
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
    TIM_InitStructure.TIM_Period=1000-1;
    TIM_InitStructure.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_InitStructure.TIM_Prescaler=96-1;
    TIM_InitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseInit(TIM6, &TIM_InitStructure);
    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
    NVIC_InitStructure.NVIC_IRQChannel=TIM6_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    TIM_Cmd(TIM6, ENABLE);
}
 
 在中断里引用对应机智云需要的函数:
 
 
 
  
 完善机智云对应的函数:
 
 
 复制代码int32_t uartWrite(uint8_t *buf, uint32_t len)
{
    uint32_t i = 0;
    
    if(NULL == buf)
    {
        return -1;
    }
    
    #ifdef PROTOCOL_DEBUG
    GIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);
    for(i=0; i<len; i++)
    {
        GIZWITS_LOG("%02x ", buf[i]);
    }
    GIZWITS_LOG("\n");
    #endif
    for(i=0; i<len; i++)
    {
        //USART_SendData(UART, buf[i]);//STM32 test demo
        //Serial port to achieve the function, the buf[i] sent to the module
        USART_SendData(UART5, buf[i]);
        while (USART_GetFlagStatus(UART5, USART_FLAG_TXE) == RESET);
        if(i >=2 && buf[i] == 0xFF)
        {
          //Serial port to achieve the function, the 0x55 sent to the module
          //USART_SendData(UART, 0x55);//STM32 test demo
            USART_SendData(UART5, 0x55);
            while (USART_GetFlagStatus(UART5, USART_FLAG_TXE) == RESET);
        }
    }
    
    return len;
}
 在tencent os里新建任务,任务里运行机智云的线程:
 
 
 复制代码#define TASK1_STK_SIZE       2048
k_task_t task1;
__aligned(4) uint8_t task1_stk[TASK1_STK_SIZE];
void task1_entry(void *arg)
{
    while (1)
    {
        userHandle();
        gizwitsHandle((dataPoint_t *)¤tDataPoint);
        tos_task_delay(10);
    }
}
 在开始任务调度前初始化数据点,然后启动任务和进程调度:
 
 复制代码userInit();
        gizwitsInit();
    tos_knl_init();
    tos_task_create(&task1, "task1", task1_entry, NULL, 3, task1_stk, TASK1_STK_SIZE, 0); // Create task1
    tos_knl_start();
 效果展示:
 
 
 
 | 
 |