合宙air105 MDK环境移植TencentOS-tiny

准备工作

开发板

AIR105开发板
合宙air105 MDK环境移植TencentOS-tiny_第1张图片

工具

  • 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环境移植TencentOS-tiny_第2张图片

复制必要文件

  • 这里用air105 mdk版本的gpio工程模板,将TencentOS的源码复制到工程目录;
    合宙air105 MDK环境移植TencentOS-tiny_第3张图片

添加内核文件

  • 打开工程,根据TencentOS的移植指南 链接 添加TencentOS tiny的内核代码到工程
    • 1 、添加arch平台代码
      合宙air105 MDK环境移植TencentOS-tiny_第4张图片

需要添加的文件:

路径 文件名
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、添加内核源码
    合宙air105 MDK环境移植TencentOS-tiny_第5张图片
    将“Tencen_OS\kernel\core”目录下的所有c文件添加进来;
  • 3、添加cmsis os源码
    cmsis os是TencentOS tiny为了兼容cmsis标准而适配的OS抽象层
    合宙air105 MDK环境移植TencentOS-tiny_第6张图片
    文件目录:“Tencen_OS\osal\cmsis_os”
  • 4、添加头文件目录
    添加头文件目录前,我们在要移植的工程目录下新增一个 TOS_CONFIG文件夹,用于存放TencentOS tiny的配置头文件,也就是接下来要新建的tos_config.h文件;
    合宙air105 MDK环境移植TencentOS-tiny_第7张图片
  • 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)
{
}

合宙air105 MDK环境移植TencentOS-tiny_第8张图片
没有屏蔽的时候
合宙air105 MDK环境移植TencentOS-tiny_第9张图片
屏蔽后编译通过
合宙air105 MDK环境移植TencentOS-tiny_第10张图片
合宙air105 MDK环境移植TencentOS-tiny_第11张图片
合宙air105 MDK环境移植TencentOS-tiny_第12张图片

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

1、修改部分代码
在air105_it.c文件中包含 tos_k.h 头文件
合宙air105 MDK环境移植TencentOS-tiny_第13张图片
在TIM0_0_IRQHandler函数中添加TencentOS tiny的调度处理函数,如下图所示:
合宙air105 MDK环境移植TencentOS-tiny_第14张图片
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);
	}
}

合宙air105 MDK环境移植TencentOS-tiny_第15张图片
继续在main.c 的mian函数中硬件外设初始化代码后添加TencentOS tiny的初始化代码:

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

合宙air105 MDK环境移植TencentOS-tiny_第16张图片
3、编译生成bin文件
合宙air105 MDK环境移植TencentOS-tiny_第17张图片

固件下载

制作.soc固件包,使用Luatools_v2 工具下载固件需要.soc格式的固件包
1、获取官方固件包,找到Luatools所在的文件夹,文件夹的resource/105_lua_lod中的就是自动下载的正式版本固件包
合宙air105 MDK环境移植TencentOS-tiny_第18张图片

2、将固件包复制到工程目录并通过解压工具解压
合宙air105 MDK环境移植TencentOS-tiny_第19张图片
3、进入解压后的文件夹,删除bin文件
合宙air105 MDK环境移植TencentOS-tiny_第20张图片
合宙air105 MDK环境移植TencentOS-tiny_第21张图片
4、将我们自己工程生成的bin文件添加到这个文件夹
合宙air105 MDK环境移植TencentOS-tiny_第22张图片
5、修改info.json文件,将下图标记的两处地方改为自己bin文件的名字
合宙air105 MDK环境移植TencentOS-tiny_第23张图片
修改后
合宙air105 MDK环境移植TencentOS-tiny_第24张图片
6、将文件夹中的三个文件再次通过压缩软件打包,压缩格式为tar,文件名后缀为soc
合宙air105 MDK环境移植TencentOS-tiny_第25张图片
合宙air105 MDK环境移植TencentOS-tiny_第26张图片
得到新的固件包
合宙air105 MDK环境移植TencentOS-tiny_第27张图片
固件下载
打开Luatools_v2进入固件下载
合宙air105 MDK环境移植TencentOS-tiny_第28张图片
下载会提示异常,不用管,实际已经下载完成
合宙air105 MDK环境移植TencentOS-tiny_第29张图片

查看移植情况
打开串口,波特率选择115200,会有任务交替运行的log打印,开发板的led等交替闪烁
合宙air105 MDK环境移植TencentOS-tiny_第30张图片
至此 成功在air105上运行encentOS-tiny!!!!!

完整项目工程

github
gitee

你可能感兴趣的:(程序员,嵌入式,单片机,嵌入式硬件)