代码拉取完成,页面将自动刷新
同步操作将从 cot软件包/cotOs 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
/**
**********************************************************************************************************************
* @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);
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。