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

一、前言

在上一篇中,我们利用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抽象层osal\cmsis_os\cmsis_os.c文件

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

3.4.添加头文件目录

3.5.编写代码

打开source\hello_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 task1\r\n");
tos_task_delay(2000);
}
}

void task2_entry(void *arg)
{
while (1) {
PRINTF("***I am task2\r\n");
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_AIoT\source里main.c与mqttclient_iot_explorer.c到自建工程source目录下

4.3.添加相关文件

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

TencentOS_Tiny\components\connectivity\mqttclient\common下的mqtt_list.crandom.c

TencentOS_Tiny\components\connectivity\mqttclient\mqtt

TencentOS_Tiny\components\connectivity\mqttclient\mqttclient

TencentOS_Tiny\components\connectivity\mqttclient\network

TencentOS_Tiny\components\connectivity\mqttclient\platform\TencentOS-tiny

TencentOS_Tiny\components\utils\JSON\src

TencentOS_Tiny\platform\hal\nxp\rt1060\src

TencentOS_Tiny\net\at\src

TencentOS_Tiny\net\sal_module_wrapper

TencentOS_Tiny\devices\esp8266

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

为方便后期修改配置,可添加tos_config\mqtt_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-master\doc\30.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文件类型

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

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