裸机软定时器

// soft_timer.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <thread>


/***************************Timer soft*******************************************************************************************/
#define MAX_SOFT_TIMERS 10 // 最大软件定时器数量
volatile uint32_t msTicks = 0; // Millisecond ticks
typedef enum {
    TIMER_STOPPED,
    TIMER_RUNNING,
    TIMER_EXPIRED,
    TIMER_CREATED
} TimerState;

typedef struct {
    uint32_t period;          // 定时器周期,单位:ms
    uint32_t start_tick;      // 定时器开始计时的tick
    TimerState state;         // 定时器状态
    uint8_t isPeriodic;       // 是否周期运行的标志
    void (*callback)(void*);  // 定时器到期回调函数
    void* arg;                // 回调函数的参数
} SoftTimer;

SoftTimer softTimers[MAX_SOFT_TIMERS];

// 初始化软件定时器模块
void SoftTimer_Init(void) {
    for (int i = 0; i < MAX_SOFT_TIMERS; i++) {
        softTimers[i].state = TIMER_STOPPED;
    }
}

// 创建一个软件定时器
int SoftTimer_Create(uint32_t period, void (*callback)(void*), void* arg, uint8_t isPeriodic) {
    for (int i = 0; i < MAX_SOFT_TIMERS; i++) {
        if (softTimers[i].state == TIMER_STOPPED) {
            softTimers[i].period = period;
            softTimers[i].callback = callback;
            softTimers[i].arg = arg;
            softTimers[i].isPeriodic = isPeriodic;
            softTimers[i].state = TIMER_CREATED;
            return i; // 返回定时器ID
        }
    }
    return -1; // 没有可用的定时器
}

// 启动软件定时器
void SoftTimer_Start(int timerId) {
    if (timerId >= 0 && timerId < MAX_SOFT_TIMERS) {
        softTimers[timerId].start_tick = msTicks;
        softTimers[timerId].state = TIMER_RUNNING;
    }
}

// 停止软件定时器
void SoftTimer_Stop(int timerId) {
    if (timerId >= 0 && timerId < MAX_SOFT_TIMERS) {
        softTimers[timerId].state = TIMER_STOPPED;
    }
}
// 删除软件定时器
void SoftTimer_Delete(int timerId) {
    if (timerId >= 0 && timerId < MAX_SOFT_TIMERS) {
        softTimers[timerId].period = 0;
        softTimers[timerId].start_tick = 0;
        softTimers[timerId].state = TIMER_STOPPED;
        softTimers[timerId].callback = NULL;
        softTimers[timerId].arg = NULL;
        softTimers[timerId].isPeriodic = 0;
    }
}

// 重置软件定时器
void SoftTimer_Reset(int timerId) {
    if (timerId >= 0 && timerId < MAX_SOFT_TIMERS) {
        softTimers[timerId].start_tick = msTicks;
        softTimers[timerId].state = TIMER_RUNNING;
    }
}

// 处理所有软件定时器
void SoftTimer_Handler(void) {
    for (int i = 0; i < MAX_SOFT_TIMERS; i++) {
        if (softTimers[i].state == TIMER_RUNNING) {
            if ((msTicks - softTimers[i].start_tick) >= softTimers[i].period) {
                softTimers[i].state = TIMER_EXPIRED;
                if (softTimers[i].callback != NULL) {
                    softTimers[i].callback(softTimers[i].arg);
                }
                if (softTimers[i].isPeriodic) {
                    softTimers[i].start_tick = msTicks; // 重新启动定时器
                    softTimers[i].state = TIMER_RUNNING;
                }
                else {
                    softTimers[i].state = TIMER_STOPPED; // 定时器到期后停止
                }
            }
        }
    }
}

/***************************Timer soft*******************************************************************************************/
// 线程函数
int k = 0;
int  timerId1;
int timerId2;
void threadFunction() {
    while (1)
    {
        msTicks++;
        SoftTimer_Handler();
        std::this_thread::sleep_for(std::chrono::milliseconds(1));

    }

}

void threadFunction2() {
    while (1)
    {
        if (k >= 10)
        {
            SoftTimer_Delete(timerId1);

        }


        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }

}

void TimerCallback1(void* arg) {
    // 定时器1的回调函数
    std::cout << "1S!\n";
    k++;
}

void TimerCallback2(void* arg) {
    // 定时器2的回调函数
    std::cout << "500ms!\n";
}
int main()
{
    // 创建线程,并将threadFunction作为线程入口函数
    std::thread myThread(threadFunction);
    std::thread myThread2(threadFunction2);
    // 初始化软件定时器
    SoftTimer_Init();

    // 创建软件定时器
      timerId1 = SoftTimer_Create(1000, TimerCallback1, NULL,1); // 1秒定时器
      timerId2 = SoftTimer_Create(500, TimerCallback2, NULL,1);  // 500ms定时器

    // 启动软件定时器
    SoftTimer_Start(timerId1);
    SoftTimer_Start(timerId2);




    // 等待线程执行完毕
    myThread.join();
    myThread2.join();
    std::cout << "Hello World!\n";




}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值