MCU OS系统

本文详细介绍了MCU操作系统的OS模块,重点讨论了抢占唤醒和周期唤醒功能。抢占唤醒主要用于中断处理,而周期唤醒适用于轮询类任务。文章还提及了正在进行的接口完善工作,并鼓励读者查阅头文件并提供补充。
摘要由CSDN通过智能技术生成

1. 概述:
OS模块,唤醒源有抢占唤醒和周期唤醒
抢占唤醒,用于中断类任务
周期唤醒,用于轮询类任务

2. 测试:
在这里插入图片描述

3. 接口:
OS模块接口,见头文件,持续完善,欢迎补充

/*
    From : https://github.com/paiminlin/PM
    From : https://blog.csdn.net/lpaim/article/details/122160263
    Author : PaiMin.lin
    Date : 2022.7.14
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C"{
   
#endif

#ifndef OS_H_
#define OS_H_

#define OSTask_MAXNUM           100         /* 支持最多Task数量 */

typedef enum 
{
   
    OSTask_WakeUp_Grab          = 0,        /* 抢占唤醒 */
    OSTask_WakeUp_1MSTimer      = 1,        /* 1MS定时器唤醒 */
    OSTask_WakeUp_Invalid       = 2,
}OSTask_WakeUp;

typedef enum 
{
   
    OSTask_Grab_Event1          = 0,
    OSTask_Grab_Event2          = 1,
    OSTask_Grab_Event3          = 2,
    OSTask_Grab_Invalid         = 3,
}OSTask_Grab;

typedef enum 
{
   
    OSTask_Timer_1MS            = 0,
    OSTask_Timer_10MS           = 1,
    OSTask_Timer_100MS          = 2,
    OSTask_Timer_Invalid        = 3,
}OSTask_Timer;

typedef int (*OSTaskInit_Fun)(void);

typedef int (*OSTaskDeInit_Fun)(void);

typedef int (*OSTaskRun_Fun)(void);

typedef struct OSTask_Info
{
   
    OSTask_WakeUp enOSTaskWakeUp;           /* 唤醒方式 */
    OSTask_Grab enOSTaskGrab;               /* 抢占唤醒 */
    OSTask_Timer enOSTaskTimer;             /* 定时器唤醒周期 */
    OSTaskInit_Fun OSTaskInitFun;           /* Task初始化回调 暂不支持While(1)逻辑 */
    OSTaskDeInit_Fun OSTaskDeInitFun;       /* Task去初始化回调 暂不支持While(1)逻辑 */
    OSTaskRun_Fun OSTaskRunFun;             /* Task任务回调 暂不支持While(1)逻辑 */
} OSTask_Info;

int OS_Run(void);

int OS_Reset(void);

int OS_WakeUp(OSTask_WakeUp enOSTaskWakeUp, OSTask_Grab enOSTaskGrab);

int OS_Sleep(void);

int OS_Start(void);

int OS_Stop(void);

bool OS_GetStatus(void);

int OS_Init(void);

int OS_DeInit(void);

int OS_CreatTask(OSTask_Info * pstOSTaskInfo);

int OS_DestroyTask(int TaskNum, OSTask_Info * pstOSTaskInfo);

int OS_StartTask(int TaskNum);

int OS_StopTask(int TaskNum);

#endif /* OS_H_ */

#ifdef __cplusplus
}
#endif
/*
    From : https://github.com/paiminlin/PM
    From : https://blog.csdn.net/lpaim/article/details/122160263
    Author : PaiMin.lin
    Date : 2022.7.21
*/

#include "OS.h"

#ifdef __cplusplus
extern "C"{
   
#endif

typedef struct OS_Info
{
   
    bool bOSInit;
    bool bOSStart;
    OSTask_WakeUp enOSTaskWakeUp;
    OSTask_Grab enOSTaskGrab;
    bool bOSTaskCreat[OSTask_MAXNUM];
    bool bOSTaskStart[OSTask_MAXNUM];
} OS_Info;

static int s_10MsConunt = 0;
static int s_100MsConunt = 0;

static OS_Info s_stOSInfo = {
   0};
static OSTask_Info s_stOSTaskInfo[OSTask_MAXNUM] = {
   0};

int OS_Run(void)
{
   
    if(s_stOSInfo.bOSInit == false || s_stOSInfo.bOSStart == false || s_stOSInfo.enOSTaskWakeUp == OSTask_WakeUp_Invalid)
        return 0;

    int TaskNum = 0;

    if(s_stOSInfo.enOSTaskWakeUp == OSTask_WakeUp_Grab)
    {
   
        for(TaskNum = 0; TaskNum < OSTask_MAXNUM; TaskNum ++)
        {
   
            if(s_stOSInfo.bOSTaskStart[TaskNum] == true
                && s_stOSTaskInfo[TaskNum].enOSTaskWakeUp == OSTask_WakeUp_Grab
                && s_stOSTaskInfo[TaskNum]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值