// 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 文件
11-19
3473
03-05
9519