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整体框架:
移植:
1:gitee下载OS源码
https://gitee.com/Tencent/TencentOS-tiny?_from=gitee_search
2:准备裸机工程
我选用的芯片为stm32l051
根据自己芯片配置时钟频率,一个串口,一个灯
3:添加源码
在工程目录下创建以下文件
arch:硬件与软件之间的桥梁
kernel:核心源码
board不用看后续在工程中创建,负责宏定义裁剪tobudos
在arch中根据自身芯片在源码文件中的arch中选择自身芯片架构文件
在kernel中添加源码文件下kernel下所有文件
进入keil将源码加入工程中project
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 目录下的适配文件
再将kernel下的core文件下的所有.c文件添加进来
以及创建一个tos/config文件
最后别忘记把头文件路径添加进来
4:配置裁剪宏定义
添加头文件tos_config_h
命名必须为tos_config_h
在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开始工作