准备工作

开发板

AIR105开发板

版本axios_单片机

工具

  • MDK 5.36
  • Luatools_v2 下载链接
  • sscom

软件

  • air105 MDK版本下的Demo例程 下载链接
  • TencentOS-tiny软件包 下载链接

移植

  • AIR105官方给出的开发环境是LuatOS,也适配了国产RTOS RT-Thread ,项目使用了TencentOS-tiny但是由于ST的芯片价格不是很稳定,想着尝试用air105试下,TencentOS并没有air105的移植demo,想要在air105上运行TencentOS需要适配的IP核架构(含M核中断、调度、tick相关代码),自己实现有点难度。
  • 既然官方适配了RT-Thread那么也就有内核相关的代码,通过RT-Thread Studio打开air105的工程发现使用的是"cortex-m4"的代码,既然这样理论上TencentOS中的“cortex-m4”IP核架构代码在air105上也能使用。

复制必要文件

  • 这里用air105 mdk版本的gpio工程模板,将TencentOS的源码复制到工程目录;

添加内核文件

  • 打开工程,根据TencentOS的移植指南 链接 添加TencentOS tiny的内核代码到工程
  • 1 、添加arch平台代码

需要添加的文件:

路径

文件名

Tencen_OS\arch\arm\arm-v7m\common

tos_cpu.c

Tencen_OS\arch\arm\arm-v7m\cortex-m4\armcc

port_c.c

port_s.S

  • 2、添加内核源码

    将“Tencen_OS\kernel\core”目录下的所有c文件添加进来;
  • 3、添加cmsis os源码
    cmsis os是TencentOS tiny为了兼容cmsis标准而适配的OS抽象层

    文件目录:“Tencen_OS\osal\cmsis_os”
  • 4、添加头文件目录
    添加头文件目录前,我们在要移植的工程目录下新增一个 TOS_CONFIG文件夹,用于存放TencentOS tiny的配置头文件,也就是接下来要新建的tos_config.h文件;
  • 5、新建TencentOS tiny系统配置文件 tos_config.h
#ifndef _TOS_CONFIG_H_
#define  _TOS_CONFIG_H_

#include "air105.h"	// 目标芯片头文件

#define TOS_CFG_TASK_PRIO_MAX           10u 	// 配置TencentOS tiny默认支持的最大优先级数量

#define TOS_CFG_ROUND_ROBIN_EN          0u		// 配置TencentOS tiny的内核是否开启时间片轮转

#define TOS_CFG_OBJECT_VERIFY_EN           1u	// 配置TencentOS tiny是否校验指针合法

#define TOS_CFG_TASK_DYNAMIC_CREATE_EN  1u		// TencentOS tiny 动态任务创建功能宏

#define TOS_CFG_EVENT_EN                1u		// TencentOS tiny 事件模块功能宏

#define TOS_CFG_MMBLK_EN                1u		//配置TencentOS tiny是否开启内存块管理模块

#define TOS_CFG_MMHEAP_EN               1u		//配置TencentOS tiny是否开启动态内存模块

#define TOS_CFG_MMHEAP_DEFAULT_POOL_EN  1u		// TencentOS tiny 默认动态内存池功能宏

#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE        1024*10	// 配置TencentOS tiny默认动态内存池大小

#define TOS_CFG_MUTEX_EN                1u		// 配置TencentOS tiny是否开启互斥锁模块

#define TOS_CFG_MESSAGE_QUEUE_EN        1u		// 配置TencentOS tiny是否开启消息队列模块

#define TOS_CFG_MAIL_QUEUE_EN           1u		// 配置TencentOS tiny是否开启消息邮箱模块

#define TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN	0u	// 配置TencentOS tiny是否开启优先级消息队列模块

#define TOS_CFG_PRIORITY_MAIL_QUEUE_EN	0u		// 配置TencentOS tiny是否开启优先级消息邮箱模块

#define TOS_CFG_TIMER_EN                1u		// 配置TencentOS tiny是否开启软件定时器模块

#define TOS_CFG_PWR_MGR_EN              0u		// 配置TencentOS tiny是否开启外设电源管理模块

#define TOS_CFG_TICKLESS_EN             0u		// 配置Tickless 低功耗模块开关

#define TOS_CFG_SEM_EN                  1u		// 配置TencentOS tiny是否开启信号量模块

#define TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN      1u	// 配置TencentOS tiny是否开启任务栈深度检测

#define TOS_CFG_FAULT_BACKTRACE_EN      0u		// 配置TencentOS tiny是否开启异常栈回溯功能

#define TOS_CFG_IDLE_TASK_STK_SIZE      128u	// 配置TencentOS tiny空闲任务栈大小

#define TOS_CFG_CPU_TICK_PER_SECOND     1000u	// 配置TencentOS tiny的tick频率

#define TOS_CFG_CPU_CLOCK               (SystemCoreClock)	// 配置TencentOS tiny CPU频率

#define TOS_CFG_TIMER_AS_PROC           1u		// 配置是否将TIMER配置成函数模式\

#endif
  • 5、编译
    修改 air105_it.c文件,将下面两个函数屏蔽,TencentOS tiny中已经定义了,不然编译会报错
void HardFault_Handler(void)
{
    /* Go to infinite loop when Hard Fault exception occurs */
    while (1)
    {
    }
}

void PendSV_Handler(void)
{
}

版本axios_嵌入式硬件_02


没有屏蔽的时候

版本axios_嵌入式硬件_03


屏蔽后编译通过

版本axios_单片机_04


版本axios_嵌入式硬件_05


版本axios_单片机_06

创建TencentOS tiny任务,测试移植结果

1、修改部分代码

在air105_it.c文件中包含 tos_k.h 头文件

版本axios_单片机_07


在TIM0_0_IRQHandler函数中添加TencentOS tiny的调度处理函数,如下图所示:

版本axios_#define_08


2. 编写TencentOS tiny 测试任务

在mian.c 中添加TencentOS tiny 头文件,编写任务函数

void test_task(void *arg)
{
	for(;;)
	{
		GPIO_ToggleBits(GPIOD, GPIO_Pin_14|GPIO_Pin_15);
		printf("test_task \n");
		osDelay(1000);
	}
}

void led_task(void *arg)
{
	GPIO_InitTypeDef gpio;
	gpio.GPIO_Pin = GPIO_Pin_3;
	gpio.GPIO_Mode = GPIO_Mode_Out_PP;
	gpio.GPIO_Remap = GPIO_Remap_1;
	GPIO_Init(GPIOC, &gpio);
	for(;;)
	{
		GPIO_ToggleBits(GPIOC, GPIO_Pin_3);
		printf("led_task \n");
		osDelay(100);
	}
}

版本axios_单片机_09


继续在main.c 的mian函数中硬件外设初始化代码后添加TencentOS tiny的初始化代码:

osKernelInitialize(); //TOS Tiny kernel initialize
osThreadCreate(osThread(test_task), NULL);  
osThreadCreate(osThread(led_task), NULL);	
osKernelStart(); //Start TOS Tiny

版本axios_嵌入式硬件_10


3、编译生成bin文件

版本axios_固件_11

固件下载

制作.soc固件包,使用Luatools_v2 工具下载固件需要.soc格式的固件包

1、获取官方固件包,找到Luatools所在的文件夹,文件夹的resource/105_lua_lod中的就是自动下载的正式版本固件包

版本axios_嵌入式硬件_12

2、将固件包复制到工程目录并通过解压工具解压

版本axios_固件_13


3、进入解压后的文件夹,删除bin文件

版本axios_固件_14


版本axios_固件_15


4、将我们自己工程生成的bin文件添加到这个文件夹

版本axios_嵌入式硬件_16


5、修改info.json文件,将下图标记的两处地方改为自己bin文件的名字

版本axios_固件_17


修改后

版本axios_#define_18


6、将文件夹中的三个文件再次通过压缩软件打包,压缩格式为tar,文件名后缀为soc

版本axios_#define_19


版本axios_单片机_20


得到新的固件包

版本axios_固件_21


固件下载

打开Luatools_v2进入固件下载

版本axios_单片机_22


下载会提示异常,不用管,实际已经下载完成

版本axios_固件_23

查看移植情况

打开串口,波特率选择115200,会有任务交替运行的log打印,开发板的led等交替闪烁

版本axios_版本axios_24


至此 成功在air105上运行encentOS-tiny!!!!!

完整项目工程