在上一篇中,我们利用MCUXpresso Config Tools生出来一个Hello World 的裸机工程,这一篇将在Keil环境下移植TencentOS tiny到这个裸机工程,并移植对接腾讯云的工程。
将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 适配 |
效果如图
打开keil工程,这里建议从hello_world1 flexspi_nor_debug
与hello_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
作为演示。
添加arch平台代码
添加kernel/core
下所有.c文件(pm为低功耗组件,可不用添加)
添加cmsis抽象层osal\cmsis_os\cmsis_os.c
文件
为方便后期修改配置,可添加tos_config\tos_config.h
文件
打开source\hello_world.c
文件,写个程序试试水
#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();
}
打开工程的MCUXpresso Config Tools配置文件
参考IO表,配置uart2与LED
具体配置如下图(注意重命名)
点击更新源代码
大部分文件都在第三步准备好了
拷贝NXP_RT1062_TencentOS_Tiny_AIoT\source里main.c与mqttclient_iot_explorer.c
到自建工程source
目录下
这里因为Keil没有二级目录管理,因此文件夹显得比较多,按照自己的实际习惯添加即可
TencentOS_Tiny\components\connectivity\mqttclient\common
下的mqtt_list.c
与random.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.c
与mqttclient_iot_explorer.c
加入SDK_DEBUGCONSOLE_UART
全局宏,使代码支持printf函数
*main.c
注释掉17行 #include "ec600s.h"
添加
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"
参考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
MDK AC6在汇编上的语法支持很接近GCC,对于工程默认配置来说添加GCC文件夹下最简单
如果想添加armcc文件夹下的文件,请按下图修改
检查是否添加下面代码
void SysTick_Handler(void)
{
if (tos_knl_is_running())
{
tos_knl_irq_enter();
tos_tick_handler();
tos_knl_irq_leave();
}
}
加入SDK_DEBUGCONSOLE_UART
全局宏
检查出现错误的文件类型是否正确,例如
配置并修改LED的标签与标识符
可以参考下面两个链接学习
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
有其他问题可在本文下交流
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。