准备工作
开发板
AIR105开发板
工具
- 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)
{
}
没有屏蔽的时候
屏蔽后编译通过
创建TencentOS tiny任务,测试移植结果
1、修改部分代码
在air105_it.c文件中包含 tos_k.h 头文件
在TIM0_0_IRQHandler函数中添加TencentOS tiny的调度处理函数,如下图所示:
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);
}
}
继续在main.c 的mian函数中硬件外设初始化代码后添加TencentOS tiny的初始化代码:
osKernelInitialize(); //TOS Tiny kernel initialize
osThreadCreate(osThread(test_task), NULL);
osThreadCreate(osThread(led_task), NULL);
osKernelStart(); //Start TOS Tiny
3、编译生成bin文件
固件下载
制作.soc固件包,使用Luatools_v2 工具下载固件需要.soc格式的固件包
1、获取官方固件包,找到Luatools所在的文件夹,文件夹的resource/105_lua_lod中的就是自动下载的正式版本固件包
2、将固件包复制到工程目录并通过解压工具解压
3、进入解压后的文件夹,删除bin文件
4、将我们自己工程生成的bin文件添加到这个文件夹
5、修改info.json文件,将下图标记的两处地方改为自己bin文件的名字
修改后
6、将文件夹中的三个文件再次通过压缩软件打包,压缩格式为tar,文件名后缀为soc
得到新的固件包
固件下载
打开Luatools_v2进入固件下载
下载会提示异常,不用管,实际已经下载完成
查看移植情况
打开串口,波特率选择115200,会有任务交替运行的log打印,开发板的led等交替闪烁
至此 成功在air105上运行encentOS-tiny!!!!!
完整项目工程