移植 TencentOS-tiny 实时操作系统(一)

2023-11-08

                                      TencentOS tiny

概述

     闲暇之时,移植TencentOS-tiny玩玩,听说这个系统占用资源比较少。好了,我们正面了解一下这个RTOS系统。

本文章有点长,需要耐心阅读,谢谢各位看官,在百忙之中,抽出时间来到这里共同学习。本人水平有限,定会有错误的

地方,如有发现,请大家指出,第一时间更新,谢谢!!

一、TencentOS tiny 的特性

    1、资源占用极少

        TencentOS tiny 最少资源占用:RAM 0.8KB,ROM 1.8KB;在类似烟感和红外等实际场景下,TencentOS tiny 的资源占用仅  为:RAM  2.69KB、ROM 12.38KB。资源占用之少业界领先。

    2、高效功耗管理框架

        完整包含 MCU 和外围设备功耗管理,用户可以根据业务场景选择可参考的低功耗方案,有效降低设备耗电,延长设备寿命。

    3、自动移植工具

        TencentOS tiny 提供多种编译器快速移植指南和移植工具,可实现向新硬件开发板的一键移植,省时省力,有效提升开发效      率。

    4、最后一屏调试工具

       TencentOS tiny 可以自动获取故障现场信息,并保持在端侧存储设备中,触发重启后会自动上传故障信息,可有效解决远程物    联网设备故障信息获取难题,提升故障分析解决效率。

    5、安全分级方案

       TencentOS tiny 提供了多个等级的 IoT 安全方案。您可以根据业务场景和成本要求选择合适的安全解决方案,方便客户在安全 需求和成本控制之间进行有效平衡。

 

二、应用场景

     1、MCU芯片/IOT模组

     TencentOS tiny 支持主流的 MCU 芯片,如 STM32 NXP 等,支持主流通信模组,如 ESP8266 wifi、LoraWAN 模组、NB-IoT 模组等。

     2、物联网终端设备厂家

     TencentOS tiny 提供完整的终端软件栈,简单易用的端云 SDK 缩短设备厂家的开发周期,进而节省终端产品开发成本。

     3、物联网解决方案

     TencentOS tiny 提供一站式软件解决方案,方便各种物联网设备快速接入腾讯云,可支撑智慧城市、智能水表、智能家居、智慧农业、智能穿戴、车联网等多种行业应用。

 

三、移植TencentOS-tiny系统

     闲暇之时,利用一点点时间移植一下TencentOS-tiny系统玩玩。

硬件(MCU):STM32L051C8T6

目前来说TencentOS-tiny比起LiteOS还有一些不足的地方(组件还没有LiteOS完善),但是它占用flash确实是小些,比起LiteOS。

直接进入话题,其实,我已在前一个月就移植好了,现在就是做个记录。

好啦!其实移植很简单,官方已经给我们写了移植步骤,只需一步步按照步骤来进行即可。

不过移植时要注意一些小小地方。

移植前需要做几个步骤:

1、使用STM32CubeMx工具生成demo工程,我的工程名叫STM32L051C8T6

  1)新建工程页面:

   

   

   根据你手上的板子芯片型号来选择,对应的芯片,即可。

   2)时钟配置界面:

   

   3)GPIO管脚配置页面:

  

  

  

  

  配置好后,接着点击生成代码按键,在当前窗口右上角"GENERATE CODE",点击它即可。

  

  

  自动启动Keil IDE 工具

  

  

  

  

  

  

   测试该工程结果

  

  以确保本工程是可以正常运行,继续往下前行。

2、就是在TencentOS-tiny官方下载源码。(现在几乎每天都在更新源码,不断完善中)

     1)源码的地址:https://github.com/Tencent/TencentOS-tiny

     2)克隆源码:

   

注:下载代码,可以使用(GitHub Desktop工具克隆源码) ,这个过程很漫长,需要耐心等待。

3、在这我是基于keil IDE开发的环境,所以我是按照官网教程步骤如下:

 二、内核移植

     1. 代码目录规划

     

    如图所示,新建TencentOS_tiny主目录,并在主目录下添加四个子目录,其中arch、kernel、osal从代码仓直接拷贝过来即可,而board目录下则放入我前面使用STM32CubeMX 工具生成的裸机工程代码,如下图所示: 

 

  2. 添加arch平台代码

  

  引入TencentOS-tiny中的arch文件

  1:arch\arm\arm-v7m\common\tos_cpu.c

  2:arch\arm\arm-v7m\cortex-m0+\armcc\port_c.c 和 arch\arm\arm-v7m\cortex-m0+\armcc\port_s.S

 tos_cpu.c是TencentOS tiny 的CPU适配文件,包括堆栈初始化,中断适配等,如果您的芯片是ARM Cortex M核,该文件可以不 做改动,M0、M3 、M4、M7是通用的,其他IP核需要重新适配;

port_s.S 文件是TencentOS tiny的任务调度汇编代码,主要做弹栈压栈等处理的,port_c.c适配systick等,这两个文件 每个IP核和编译器都是不一样的,如果您的芯片是ARM Cortex M核,我们都已经适配好,比如现在我们移植的芯片是STM32L073RZ,是ARM Cortex M0+核,使用的编译器是KEIL,所以我们选择arch\arm\arm-v7m\cortex-m0+\armcc下的适配代码,如果你的开发板是STM32F429IG,M4核,编译器是GCC,则可以选择arch\arm\arm-v7m\cortex-m4\gcc目录下的适配文件。

 3. 添加内核源码

  把kernel目录下中的core和pm两个文件夹所有.c文件添加进来即可,其中Core下为基础内核,如何还没涉及

  到低功耗,这个pm目录下的.c文件可以不用添加。如下如所示:

  

 4. 添加cmsis os源码

   cmsis os已经帮我们考虑到兼容问题,所以弄了个抽象层OS,这样移植TencentOS tiny的工作量。

   

   cmsis_os.c文件路径:osal\cmsis_os\cmsis_os.c

 5. 添加TencentOS tiny头文件目录

   在工程目录下,新建一个TOS_CONFIG文件夹,同时创建一个tos_config.h文件,用来存放TencentOS tiny的配置头文件。

  如下图所示:

  

  

 6. 新建TencentOS tiny系统配置文件 tos_config.h

  

#ifndef _TOS_CONFIG_H_
#define  _TOS_CONFIG_H_

#include "stm32l0xx.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        0x100	// 配置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	1u	// 配置TencentOS tiny是否开启优先级消息队列模块

#define TOS_CFG_PRIORITY_MAIL_QUEUE_EN	1u		// 配置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

  三、按照上面的步骤,基本上TencentOS tiny移植完成, 接下来测试移植结果。

   1. 修改部分代码

   修改stm32l0xx_it.c的中断函数,在stm32l0xx_it.c文件中包含 tos_k.h 头文件

   

    

   如果不去掉这个选择,那就要在stm32l0xx_it.c文件中的PendSV_Handler函数前添加__weak关键字才行。

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

    

 

/**
  * @brief This function handles System tick timer.
  */
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */
	if(tos_knl_is_running())
	{
		tos_knl_irq_enter();
		tos_tick_handler();
		tos_knl_irq_leave();
	}
  /* USER CODE END SysTick_IRQn 1 */
}

  2. 编写TencentOS tiny 测试任务

   在usart.c文件

           

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

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "cmsis_os.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
//task1
#define TASK1_STK_SIZE		256
void task1(void *pdata);
osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);

//task2
#define TASK2_STK_SIZE		256
void task2(void *pdata);
osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);

void task1(void *pdata)
{
	 int count = 1;
	 while(1)
	 {
			 printf("\r\nHello world!\r\n###This is task1 ,count is %d \r\n", count++);
			 HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
			 osDelay(2000);
	 }
}
void task2(void *pdata)
{
	 int count = 1;
	 while(1)
	 {
			 printf("\r\nHello TencentOS !\r\n***This is task2 ,count is %d \r\n", count++);
			 osDelay(1000);
	 }
}
/* USER CODE END PTD */

 

/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */

.
.
.

/* USER CODE BEGIN 1 */
/*printf() 重定向输出到串口*/
#ifdef __GNUC__
	#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
	#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif /*__GNUC__*/

PUTCHAR_PROTOTYPE
{
	/*通过串口1发送一个字符,ch为字符的存储地址,0xffff为超时时间*/
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
	return ch;
}
/* USER CODE END 1 */

3. 编译下载测试TencentOS tiny移植结果

  

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

	osKernelInitialize(); //TOS Tiny kernel initialize
	osThreadCreate(osThread(task1), NULL);// Create task1
	osThreadCreate(osThread(task2), NULL);// Create task2
	osKernelStart();//Start TOS Tiny

 

5、运行结果:

代码链接

源码链接:Git

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

移植 TencentOS-tiny 实时操作系统(一) 的相关文章

  • MySQL5.7保姆级安装教程

    环境 Linux版本 Mysql版本 待安装 CentOS 7 5 7 1 配置YUM源 在MySQL官网中下载YUM源rpm安装包 http dev mysql com downloads repo yum 目前MySQL官网下载的MyS
  • C++ 的string类学习

    一 string类型变量构造赋值方法 1 构造 1 用等号直接赋值S0 2 定义一个空白变量S1 3 定义一个新变量S2 内容完全等于S0 4 定义一个新变量S3 内容是S0从第八个字符开始的三个字符 5 定义一个新变量S4 用括号赋值 和
  • Python并发编程之线程池/进程池

    转载 http python jobbole com 87272 引言 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程 多进程代码 但是当项目达到一定的规模 频繁创建 销毁进程或者线程是
  • 任意宽度灰度BMP图像读写 V1

    一般BMP图像读写程序只能正确读写宽度为4的倍数的图像 而在图像处理领域所用到的图像宽度不一定满足4的倍数 我在一般BMP图像读写程序基础上进行了改进 使得程序可以读写任意宽度的灰度BMP图像 特分享给大家 希望能够给大家带来帮助 头文件
  • mysql版本5.5.*升级为5.7.*,遇到的问题和解决方法都来看看吧,最终升级成功~

    背景 由于项目比较老 用的数据库版本也是相当低 现在业务需求需要做数据同步 使用FlinkCDC的时候报数据库版本低 查询FlinkCDC要求的最低版本后果断升级mysql FlinkCDC对mysql最低版要求如下图 从 2 2 版本开始
  • 大疆云台和华为P30_超全,一篇文章搞清楚大疆Osmo三款产品区别!

    超全 一篇文章搞清楚大疆Osmo三款产品区别 2020 06 06 17 23 07 33点赞 179收藏 13评论 先说结论吧 Mobile 3适合日常用手机作为主力拍摄工具的人群 手机的拍摄能力以及符合你对画面的要求 另外你还可以接受每
  • code runner 中文使用指南

    Code Runner 用法 运行代码 使用快捷键 Ctrl Alt N 按F1然后选择 键入 Run Code 右键单击文本编辑器 然后在编辑器上下文菜单中单击 Run Code 命令 单击编辑器标题菜单中的 Run Code 按钮 单击
  • 车载毫米波雷达信号处理中的模糊问题仿真分析

    车载毫米波雷达信号处理中的模糊问题仿真分析 概述 车载毫米波雷达在现代汽车领域中扮演着重要的角色 用于实现自动驾驶 智能巡航控制和碰撞警报等功能 然而 在车载毫米波雷达信号处理中 存在各种模糊问题 这些问题可能会影响雷达系统的性能和准确性
  • MySQL数据库之DCL命令

    一 DCL命令 GRANT 授予访问权限 REVOKE 撤销访问权限 COMMIT 提交事务处理 ROLLBACK 事务处理回退 SAVEPOINT 设置保存点 LOCK 对数据库的特定部分进行锁定 查看用户权限 SHOW GRANTS F
  • vue学习笔记(三)

    1 vue开发存在SEO问题 前端开发采用vue开发后是单页面 单页面里面 前后端分离 渲染过程是js写的 在js调用接口返回数据之前 页面已经被打开了 实际上就是空白页面 这个时候右键点击查看源代码 实际上是都看不到内容的 对SEO不太有
  • 什么是节点光端机?总线型光端机有哪些优势?

    节点式光端机又称总线型光端机 其准确的定义是采用单 双纤链路式组网形式的图像传输系统 也被称为链路式光端机 那么 节点式光端机具体是什么呢 总线型光端机又有哪些优势呢 接下来我们就跟随飞畅科技的小编一起来详细了解下吧 什么是节点光端机 节点
  • Android动画+自定义Dialog实现闲鱼发布页面动态效果

    先来看一下效果图 一 新建一个项目DialogView 在layout文件夹下创建一个anmi的文件夹用于存放动画资源 1 首先创建进入Dialog和关闭Dialog时候的主题背景动画 进入Dialog时的动画 main go in xml
  • Ubuntu18 安装ssh

    1 安装ssh 在终端输入命令 sudo apt get install openssh server 2 查看SSH服务是否启动 输入命令 sudo ps e grep ssh

随机推荐