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

【协程方式】实现【多任务调度 / 多线程】 仅需2byte的RAM 并带有详细视频讲解

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:532
  • 最近打卡:2025-06-15 08:04:01

0

主题

41

回帖

1927

积分

金牌会员

积分
1927
发表于 2025-4-23 11:04:27 | 显示全部楼层
很厉害
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:459
  • 最近打卡:2025-06-15 10:54:24

10

主题

71

回帖

1529

积分

金牌会员

积分
1529
发表于 2025-4-23 22:40:48 | 显示全部楼层
请问楼主:
#define task_delay(delay_ms) user_task[_this_task].state=__LINE__;\
user_task[_this_task].time=delay_ms;case __LINE__:if(user_task[_this_task].time!=0)break;
//延时后继续向下,内部填入延时ms时间,等待时间后继续向下

__LINE__是在那里定义?什么意思?

点评

这个是keil自带的宏定义喔,用于替换成当前的行号,具体内容视频都讲了,可以看看视频,详细讲解视频已经放在一楼开头了  详情 回复 发表于 2025-4-24 08:07
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-06-15 10:18:37
已绑定手机
已实名认证

112

主题

2387

回帖

6004

积分

版主

积分
6004
发表于 2025-4-24 08:07:48 | 显示全部楼层
hhh*** 发表于 2025-4-23 22:40
请问楼主:
#define task_delay(delay_ms) user_task[_this_task].state=__LINE__;\
user_task[_this_task] ...

这个是keil自带的宏定义喔,用于替换成当前的行号,具体内容视频都讲了,可以看看视频,详细讲解视频已经放在一楼开头了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:459
  • 最近打卡:2025-06-15 10:54:24

10

主题

71

回帖

1529

积分

金牌会员

积分
1529
发表于 2025-4-24 10:53:55 | 显示全部楼层
for语句与switch中的case语句嵌套在一起,没有语法错误吗?中途还用break跳出for循环,然后再返回for循环。

点评

逻辑很严谨的,并且还有三个拓展例程,都运行的相当好  详情 回复 发表于 2025-4-24 22:07
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:459
  • 最近打卡:2025-06-15 10:54:24

10

主题

71

回帖

1529

积分

金牌会员

积分
1529
发表于 2025-4-24 16:05:32 | 显示全部楼层
翻译了楼主首页的协程2:
_this_task=2;
if(task_num<Task_Max_Num)
   switch(user_task[_this_task].state)
   {
   case 0:
      ;
      user_task[_this_task].state=__LINE__;
      user_task[_this_task].time=1000;
   case __LINE__:
      if(user_task[_this_task].time!=0)break;;
      cnt1=0;
      user_task[_this_task].state = __LINE__;
   case __LINE__:
      for(_task_for_cnt = 1; _task_for_cnt--; cnt1++,user_task[_this_task].state = __LINE__)
      {
         cnt2=0;
         user_task[_this_task].state = __LINE__;
      case __LINE__:
         for(_task_for_cnt = 1; _task_for_cnt--; cnt2++,user_task[_this_task].state = __LINE__)
         {
            P02 = ~P02;//取反P02端口
            user_task[_this_task].state=__LINE__;
            user_task[_this_task].time=50;
         case __LINE__:
            if(user_task[_this_task].time!=0)break;;
         }
         if(cnt2<3) break;//第二层for的判断条件,为1则返回for开头,为0则继续执行
         P02 = 0;//强制给P02端口置高
         user_task[_this_task].state=__LINE__;
         user_task[_this_task].time=300;
      case __LINE__:
         if(user_task[_this_task].time!=0)break;;
      }
      if(cnt1<5) break;//
      if(1)user_task[_this_task].state=0;
      break;
   }

为了方便看先不要管__LINE__的位置,中间这么多“case __LINE__:”,switch和for语句交织在一起,真的没有问题?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:384
  • 最近打卡:2025-06-14 10:11:57

10

主题

166

回帖

1397

积分

金牌会员

积分
1397
发表于 2025-4-24 19:41:17 | 显示全部楼层
学习了
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-06-15 10:18:37
已绑定手机
已实名认证

112

主题

2387

回帖

6004

积分

版主

积分
6004
发表于 2025-4-24 22:07:33 | 显示全部楼层
hhh*** 发表于 2025-4-24 10:53
for语句与switch中的case语句嵌套在一起,没有语法错误吗?中途还用break跳出for循环,然后再返回for循环。 ...

逻辑很严谨的,并且还有三个拓展例程,都运行的相当好
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:306
  • 最近打卡:2025-06-15 06:48:42

0

主题

206

回帖

1706

积分

金牌会员

积分
1706
发表于 2025-4-26 10:13:40 | 显示全部楼层
一看,这个很给力,我果断下载例程,打开Keil,按照习惯,没改任何代码,直接编译没有成功,*** Error: CreateProcess failed, Command: 'C:\Users\Administrator\Desktop\AI8051U-DEMO-CODE-V1.2库\AI8051U专用库函数\独立例程\9使用协程完成多任务调度\Auto_Keil.exe'
Target not created.
Build Time Elapsed:  00:00:00
怎么才能正常编译呢?
要不直接开发个,像类似小时钟树的工具吧!
王帅哥呀,一定要减轻使用门槛,这么好的理论,别荒废了。

点评

2025年4月26日 11点27分 -Auto_Keil更新保存地址使用相对地址,以防止初次编译出错 [attachimg]95305[/attachimg] 目前已经更新为相对地址的Auto_Keil了,重新下载,再次编译就不会出现问题了  详情 回复 发表于 2025-4-26 11:32
关闭Keil后,重新双击Auto_Keil.exe这个文件就可以了。 原因是这个小工具写入的是绝对地址,所以这个地址其实是我这边的地址 重新运行就能覆盖掉了 等我寻找一下怎么改成相对地址就好了  详情 回复 发表于 2025-4-26 11:01
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-06-15 10:18:37
已绑定手机
已实名认证

112

主题

2387

回帖

6004

积分

版主

积分
6004
发表于 2025-4-26 11:01:37 | 显示全部楼层
大*** 发表于 2025-4-26 10:13
一看,这个很给力,我果断下载例程,打开Keil,按照习惯,没改任何代码,直接编译没有成功,*** Error: Cre ...

关闭Keil后,重新双击Auto_Keil.exe这个文件就可以了。
原因是这个小工具写入的是绝对地址,所以这个地址其实是我这边的地址
重新运行就能覆盖掉了
等我寻找一下怎么改成相对地址就好了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-06-15 10:18:37
已绑定手机
已实名认证

112

主题

2387

回帖

6004

积分

版主

积分
6004
发表于 2025-4-26 11:32:05 | 显示全部楼层
大*** 发表于 2025-4-26 10:13
一看,这个很给力,我果断下载例程,打开Keil,按照习惯,没改任何代码,直接编译没有成功,*** Error: Cre ...



2025年4月26日 11点27分
-Auto_Keil更新保存地址使用相对地址,以防止初次编译出错

截图202504261131255273.jpg
目前已经更新为相对地址的Auto_Keil了,重新下载,再次编译就不会出现问题了
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 04:17 , Processed in 1.162581 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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