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

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

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-04-30 15:18:16
已绑定手机

1

主题

36

回帖

86

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:497
  • 最近打卡:2025-04-30 20:48:13
已绑定手机

151

主题

589

回帖

1196

积分

金牌会员

积分
1196
发表于 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是如何切换的????
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

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

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2218

回帖

5450

积分

版主

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:497
  • 最近打卡:2025-04-30 20:48:13
已绑定手机

151

主题

589

回帖

1196

积分

金牌会员

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

学到了,
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:402
  • 最近打卡:2025-05-01 10:01:59

0

主题

170

回帖

955

积分

高级会员

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

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:82
  • 最近打卡:2024-11-16 13:05:25

10

主题

103

回帖

460

积分

中级会员

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

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:82
  • 最近打卡:2024-11-16 13:05:25

10

主题

103

回帖

460

积分

中级会员

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

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

STC8H开天斧3.2版多线程.rar

56.12 KB, 下载次数: 135

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2218

回帖

5450

积分

版主

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

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 19:30 , Processed in 0.135909 second(s), 117 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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