当前位置: 首页 > news >正文

单线程模拟n个线程的L函数

求赞qwq

众所周知,像STM32F10X系列之类的单片机都是单核的,要是不使用特殊手段,很难实现多个独立延时的LED灯的闪烁操作,对此我写了个线程表,等于硬件实现不了的L功能我用软件帮它实现qwq

接下来是代码以及代码讲解awa:

先发代码:

#include <stdio.h>  

typedef unsigned int time32_t;
typedef unsigned int u32_t;

typedef struct {
    time32_t sleeptime;
    void(*runfun)();
} cpl_t;

void __initcpl_t__(cpl_t* _obj, u32_t _ite) {
    if (_obj == NULL) return;
    while (_ite-- > 0) {
        _obj[_ite].runfun = NULL;
        _obj[_ite].sleeptime = 0; // 初始化为0  
    }
}

void __insertcpl_t__(cpl_t* _obj, void(*runfun)(), time32_t sleeptime, u32_t _max) {
    if (_obj == NULL) return;
    u32_t i = 0;
    while (i < _max && _obj[i].sleeptime != 0) { // 检查sleeptime是否为0  
        i++;
    }
    if (i >= _max) return; // 防止越界  
    _obj[i].runfun = runfun;
    _obj[i].sleeptime = sleeptime;
}

void __showcpl_t__(cpl_t* _obj, u32_t _max, time32_t jishi, time32_t sleep, void (*clear)()) {
    if (_obj == NULL) return;
    time32_t i = sleep;
    for (time32_t count = 0 ; count < jishi; count++) {
        for (u32_t temp = 0 ; temp < _max ; temp++) {
            if (_obj[temp].sleeptime != 0 && count % _obj[temp].sleeptime == 0 && _obj[temp].runfun != NULL /*count != 0*/) {
                _obj[temp].runfun();
                printf("当前时间刻:%d\n", count);
            }
        }
        clear(); // 调用清除函数  
    }
}

void task1() {
    printf("Task 1 is running\n");
}

void task2() {
    printf("Task 2 is running\n");
}

void clear() {
    printf("Clearing...\n"); // 添加清理输出  
}

// 主程序  
int main() {
    const u32_t max_tasks = 5;
    cpl_t tasks[5];

    // 初始化任务  
    __initcpl_t__(tasks, max_tasks);

    // 插入任务  
    __insertcpl_t__(tasks, task1, 2, max_tasks); // 每 2 个时间单位运行一次  
    __insertcpl_t__(tasks, task2, 3, max_tasks); // 每 3 个时间单位运行一次  

    // 模拟多线程行为  
    printf("Starting task simulation...\n");//快说,谢谢GPT爸爸的翻译qwq
    __showcpl_t__(tasks, max_tasks, 20, 100, clear); // 假设执行 20 个时间单位  

    return 0;
}

(博客选择不了C语言,所以选了C++)

可以看到,十分简洁的调库列表,绝对没有偷偷使用标准库qwq.

(灵感和思路是从石头缝里蹦出来的)

首先是对结构体的定义,其实这个结构体是用来做数组用的,结构体数组本质上就是几个数组的集合,是个人都懂好qwq.

(初始化没必要讲awa)

插入函数和链表的没有太大的区别,只是主体是数组.就是找下一个没被存东西过的空位,然后把插入的线程的延时,执行的函数插入到数组里,秒!

接下来就是最L的函数了,主要就是定个软件计时器用来定位时间刻,然后在刚才讲到的存储函数和延时时间的数组中翻箱倒柜,找到延迟时间是当前时间刻因数的对象,执行这个对象里的函数.如果想要更快的速度,可以把线性查找换成更快的查找结构或哈希表(当然我这个不是为了时间)qwq

散会awa_

相关文章:

  • docker push镜像到阿里云
  • 网络药理学与LiP-MS:小分子药物研究的天合之作
  • 从零开始在Windows系统上搭建一个node.js后端服务项目
  • 蓝耘智算携手DeepSeek,共创AI未来
  • Java中的集合框架:List、Set和Map有什么区别?
  • 第G7周:Semi-Supervised GAN 理论与实战
  • 【Linux】文件管理
  • 代码随想录DAY32|动态规划、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • 大数据学习(48) - Flink状态种类
  • 【Spring+MyBatis】_图书管理系统(上篇)
  • Java并发编程面试题:内存模型(6题)
  • 中药细粒度图像分类
  • Vulkan 学习(14)---- 描述符集
  • 社群效应与开源AI智能名片2+1链动模式S2B2C商城小程序在流量变现中的应用探索
  • 什么是3D视觉无序抓取?
  • 153~173笔记
  • 基于SpringBoot的鲜花商城
  • 通用评估系统(五)- 前端部分总体说明
  • qt QOpenGLTexture详解
  • 算法【贪心经典题目专题4】
  • 日本希望再次租借大熊猫,外交部:双方就相关合作保持密切沟通
  • 下任美联储主席热门人选沃什:美联储犯下“系统性错误”,未能控制一代人以来最严重的通胀
  • 2025年上海空间信息大会举行,重大项目集中签约
  • 三部门提出17条举措,全力促进高校毕业生等青年就业创业
  • 南方医科大学原副校长宁习洲主动投案,接受审查调查
  • 冲击一英里4分钟大关,基普耶贡挑战女子中长跑极限