xlmttkl 发表于 2025-4-23 11:04:27

很厉害

hhh402 发表于 2025-4-23 22:40:48

请问楼主:
#define task_delay(delay_ms) user_task.state=__LINE__;\
user_task.time=delay_ms;case __LINE__:if(user_task.time!=0)break;
//延时后继续向下,内部填入延时ms时间,等待时间后继续向下

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

王昱顺 发表于 2025-4-24 08:07:48

hhh402 发表于 2025-4-23 22:40
请问楼主:
#define task_delay(delay_ms) user_task.state=__LINE__;\
user_task ...

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

hhh402 发表于 2025-4-24 10:53:55

for语句与switch中的case语句嵌套在一起,没有语法错误吗?中途还用break跳出for循环,然后再返回for循环。

hhh402 发表于 2025-4-24 16:05:32

翻译了楼主首页的协程2:
_this_task=2;
if(task_num<Task_Max_Num)
   switch(user_task.state)
   {
   case 0:
      ;
      user_task.state=__LINE__;
      user_task.time=1000;
   case __LINE__:
      if(user_task.time!=0)break;;
      cnt1=0;
      user_task.state = __LINE__;
   case __LINE__:
      for(_task_for_cnt = 1; _task_for_cnt--; cnt1++,user_task.state = __LINE__)
      {
         cnt2=0;
         user_task.state = __LINE__;
      case __LINE__:
         for(_task_for_cnt = 1; _task_for_cnt--; cnt2++,user_task.state = __LINE__)
         {
            P02 = ~P02;//取反P02端口
            user_task.state=__LINE__;
            user_task.time=50;
         case __LINE__:
            if(user_task.time!=0)break;;
         }
         if(cnt2<3) break;//第二层for的判断条件,为1则返回for开头,为0则继续执行
         P02 = 0;//强制给P02端口置高
         user_task.state=__LINE__;
         user_task.time=300;
      case __LINE__:
         if(user_task.time!=0)break;;
      }
      if(cnt1<5) break;//
      if(1)user_task.state=0;
      break;
   }

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

lhj 发表于 2025-4-24 19:41:17

学习了

王昱顺 发表于 2025-4-24 22:07:33

hhh402 发表于 2025-4-24 10:53
for语句与switch中的case语句嵌套在一起,没有语法错误吗?中途还用break跳出for循环,然后再返回for循环。 ...

逻辑很严谨的,并且还有三个拓展例程,都运行的相当好

大叶子 发表于 6 天前

一看,这个很给力,我果断下载例程,打开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
怎么才能正常编译呢?
要不直接开发个,像类似小时钟树的工具吧!
王帅哥呀,一定要减轻使用门槛,这么好的理论,别荒废了。

王昱顺 发表于 6 天前

大叶子 发表于 2025-4-26 10:13
一看,这个很给力,我果断下载例程,打开Keil,按照习惯,没改任何代码,直接编译没有成功,*** Error: Cre ...

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

王昱顺 发表于 6 天前

大叶子 发表于 2025-4-26 10:13
一看,这个很给力,我果断下载例程,打开Keil,按照习惯,没改任何代码,直接编译没有成功,*** Error: Cre ...



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


目前已经更新为相对地址的Auto_Keil了,重新下载,再次编译就不会出现问题了
页: 1 2 [3] 4
查看完整版本: 【协程方式】实现【多任务调度 / 多线程】 仅需2byte的RAM 并带有详细视频讲解