RTOS中间件bror&freertos实现bror接口

Posted jdh99

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RTOS中间件bror&freertos实现bror接口相关的知识,希望对你有一定的参考价值。

RTOS中间件bror&freertos实现bror接口

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

1. 介绍

bror中文名巴拉,是宜家的一种手推车。

本文中bror被设计成RTOS的中间件,可以支持linux,freertos,rt-thread等操作系统。应用基于bror开发,可以统一接口,在不同RTOS上方便的移植程序。

2. 开源

bror是接口文件,bror-freertos是在freertos中实现的bror接口。

3. bror接口

// 线程优先级
typedef enum {
    BROR_THREAD_PRIORITY_HIGHEST = 0,
    BROR_THREAD_PRIORITY_HIGH,
    BROR_THREAD_PRIORITY_MIDDLE,
    BROR_THREAD_PRIORITY_LOW,
    BROR_THREAD_PRIORITY_LOWEST
} BrorThreadPriority;

// BrorFunc 入口函数类型
typedef void (*BrorFunc)(void* param);

// 用户模块必须实现的函数
// BrorThreadCreate 创建线程
// func:线程函数
// name:线程名
// priority:线程优先级
// stackSize:堆栈大小
bool BrorThreadCreate(BrorFunc func, const char* name, BrorThreadPriority priority, int stackSize);
// BrorThreadDeleteMe 删除本线程
// 注意:本函数需要在线程结束处调用
void BrorThreadDeleteMe(void);
// BrorDelay 延时
void BrorDelay(int second);
// BrorDelayMS 毫秒级延时
void BrorDelayMS(int ms);
// BrorYield 暂停执行让出CPU
void BrorYield(void);
// BrorMutexInit 初始化锁
intptr_t BrorMutexInit(void);
// BrorMutexLock 上锁
void BrorMutexLock(intptr_t lock);
// BrorMutexUnlock 解锁
void BrorMutexUnlock(intptr_t lock);

注意:线程如果是单次运行,则需要在线程函数末尾使用BrorThreadDeleteMe结束本线程。

4. 示例

在esp32-c3中测试代码运行,创建若干线程,按顺序打印数据。

// Copyright 2020-2020 The TZIOT Authors. All rights reserved.
// 框架层主文件
// Authors: jdh99 <jdh821@163.com>

#include "framework.h"

static intptr_t mutex = 0;
static int seq = 0;

static void testThread0(void* param);
static void testThread1(void* param);
static void testThread2(void* param);

// FrameworkLoad 模块载入
void FrameworkLoad(void) {
    printf("framework load\\n");

    mutex = BrorMutexInit();

    BrorThreadCreate(testThread0, "testThread0", BROR_THREAD_PRIORITY_MIDDLE, 2048);
    BrorThreadCreate(testThread1, "testThread1", BROR_THREAD_PRIORITY_MIDDLE, 2048);
    BrorThreadCreate(testThread2, "testThread2", BROR_THREAD_PRIORITY_MIDDLE, 2048);

    printf("framework end\\n");
}

static void testThread0(void* param) {
    BrorDelayMS(1);

    int id = 0;
    while (1) {
        BrorMutexLock(mutex);

        printf("id:%d start\\n", id);

        if (seq % 3 == 0) {
            seq++;
            printf("----->id:%d seq:%d\\n", id, seq);
        }

        if (seq >= 20) {
            printf("id:%d exit\\n", id);
            BrorMutexUnlock(mutex);
            break;
        }
        printf("id:%d stop\\n", id);

        BrorMutexUnlock(mutex);
        // BrorDelayMS(1000);
        BrorYield();
    }
    BrorThreadDeleteMe();
}

static void testThread1(void* param) {
    BrorDelayMS(1);

    int id = 1;
    while (1) {
        BrorMutexLock(mutex);

        printf("id:%d start\\n", id);

        if (seq % 3 == 1) {
            seq++;
            printf("----->id:%d seq:%d\\n", id, seq);
        }

        if (seq >= 20) {
            printf("id:%d exit\\n", id);
            BrorMutexUnlock(mutex);
            break;
        }
        printf("id:%d stop\\n", id);

        BrorMutexUnlock(mutex);
        // BrorDelayMS(1000);
        BrorYield();
    }
    BrorThreadDeleteMe();
}

static void testThread2(void* param) {
    BrorDelayMS(1);
    
    int id = 2;
    while (1) {
        BrorMutexLock(mutex);

        printf("id:%d start\\n", id);

        if (seq % 3 == 2) {
            seq++;
            printf("----->id:%d seq:%d\\n", id, seq);
        }

        if (seq >= 20) {
            printf("id:%d exit\\n", id);
            BrorMutexUnlock(mutex);
            break;
        }
        printf("id:%d stop\\n", id);

        BrorMutexUnlock(mutex);
        // BrorDelayMS(1000);
        BrorYield();
    }
    BrorThreadDeleteMe();
}

输出:

framework load
framework end
Hello world123456!0x6161
id:1 start
id:1 stop
id:2 start
id:2 stop
id:0 start
----->id:0 seq:1
id:0 stop
id:1 start
----->id:1 seq:2
id:1 stop
id:2 start
----->id:2 seq:3
id:2 stop
id:0 start
----->id:0 seq:4
id:0 stop
id:2 start
id:2 stop
id:0 start
id:0 stop
id:1 start
----->id:1 seq:5
id:1 stop
id:2 start
----->id:2 seq:6
id:2 stop
id:0 start
----->id:0 seq:7
id:0 stop
id:1 start
----->id:1 seq:8
id:1 stop
id:0 start
id:0 stop
id:1 start
id:1 stop
id:2 start
----->id:2 seq:9
id:2 stop
id:0 start
----->id:0 seq:10
id:0 stop
id:1 start
----->id:1 seq:11
id:1 stop
id:2 start
----->id:2 seq:12
id:2 stop
id:0 start
----->id:0 seq:13
id:0 stop
id:2 start
id:2 stop
id:0 start
id:0 stop
id:1 start
----->id:1 seq:14
id:1 stop
id:2 start
----->id:2 seq:15
id:2 stop
id:0 start
----->id:0 seq:16
id:0 stop
id:1 start
----->id:1 seq:17
id:1 stop
id:0 start
id:0 stop
id:1 start
id:1 stop
id:2 start
----->id:2 seq:18
id:2 stop
id:0 start
----->id:0 seq:19
id:0 stop
id:2 start
id:2 stop
id:1 start
----->id:1 seq:20
id:1 exit
id:0 start
id:0 exit
id:2 start
----->id:2 seq:21
id:2 exit

以上是关于RTOS中间件bror&freertos实现bror接口的主要内容,如果未能解决你的问题,请参考以下文章

RTOS中间件bror&freertos实现bror接口

RTOS中间件bror&freertos实现bror接口

Arduino与FreeRTOS-FreeRTOS配置与简单任务创建

FreeRTOS Posix原理

FreeRTOS快速入门-初探FreeRTOS

FreeRTOS的学习路线