找回密码
 立即注册
楼主: 王***

最佳入门多线程示例讲解-核心代码简单易懂,仅44行代码

[复制链接]
  • TA的每日心情
    慵懒
    昨天 08:34
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

    积分
    301
    发表于 2024-2-18 17:16:59 | 显示全部楼层
    受益匪浅,感谢
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 151 天

    [LV.7]常住居民III

    109

    主题

    456

    回帖

    845

    积分

    高级会员

    积分
    845
    发表于 2024-2-23 08:35:35 | 显示全部楼层
    我现在理出来思路是这样的,一旦进入延时,给下个任务分配时间,执行下一个任务,void Timer0_Isr(void) interrupt 1 定时器中断检测当前任务是否完成,没完成,时间自减;void Get_Delay(void) 判定是否完成,完成任务加1,出延时函数前,再执行Task_This[Task]++; 再加1,

    void Delay(unsigned int Time)
    {
            Task_Timer[Task] = Time;//当前线程的私有定时器进行赋值;
            Task_This[Task]++;//然后让线程状态往下加1
    }

    /****定时倒计时*******/
    /*定时器每次干的活就是遍历所有私有定时器,发现有没到0的,就进行一次自减。
    这样,只需要判断私有定时器的数值是否到0,就可以知道是否完成了定时。*/
    void Timer0_Isr(void) interrupt 1 // 软定时器中断
    {
            U8 i;//遍历所有线程定时器变量
            for (i = 0; i < Task_Max; i++)//逐一判断私有定时器
            {
                    if (Task_Timer[i] > 0)//任务定时器非零,开始自减;
                    {
                            Task_Timer[i]--;//任务定时器值自减,减到0时任务完成,进行下一个任务定时器检测;
                    }
            }
    }


    /*****定时结束任务切换*********/
    //对私有定时器是否到0进行判断。如果到0了,就将任务序号加一,跳出延时部分。
    void Get_Delay(void)//获取当前定时器状态
    {
            if (Task_Timer[Task] == 0)//任务定时器值为0,当前状态完成,
            {
                    Task_This[Task]++;//切换下一种状态,
            }
            else//否则,什么都不做,等待任务完成;
            {
                    // 空操作
            }
    }


    但是有个地方没看懂,就是:
                    case 10://返回初始状态
                            YY_Count--;//语音计数自减;
                            if (YY_Count == 0)//检测语音播报结束;
                                    Task_This[Task] = 0;//执行完毕返回初始状态
                            else//YY_Count非0;
                                    Task_This[Task] = 6;//循环执行
                            break;//跳出Switch;
                    case 11://打断预处理区域,线程非正常执行区域
                            YY_OUT_2 = 1;//关闭延时播报
                            Delay(100);//执行下个任务完成时Task_This[Task]++后为12,跳出Delay前Task_This[Task]++后13
                            break;//跳出Switch;
    这个case 10和11是如何切换的????
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 83 天

    [LV.6]常住居民II

    13

    主题

    323

    回帖

    728

    积分

    荣誉版主

    热心市民

    积分
    728
    发表于 2024-3-19 00:37:31 | 显示全部楼层
    开篇第一段代码中的定时器中断函数中,两个软定时器变量是否定义为局部静态变量更妥当一些?
    比如 unsigned int t100ms, t350ms 前面加static

    点评

    你说的很对,不过C51中似乎并没有对专门存储静态变量的地方。 区别只有全局和局部的变量,所以两种写法的效果应该没有很大的差别  详情 回复 发表于 2024-3-19 07:55
    睁开眼睛做场梦~~~
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 19:38
  • 签到天数: 104 天

    [LV.6]常住居民II

    31

    主题

    384

    回帖

    1930

    积分

    荣誉版主

    积分
    1930
     楼主| 发表于 2024-3-19 07:55:37 | 显示全部楼层
    晓飛飛 发表于 2024-3-19 00:37
    开篇第一段代码中的定时器中断函数中,两个软定时器变量是否定义为局部静态变量更妥当一些?
    比如 unsigned ...

    你说的很对,不过C51中似乎并没有对专门存储静态变量的地方。
    区别只有全局和局部的变量,所以两种写法的效果应该没有很大的差别
    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 151 天

    [LV.7]常住居民III

    109

    主题

    456

    回帖

    845

    积分

    高级会员

    积分
    845
    发表于 2024-3-19 08:27:07 | 显示全部楼层
    王昱顺 发表于 2024-3-19 07:55
    你说的很对,不过C51中似乎并没有对专门存储静态变量的地方。
    区别只有全局和局部的变量,所以两种写法的 ...

    学到了,
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 15:08
  • 签到天数: 55 天

    [LV.5]常住居民I

    2

    主题

    520

    回帖

    661

    积分

    高级会员

    积分
    661
    发表于 2024-3-24 10:25:46 来自手机 | 显示全部楼层
    学习了,这个是rtos的入门
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:55
  • 签到天数: 42 天

    [LV.5]常住居民I

    0

    主题

    156

    回帖

    339

    积分

    中级会员

    积分
    339
    发表于 2024-3-24 10:48:07 | 显示全部楼层
    利用定时器周期性中断产生散转
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 20:54
  • 签到天数: 39 天

    [LV.5]常住居民I

    6

    主题

    84

    回帖

    212

    积分

    中级会员

    积分
    212
    发表于 2024-3-27 22:29:46 | 显示全部楼层
    感谢分享
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    前天 20:54
  • 签到天数: 39 天

    [LV.5]常住居民I

    6

    主题

    84

    回帖

    212

    积分

    中级会员

    积分
    212
    发表于 2024-3-27 23:42:33 | 显示全部楼层
    楼主,再次表示感谢,我下载了你的代码。

    我看到有一楼提到了每个任务只能调用delay函数一次,你的回复是:调用多次就只有最后一次有效。
    我觉得这种限制可能对一些需要在一个任务里有多个延时的应用不太友好,我在你的代码的基础上,做了一些改动,增加了多个延时的用法,给大家参考。
    截图202403272339596451.jpg

    STC8H开天斧3.2版多线程.rar

    56.12 KB, 下载次数: 8

    点评

    其实是每个case中只能调用一次,多个case可以多次调用delay的,不过调用delay后需要间隔2个数值,比如说case 0调用了一次delay,下一个步应该叫case 2,这样case1会自动进入default,不断判断是否完成计时,从而达到  详情 回复 发表于 2024-3-27 23:54
    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 19:38
  • 签到天数: 104 天

    [LV.6]常住居民II

    31

    主题

    384

    回帖

    1930

    积分

    荣誉版主

    积分
    1930
     楼主| 发表于 2024-3-27 23:54:30 | 显示全部楼层
    haishi28 发表于 2024-3-27 23:42
    楼主,再次表示感谢,我下载了你的代码。

    我看到有一楼提到了每个任务只能调用delay函数一次,你的回复是 ...

    其实是每个case中只能调用一次,多个case可以多次调用delay的,不过调用delay后需要间隔2个数值,比如说case 0调用了一次delay,下一个步应该叫case 2,这样case1会自动进入default,不断判断是否完成计时,从而达到不堵塞的情况
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-30 08:19 , Processed in 0.164068 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表