前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >STM32标准库工程中移植TencentOS-tiny

STM32标准库工程中移植TencentOS-tiny

作者头像
Mculover666
发布2021-02-19 11:42:29
6660
发布2021-02-19 11:42:29
举报
文章被收录于专栏:TencentOS-tiny

一、移植前的准备

1. 引言

因为项目的原因需要将原有的标准库工程升级为基于TencentOS-tiny的RTOS工程,所以花费一点时间记录移植过程,提供一份向基于STM32标准库的老工程中移植TencentOS-tiny的思路。

2. 移植条件

移植 TencentOS-tiny 需要确保 Systick 可以正常工作:

① Systick用于向TencentOS-tiny提供时钟节拍支持,通常为1ms一次中断;

② Systick属于内核外设,在TencentOS-tiny中会自动配置,无需用户手动配置;

③ Systick正常延时,则证明时钟配置正确。

另外,可以再配置一个串口用于打印日志,并将printf重定向到串口,如果不想配置也可以使用LED测试系统是否正常运行。

本文所使用的是STM32F407探索者开发板,固件库版本为1.8.0,开发工具为Keil-MDK。

二、移植过程

1. 下载TencentOS-tiny源码

代码语言:javascript
复制
git clone https://github.com/Tencent/TencentOS-tiny.git

2. 复制TencentOS-tiny文件

在原有的裸机工程下新建一个文件夹,用于存放TencentOS-tiny相关的文件:

移植TencentOS-tiny内核只需要复制两个文件夹:

  • arch:TencentOS-tiny对CPU级别的支持;
  • kernel:TencentOS-tiny内核源码;

3. 添加TencentOS-tiny文件

向标准库裸机工程中添加TencentOS-tiny相关的文件。

3.1. 创建分组
3.2. 添加CPU架构支持文件

本文中所使用的MCU是STM32F407,属于Cortex-M4内核系列,所以添加以下三个文件:

  • tos_cpu.c:arm-v7m架构共用的支持,在arch\arm\arm-v7m\common目录中;
  • port_c.c:Systick操作接口移植实现,在arch\arm\arm-v7m\cortex-m4\armcc目录中;
  • port_s.S:任务上下文切换汇编程序实现,在arch\arm\arm-v7m\cortex-m4\armcc目录中;

tos_fault.c是针对TencentOS-tiny硬件故障追踪功能的支持,此功能可以在tos_config.h中配置,如果加入的话,需要将工程中原有的HardFault_Handler屏蔽。

3.3. 添加内核源码文件

kernel\core 目录下的所有文件是TencentOS-tiny内核源码实现,将所有文件都添加到到MDK工程中:

3.4. 添加头文件路径

将以上c文件所使用的头文件路径都添加到MDK中:

4. 添加TencentOS-tiny配置文件

TencentOS-tiny内核中有非常丰富的功能,可以针对不同的应用进行裁剪,配置文件为tos_config.h

在项目中新建一个文件夹用于存放TencentOS-tiny配置文件:

从TencentOS-tiny源码中的board目录下找到STM32F4类型开发板的支持,从其中复制一份配置文件:

复制过来该文件后,为了方便在工程中随时修改,创建 tos/config 分组,将其添加到MDK工程中,如图:

再将该文件的路径添加到头文件路径中,使编译器可以找到:

5. 修改代码进行适配

5.1. 屏蔽原有PendSV中断处理函数

TencentOS-tiny内核中已经对PendSV异常进行了处理,在PendSV中断进行任务上下文切换,所以需要屏蔽工程中原有的PendSV中断处理函数。

5.2. 提供Systick中断支持

TencentOS-tiny内核需要Systick提供时钟节拍,在原有的中断文件stm32f4xx_it.h中进行修改。

首先包含TencentOS-tiny内核的头文件:

接着编写Systick中断处理程序:

代码语言:javascript
复制
if (tos_knl_is_running()) {
  tos_knl_irq_enter();
  tos_tick_handler();
  tos_knl_irq_leave();
}
5.3. 修改配置文件

TencentOS-tiny中需要注意的配置项有:

① 针对Systick时钟节拍的配置项:

代码语言:javascript
复制
/* 配置每s中多少个tick数,即Systick每s产生多少次中断 */
#define TOS_CFG_CPU_TICK_PER_SECOND     1000u

/* CPU主频 */
#define TOS_CFG_CPU_CLOCK               (SystemCoreClock)

② 硬件故障追踪功能(之前未添加对应的支持文件,所以不开启):

代码语言:javascript
复制
#define TOS_CFG_FAULT_BACKTRACE_EN      0u
5.4. 开启C99支持

此时,移植完成,编译无误。

三、测试系统运行

以下测试代码都在main.c中编写。

① 包含TencentOS-tiny头文件:

代码语言:javascript
复制
#include "tos_k.h"

② 创建两个任务,以测试系统是否正常运行:

代码语言:javascript
复制
k_task_t  task1;
k_task_t  task2;

k_stack_t task1_stack[256];
k_stack_t task2_stack[256];

void task1_entry(void *args)
{
    while (1) {
        printf("task1 is running...\r\n");
        tos_task_delay(1000);
    }
}

void task2_entry(void *args)
{
    while (1) {
        printf("task2 is running...\r\n");
        tos_task_delay(1000);
    }
}

③ 初始化串口、初始化TencentOS-tiny内核、创建两个测试任务、启动内核:

代码语言:javascript
复制
int main()
{
    
    /* Init LED */
    led_init();
    
    /* Init Usart1 */
    USART1_Init();
    
    /* Init TencentOS-tiny Kernel */
    tos_knl_init();
    
    /* Create task1 and task2 */
    tos_task_create(&task1, "task1", task1_entry, NULL, 2, task1_stack, 256, 10);
    tos_task_create(&task2, "task2", task2_entry, NULL, 3, task2_stack, 256, 10);
    
    /* Start TencentOS-tiny Kernel */
    tos_knl_start();
    
    /* Main Loop */
    while (1) {
        printf("Error!\r\n");
        Delay_ms(1000);
    }
}

④ 编译、下载到开发板中,在串口助手中查看运行结果,系统正常运行,移植成功:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Mculover666 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、移植前的准备
    • 1. 引言
      • 2. 移植条件
      • 二、移植过程
        • 1. 下载TencentOS-tiny源码
          • 2. 复制TencentOS-tiny文件
            • 3. 添加TencentOS-tiny文件
              • 3.3. 添加内核源码文件
                • 3.4. 添加头文件路径
                  • 4. 添加TencentOS-tiny配置文件
                    • 5. 修改代码进行适配
                    • 三、测试系统运行
                    相关产品与服务
                    TencentOS Server
                    TencentOS Server 是腾讯云推出的 Linux 操作系统,它旨在为云上运行的应用程序提供稳定、安全和高性能的执行环境。它可以运行在腾讯云 CVM 全规格实例上,包括黑石物理服务器2.0。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档