1 Star 0 Fork 13

思雨csy/cotOs

forked from cot软件包/cotOs 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
cot_os.c 4.84 KB
一键复制 编辑 原始数据 按行查看 历史
/**
**********************************************************************************************************************
* @file cot_os.c
* @brief 该文件提供查询协作式多任务系统功能
* @author const_zpc any question please send mail to const_zpc@163.com
* @version V1.0.0
* @date 2023-06-21
*
* @details 功能详细说明:
* + 任务调度初始化
* + 任务调度功能启动
* + 该任务调度并非抢占式
*
**********************************************************************************************************************
* 源码路径:https://gitee.com/cot_package/cot_os.git 具体问题及建议可在该网址填写 Issue
*
* 使用方式:
* 1. 使用前初始化函数 cotOs_Init
* 2. 通过 cotOs_Creat 添加任务函数
* 3. 主函数调用 cotOs_Start 启动任务调度, 函数不会退出
* 4. 使用 cotOs_WaitFor 切换到下一个任务执行
*
**********************************************************************************************************************
*/
/* Includes ----------------------------------------------------------------------------------------------------------*/
#include "cot_os.h"
#include "cot_os_config.h"
#include <stdbool.h>
#include <stdio.h>
/* Private typedef ---------------------------------------------------------------------------------------------------*/
typedef struct
{
OsTask_cb pfnOsTaskEnter;
jmp_buf env;
} TCB_t;
/**
* @brief 中断任务信息结构体定义
*/
typedef struct
{
uint8_t taskNum; /*!< 任务数目 */
uint8_t taskId; /*!< 任务id */
size_t stackTop; /*!< 栈顶地址 */
GetSysTime_cb pfnGetTimerMs; /*!< 获取毫秒级别的时间回调函数 */
TCB_t tcb[COT_OS_MAX_TASK];
} OsInfo_t;
/* Private define ----------------------------------------------------------------------------------------------------*/
/* Private macro -----------------------------------------------------------------------------------------------------*/
/* Private variables -------------------------------------------------------------------------------------------------*/
static OsInfo_t sg_OsInfo;
/* Private function prototypes ---------------------------------------------------------------------------------------*/
/* Private function --------------------------------------------------------------------------------------------------*/
/**
* @brief 初始化协程OS系统
*
* @attention 回调函数不可为NULL
* @param stack 为原有的栈预留多大的空间, 单位字节
* @param pfOsTimer 获取毫秒级别的时间回调函数
*/
void cotOs_Init(size_t stack, GetSysTime_cb pfnOsTimer)
{
sg_OsInfo.taskId = 0;
sg_OsInfo.taskNum = 0;
sg_OsInfo.pfnGetTimerMs = pfnOsTimer;
COT_OS_GET_STACK(sg_OsInfo.stackTop);
sg_OsInfo.stackTop = (sg_OsInfo.stackTop - stack) / sizeof(size_t) * sizeof(size_t);
}
/**
* @brief 创建协程OS任务
*
* @param pfnOsTaskEnter 协程OS任务回调函数
* @param stack 栈预留空间, 单位字节
* @return 0,成功; -1,失败
*/
int cotOs_Creat(OsTask_cb pfnOsTaskEnter, size_t stack)
{
size_t oldsp;
if (sg_OsInfo.taskNum >= COT_OS_MAX_TASK || sg_OsInfo.pfnGetTimerMs == NULL)
{
return -1;
}
COT_OS_GET_STACK(oldsp);
COT_OS_SET_STACK(sg_OsInfo.stackTop);
if (0 == setjmp(sg_OsInfo.tcb[sg_OsInfo.taskNum].env))
{
COT_OS_SET_STACK(oldsp);
sg_OsInfo.tcb[sg_OsInfo.taskNum].pfnOsTaskEnter = pfnOsTaskEnter;
sg_OsInfo.taskNum++;
sg_OsInfo.stackTop -= stack;
}
else
{
sg_OsInfo.tcb[sg_OsInfo.taskId].pfnOsTaskEnter();
}
return 0;
}
/**
* @brief 启动协程OS任务
*
* @attention 该函数不会退出, 因此一切准备就绪后最后调用该函数即可
* @return 0,成功; -1,失败
*/
int cotOs_Start(void)
{
if (sg_OsInfo.taskNum == 0 || sg_OsInfo.pfnGetTimerMs == NULL)
{
return -1;
}
longjmp(sg_OsInfo.tcb[0].env, 1);
return 0;
}
/**
* @brief 让出一定时长给其他协程任务执行
*
* @attention 等待n毫秒时长, 则会在 >= n 的某个时刻才会运行, 具体要看其他协程任务什么时候让出资源
* @param time 等待时长,单位毫秒
*/
void cotOs_WaitFor(uint32_t time)
{
uint32_t timer = sg_OsInfo.pfnGetTimerMs();
setjmp(sg_OsInfo.tcb[sg_OsInfo.taskId].env);
if (!(sg_OsInfo.pfnGetTimerMs() - timer > time))
{
sg_OsInfo.taskId++;
if (sg_OsInfo.taskId >= sg_OsInfo.taskNum)
{
sg_OsInfo.taskId = 0;
}
longjmp(sg_OsInfo.tcb[sg_OsInfo.taskId].env, 1);
}
}
jmp_buf *cotOs_GetTaskEnv1(void)
{
return &sg_OsInfo.tcb[sg_OsInfo.taskId].env;
}
void cotOs_RunNextTask(void)
{
sg_OsInfo.taskId++;
if (sg_OsInfo.taskId >= sg_OsInfo.taskNum)
{
sg_OsInfo.taskId = 0;
}
// cotOs_WaitFor_Cond(getCurrentTime_ms() - time > 100);
longjmp(sg_OsInfo.tcb[sg_OsInfo.taskId].env, 1);
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/siyu_csy/cot_os.git
git@gitee.com:siyu_csy/cot_os.git
siyu_csy
cot_os
cotOs
master

搜索帮助