基于STM32CubeIDE的TobudOS操作系统移植

TobudOS简介

TobudOS 是面向物联网领域开发的实时操作系统,早期版本基于腾讯自研的物联网操作系统TencentOS Tiny,2020年由腾讯捐赠到开放原子开源基金会进行孵化,2023年正式更名为TobudOS,TobudOS具有低功耗,低资源占用,模块化,安全可靠等特点,可有效提升物联网终端产品开发效率,提供精简的 RTOS 内核,内核组件可裁剪可配置,可快速移植到多种主流 MCU (如 STM32 全系列) 及模组芯片上。而且,基于 RTOS 内核提供了丰富的物联网组件,内部集成主流物联网协议栈(如 CoAP/MQTT/TLS/DTLS/LoRaWAN/NB-IoT 等),可助力物联网终端设备及业务快速接入物联网云平台。

同时也具有丰富的IoT组件与可靠的安全框架,其生态系统也是非常的丰富且完善。TobudOS不仅仅有着同市面上主流RTOS一样的功能和体积小、低功耗、移植性好等优点,更有着丰富的IoT组件与完善的生态系统和安全框架。下面我将介绍如何将TobudOS移植到CubeIDE的项目中。(笔者使用的硬件平台为正点原子精英板,芯片型号为STM32F103ZET6,Cortex M3内核

资料准备

I.STM32CubeIDE软件:STM32CubeIDE - Integrated Development Environment for STM32 - STMicroelectronics

II.TobudOS源码:TobudOS · AtomGit_开放原子开源基金会代码托管平台

III.硬件平台:正点原子精英板

移植步骤

一、在CubeIDE下新建工程与新工程配置

1.在CubeIDE右上角选择File->New->STM32 Project新建工程,命名为TobudOS__Demo,并选择芯片型号;

2.使能RCC、SYS相关,配置系统时钟为72MHz,配置LED0与LED的GPIO(我的是PB5和PE5)

3.随便开启一个中断(这里我选择打开定时器6中断),并在最后选择生成对应的.c以及.h文件,并生成代码(这一步有大用!!!我们后面要再生成的文件stm32f1xx_it.c里面进行改动的!!!

点击编译之后通过,至此新工程创建成功。

二、裁剪TobudOS内核

1.对TobudOS进行裁剪,将以下三个文件夹复制下来,放到一个新文件夹中,新文件夹命名为TobudOS如图所示:

2.管理arch文件夹

I.复制TobudOS\arch\arm\arm-v7m\common下的所有文件,粘贴到arch路径下:

II.复制TobudOS\arch\arm\arm-v7m\cortex-m3\gcc下的所有文件,粘贴到arch路径下:

III.将以下文件夹全部删除,并将所有.h文件移到include文件夹中:

IV.至此,arch文件夹准备完成。

3.管理kernel文件夹

删除kernel文件夹中的hal文件夹即可,至此,kernel文件夹准备完成。

4.管理osal文件夹

I.删除除cmsis_os文件夹中的其余内容,只保留此文件夹

II.进入cmsis_os文件夹中删除以下两个文件(cmsis版本可以自行调整)

至此,osal文件夹准备完成。

5.创建一个新文件夹,并命名为TOS_CONFIG

在该文件夹下新建文件,命名为tos_config.h,并在此文件中添加以下内容:

#ifndef _TOS_CONFIG_H_
#define  _TOS_CONFIG_H_

#include "stm32f1xx.h"	// 目标芯片头文件,用户需要根据情况更改

#define TOS_CFG_TASK_PRIO_MAX           10u 	// 配置TobudOS默认支持的最大优先级数量

#define TOS_CFG_ROUND_ROBIN_EN          0u		// 配置TobudOS的内核是否开启时间片轮转

#define TOS_CFG_OBJECT_VERIFY_EN           1u	// 配置TobudOS是否校验指针合法

#define TOS_CFG_TASK_DYNAMIC_CREATE_EN  1u		// TobudOS 动态任务创建功能宏

#define TOS_CFG_EVENT_EN                1u		// TobudOS 事件模块功能宏

#define TOS_CFG_MMBLK_EN                1u		//配置TobudOS是否开启内存块管理模块

#define TOS_CFG_MMHEAP_EN               1u		//配置TobudOS是否开启动态内存模块

#define TOS_CFG_MMHEAP_DEFAULT_POOL_EN  1u		// TobudOS 默认动态内存池功能宏

#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE        0x100	// 配置TobudOS默认动态内存池大小

#define TOS_CFG_MUTEX_EN                1u		// 配置TobudOS是否开启互斥锁模块

#define TOS_CFG_MESSAGE_QUEUE_EN        1u		// 配置TobudOS是否开启消息队列模块

#define TOS_CFG_MAIL_QUEUE_EN           1u		// 配置TobudOS是否开启消息邮箱模块

#define TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN	1u	// 配置TobudOS是否开启优先级消息队列模块

#define TOS_CFG_PRIORITY_MAIL_QUEUE_EN	1u		// 配置TobudOS是否开启优先级消息邮箱模块

#define TOS_CFG_TIMER_EN                1u		// 配置TobudOS是否开启软件定时器模块

#define TOS_CFG_PWR_MGR_EN              0u		// 配置TobudOS是否开启外设电源管理模块

#define TOS_CFG_TICKLESS_EN             0u		// 配置Tickless 低功耗模块开关

#define TOS_CFG_SEM_EN                  1u		// 配置TobudOS是否开启信号量模块

#define TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN      1u	// 配置TobudOS是否开启任务栈深度检测

#define TOS_CFG_FAULT_BACKTRACE_EN      0u		// 配置TobudOS是否开启异常栈回溯功能

#define TOS_CFG_IDLE_TASK_STK_SIZE      128u	// 配置TobudOS空闲任务栈大小

#define TOS_CFG_CPU_TICK_PER_SECOND     1000u	// 配置TobudOS的tick频率

#define TOS_CFG_CPU_CLOCK               (SystemCoreClock)	// 配置TobudOS CPU频率

#define TOS_CFG_TIMER_AS_PROC           1u		// 配置是否将TIMER配置成函数模式

#endif

保存代码,至此,TOS_CONFIG文件夹准备完成。

如果你操作到了这一步,你将会得到一个名为TobusOS的文件夹,里面有四个子文件夹如图所示,至此TobudOS内核裁剪完成。

三、移植TobudOS内核

1.添加头文件路径

I.将刚刚制作的TobudOS内核复制到刚刚新建的工程目录下:

II.选中你刚刚创建的工程,快捷键Alt+Enter打开工程属性界面,在图中找到头文件添加路径:

III.添加头文件路径:

点击add,分别添加以下五个头文件路径。

在Source Location中添加TobudOS文件夹。

至此,添加头文件路径已经添加完毕。

2.代码修改

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

II.在 stm32f1xx_it.c 文件中的 PendSV_Handler 函数前添加___weak 关键字,因为该函数在 TobudOS 的调度汇编中已经重新实现;同时在 SysTick_Handler 函数中添加 TobudOS 的调度处理函数,如下图所示:

四、编写测试程序

在main.c的以下位置添加代码

/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "tos_k.h"
/* USER CODE END Includes */
/* USER CODE BEGIN 0 */
#define TASK1_STK_SIZE       1024
k_task_t task1;
uint8_t task1_stk[TASK1_STK_SIZE];

#define TASK2_STK_SIZE       1024
k_task_t task2;
uint8_t task2_stk[TASK2_STK_SIZE];

void task1_entry(void *arg)
{
    while (1) {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5)
        tos_task_delay(2000);
    }
}

void task2_entry(void *arg)
{
    while (1) {
        HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5)
        tos_task_delay(1000);
    }
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
	tos_knl_init(); // TobudOS kernel initialize
	tos_task_create(&task1, "task1", task1_entry, NULL, 3, task1_stk, TASK1_STK_SIZE, 0); // Create task1
	tos_task_create(&task2, "task2", task2_entry, NULL, 3, task2_stk, TASK2_STK_SIZE, 0);// Create task2
	tos_knl_start();
  /* USER CODE END 2 */

编译代码,下载到板子中,可以观察到两个灯以不同频率闪烁,至此,对TobudOS移植结束。

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追梦少年南南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值