开放原子训练营(第四季)Tobus——TobudOs移植教学

TobudOs的优势:

(1).小体积

最小内核:RAM 0.6KB,ROM 1.8KB 典型 LoraWAN 及传感器应用:RAM 3.3KB,ROM 12KB

(2).低功耗

休眠最低功耗低至 2uA 支持外设功耗管理框架

(3).丰富的 IoT 组件

集成主流 IoT 协议栈 多种通信模组 SAL 层适配框架; 支持 OTA 升级 提供简单易用端云 API,加速用户业务接入腾讯云

(4).可靠的安全框架

多样化的安全分级方案 均衡安全需求&成本控制

(5).良好的可移植性

内核及 IoT 组件高度解耦,提供标准适配层 提供自动化移植工具,提升开发效率

(6).便捷的调试手段

提供云化的最后一屏调试功能 故障现场信息自动上传云平台,方便开发人员调试分析

TobudOs整体框架:

c0f9f3b06a084e1ebba3944e96bde0bb.png

移植:

1:gitee下载OS源码

https://gitee.com/Tencent/TencentOS-tiny?_from=gitee_search

2:准备裸机工程

我选用的芯片为stm32l051

根据自己芯片配置时钟频率,一个串口,一个灯

d53072a05b9e49709ee2db6a27daf152.png

 

69962b20d0d0447f86a3e9278ff2e764.png

3:添加源码

在工程目录下创建以下文件

arch:硬件与软件之间的桥梁

 

kernel:核心源码

board不用看后续在工程中创建,负责宏定义裁剪tobudos

fb057b64c5fd4255ac3f46c1550f34f0.png

 

 

 

在arch中根据自身芯片在源码文件中的arch中选择自身芯片架构文件

164b11b918a340c3b16554f8265f16d9.png

 在kernel中添加源码文件下kernel下所有文件

a708f5d313d844d9b98334ef5555b8cc.png

进入keil将源码加入工程中project

a6e32fa1be084751b15e3ce276f556af.png

tos_cpu.c 根据架构不同位于arch/arm/arm-vxx下的common文件中

是 TencentOS tiny 的 CPU 适配文件,如果芯片是 ARM Cortex M 核,该文件可以不做改动,M0、M3、M4、M7 是通用的,其他 IP 核需要重新适配;

port_s.S 与port_c.c需要根据芯片架构以及编译器选择

比如现在我选择芯片是 STM32L051,是 ARM Cortex M0+核,使用的编译器是 KEIL,所以我们选择 arch\arm\arm-v7m\cortex-m0+\armcc 下的适配代码,如果你的开发板是 STM32F103,M3 核,编译器是 GCC,则可以选择 arch\arm\arm-v7m\cortex-m3\gcc 目录下的适配文件

e7ac0ecf71414930975657a1b11b1d6b.png

再将kernel下的core文件下的所有.c文件添加进来

以及创建一个tos/config文件

f061ea30f12b4c2d91cf9e816330d868.png

最后别忘记把头文件路径添加进来

 

4:配置裁剪宏定义

添加头文件tos_config_h

命名必须为tos_config_h

98876ace114048d0b53fe121c72bd520.png

在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

 

5:修改中断

1:注销Pendsv中断或者添加__weak因为源码已经实现pendsv中断了

2:修改Systick中断添加以下内容

#include "tos_k.h"//头文件集合

void SysTick_Handler(void)
{
 
      HAL_IncTick();

	if(tos_knl_is_running())//判断是否启动调度器
	{
		tos_knl_irq_enter();//通知内核进入中断了

		tos_tick_handler();//实际处理函数

		tos_knl_irq_leave();//通知内核中断退出
	}

}

 最后尝试编译看看是否有无错误

测试:

一个高优先级串口任务发送7个数据结束生命

结束生命周期后轮到低优先级led任务

#include "main.h"
#include "usart.h"
#include "gpio.h"

#include "tos_k.h"

k_stack_t task_1_stack[512];
k_task_t task_1;

k_stack_t task_2_stack[512];
k_task_t task_2;

void board_init(void)
{
	  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_USART1_UART_Init();
}


void task_1_handler(void* parameter)
{
	uint8_t i=0x01;
	for(;i!=0x80;i<<=1)
	{
		HAL_UART_Transmit(&huart1,&i,1,100);
		HAL_Delay(1000);
	}
}
void task_2_handler(void* parameter)
{
	tos_task_destroy(&task_1);
	while(1)
	{
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
		tos_task_delay(1000);
	}
}
int main(void)
{
	board_init();//硬件初始化
	
	tos_knl_init();//初始化内核
	
	tos_task_create(&task_1,"task1",task_1_handler,NULL,1,task_1_stack,512,100);
	tos_task_create(&task_2,"task2",task_2_handler,NULL,1,task_2_stack,512,100);
	
	tos_knl_start();//启动调度器


}

 

实验现象为发送完7个数据后,led开始工作2eeaf10452be4e32be93c251cbab9177.jpg

 

 

 

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值