AIoT应用创新大赛-keil开发--(2)移植TencentOS tiny与对接腾讯云IoT

2022-01-09 17:51:49 浏览数 (1)

一、前言

在上一篇中,我们利用MCUXpresso Config Tools生出来一个Hello World 的裸机工程,这一篇将在Keil环境下移植TencentOS tiny到这个裸机工程,并移植对接腾讯云的工程。

源码中也有相关工程参考https://github.com/OpenAtomFoundation/TencentOS-tiny/tree/master/board/TencentOS_Tiny_EVB_MX_Plus/KEIL


二、前期准备

  • 本系列文章第一篇中安装的软件环境
  • 在第一篇文章中使用MCUXpresso Config Tools搭建的Hello World 裸机工程
  • TencentOS-Tiny-AIoT开发板硬件资料(比赛微信群公告中的资料包中文件)
  • NXP_RT1062_TencentOS_Tiny_AIoT.rar(比赛微信群公告中的资料包中文件)
  • TencentOS-tiny源码(可在Github代码仓码云代码仓下载)

三、移植TencentOS tiny

3.1.准备文件

将NXP_RT1062_TencentOS_Tiny_AIoT里面的TencentOS_Tiny文件夹复制到自建工程根目录下(也从官方源码中复制文件,都可以)

主要使用文件如下表

一级目录

二级目录

说明

arch

arm

TencentOS tiny适配的IP核架构(含M核中断、调度、tick相关代码)

board

NUCLEO_L073RZ

移植目标芯片的工程文件

kernel

core

TencentOS tiny内核源码

pm

TencentOS tiny低功耗模块源码

osal

cmsis_os

TencentOS tiny提供的cmsis os 适配

效果如图

3.2.配置工程

打开keil工程,这里建议从hello_world1 flexspi_nor_debughello_world1 flexspi_nor_sdram_debug选择一个作为后续开发工程。这两个配置都是把程序固化到flash里面的,其中hello_world1 flexspi_nor_debug是没有在DCD初始化好SDRAM的hello_world1 flexspi_nor_sdram_debug是在DCD中初始化好SDRAM的。简单可以理解为,如果后续开发不使用SDRAM就用第一个,使用的话就用第二个,这里后期也是能自由切换的。这里笔者就使用hello_world1 flexspi_nor_sdram_debug作为演示。

3.3.添加相关文件

添加arch平台代码

添加kernel/core下所有.c文件(pm为低功耗组件,可不用添加)

添加cmsis抽象层osalcmsis_oscmsis_os.c文件

为方便后期修改配置,可添加tos_configtos_config.h文件

3.4.添加头文件目录

3.5.编写代码

打开sourcehello_world.c文件,写个程序试试水

代码语言:javascript复制
#include "fsl_device_registers.h"
#include "fsl_debug_console.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
#include "tos_k.h"

void SysTick_Handler(void)
{
  if (tos_knl_is_running())
  {
    tos_knl_irq_enter();
    tos_tick_handler();
    tos_knl_irq_leave();
  }
} 

#define TASK1_STK_SIZE       1024
k_task_t task1;
uint8_t task1_stk[TASK1_STK_SIZE];


#define TASK2_STK_SIZE       1024
k_task_t task2;
uint8_t task2_stk[TASK2_STK_SIZE];

void task1_entry(void *arg)
{
    while (1) {
    	PRINTF("###I am task1rn");
        tos_task_delay(2000);
    }
}

void task2_entry(void *arg)
{
    while (1) {
    	PRINTF("***I am task2rn");
        tos_task_delay(1000);
    }
}

int main(void)
{
    char ch;

    /* Init board hardware. */
    BOARD_ConfigMPU();
    BOARD_InitBootPins();
    BOARD_InitBootClocks();
    BOARD_InitDebugConsole();
    SystemCoreClockUpdate();

    tos_knl_init(); // TencentOS Tiny kernel initialize
    tos_task_create(&task1, "task1", task1_entry, NULL, 4, task1_stk, TASK1_STK_SIZE, 0); // Create task1
    tos_task_create(&task2, "task2", task2_entry, NULL, 3, task2_stk, TASK2_STK_SIZE, 0);// Create task2
    tos_knl_start();
}

3.6.编译下载,打开串口助手查看现象


四、对接腾讯云IoT

4.1.配置引脚

打开工程的MCUXpresso Config Tools配置文件

参考IO表,配置uart2与LED

具体配置如下图(注意重命名)

点击更新源代码

4.2.准备文件

大部分文件都在第三步准备好了

拷贝NXP_RT1062_TencentOS_Tiny_AIoTsource里main.c与mqttclient_iot_explorer.c到自建工程source目录下

4.3.添加相关文件

这里因为Keil没有二级目录管理,因此文件夹显得比较多,按照自己的实际习惯添加即可

TencentOS_Tinycomponentsconnectivitymqttclientcommon下的mqtt_list.crandom.c

TencentOS_Tinycomponentsconnectivitymqttclientmqtt

TencentOS_Tinycomponentsconnectivitymqttclientmqttclient

TencentOS_Tinycomponentsconnectivitymqttclientnetwork

TencentOS_TinycomponentsconnectivitymqttclientplatformTencentOS-tiny

TencentOS_TinycomponentsutilsJSONsrc

TencentOS_Tinyplatformhalnxprt1060src

TencentOS_Tinynetatsrc

TencentOS_Tinynetsal_module_wrapper

TencentOS_Tinydevicesesp8266

添加这些文件夹下所有.c文件

为方便后期修改配置,可添加tos_configmqtt_config.h文件

删除hello_world.c添加main.cmqttclient_iot_explorer.c

4.4.添加头文件目录

4.5.修改工程设置

加入SDK_DEBUGCONSOLE_UART全局宏,使代码支持printf函数

4.6.修改代码

*main.c

注释掉17行 #include "ec600s.h"

添加

代码语言:javascript复制
void SysTick_Handler(void)
{
  if (tos_knl_is_running())
  {
    tos_knl_irq_enter();
    tos_tick_handler();
    tos_knl_irq_leave();
  }
}

可以注释掉LPUART4_IRQHandler函数

*mqttclient_iot_explorer.c

注释掉第8行#include "ec600s.h"

4.7.配置云

参考https://gitee.com/Tencent/TencentOS-tiny/blob/master/doc/30.TencentOS_Tiny_EVB_AIoT_QuickStart.md 四. EVB_AIoT开发板上使用TencentOS tiny对接腾讯云IoT Explorer进行操作

也可在下载的源码中找到:TencentOS-tiny-masterdoc30.TencentOS_Tiny_EVB_AIoT_QuickStart.md

4.8.编译下载运行

五、可能碰到的问题与建议

5.1.为啥在3.3步中添加arch平台代码添加的是GCC文件下的代码

MDK AC6在汇编上的语法支持很接近GCC,对于工程默认配置来说添加GCC文件夹下最简单

如果想添加armcc文件夹下的文件,请按下图修改

5.2.无法进入任务

检查是否添加下面代码

代码语言:javascript复制
void SysTick_Handler(void)
{
  if (tos_knl_is_running())
  {
    tos_knl_irq_enter();
    tos_tick_handler();
    tos_knl_irq_leave();
  }
}

5.3.运行printf后卡死

加入SDK_DEBUGCONSOLE_UART全局宏

5.4.出现FCARM - Output Name not specified, please check 'Options for Target - Utilities'编译提示

检查出现错误的文件类型是否正确,例如

该图是正确的.h文件类型该图是正确的.h文件类型

5.5.出现source/main.c(115): error: use of undeclared identifier 'BOARD_INITPINS_LED_GPIO'错误

配置并修改LED的标签与标识符

5.6.TencentOS tiny学习建议

可以参考下面两个链接学习

https://gitee.com/Tencent/TencentOS-tiny/blob/master/doc/04.Development_Manual.md

https://gitee.com/Tencent/TencentOS-tiny/blob/master/doc/05.SDK_Manual.md

有其他问题可在本文下交流

0 人点赞