我想diy 发表于 2025-7-24 17:41:05

太强了!!

逍遥派掌门人 发表于 2025-8-15 09:00:09

貌似是网上流传已久的 “小小调度器”

王昱顺 发表于 2025-8-15 11:28:26

逍遥派掌门人 发表于 2025-8-15 09:00
貌似是网上流传已久的 “小小调度器”

我进行了一点小小的改进,可以支持for嵌套了,程序灵活性提升很多

Tuier 发表于 2025-8-20 16:16:12

版主你好,对你的程序很感兴趣。把你的程序下载到单片机里运行正常。程序里的主频是固定位40M吗?我加了OLED12864(ST7567芯片)显示模块,结果40M频率无法显示,将主频改为24M后,屏幕能显示了(我的这块屏幕主频不能太高,高于24M就不显示了),但灯不闪烁了。请版主支招。谢谢!

while(1)
      {
                task_start(0);//协程0开始
                P34 = ~P34;//每次执行取反P00端口电平
                task_delay(100);//设定延时100ms
                task_wait(!P32);//P32电平作为判断条件,为1则等待,为0则继续向下执行
                //因为按键按下为0,所以正常是一直闪烁,按下P32则LED00停止闪烁
                task_end(1);//为1则循环执行
               
                task_start(1);//协程1开始
                P35 = 0;//P01端口置0,LED亮
                task_delay(200);//设定延时200ms
                P35 = 1;//P01端口置1,LED灭
                task_delay(500);//设定延时500ms
                task_end(1);//为1则循环执行
               
                task_start(2);//协程2开始
                task_delay(1000);//先长延时一段
                task_for(cnt1=0, cnt1++)//初始化和运行表达式(中间要用逗号链接!)
                {
                        task_for(cnt2=0, cnt2++)//第二层for循环
                        {
                              P36 = ~P36;//取反P02端口
                              task_delay(50);//小延时,快速闪烁
                        }
                        task_break(cnt2<3);//第二层for的判断条件,为1则返回for开头,为0则继续执行
                        P36 = 0;//强制给P02端口置低
                        task_delay(300);//设定延时300ms
                }
                task_break(cnt1<5);//第一层for的判断条件,为1则返回for开头,为0则继续执行
                task_end(1);//为1则循环运行

      task_start(3);//协程0开始
      OLED_BuffClear();                                  //清屏

      OLED_BuffShowString(0,0,"温度",0);
      OLED_BuffShowChar(10,2,'A',0);
      
OLED_BuffShow();
      task_delay(2);
      task_end(1);
      }
}

王昱顺 发表于 2025-8-20 18:39:20

Tuier 发表于 2025-8-20 16:16
版主你好,对你的程序很感兴趣。把你的程序下载到单片机里运行正常。程序里的主频是固定位40M吗?我加了OLE ...

那么可能是你的oled驱动函数不大适应高频率。我的这个程序运行在什么频率都可以,只要保证1ms的定时器基准是准的就可以了
还有,建议运行不同线程的时候,对程序内的执行分开一些,不然可能会堵塞到其他部分线程的执行,简单方法是加入一些task_delay,delay的同时会自动切换到其他有任务的线程运行

axiang974 发表于 2025-9-2 21:24:57

为什么我用实验箱下载1ms时基看不出效果。改成2ms时基就可以看出效果。

王昱顺 发表于 2025-9-2 22:56:06

axiang974 发表于 2025-9-2 21:24
为什么我用实验箱下载1ms时基看不出效果。改成2ms时基就可以看出效果。

考虑是否是中断打断导致的?这个框架本身很简单,基本不会出什么问题
唯一可能的就是除了while循环外还有耗费时间的东西,就会出现某个线程占用时间过长导致其他线程不正常运行

consoleyou 发表于 7 天前

感谢王工提供这么一个方便的多任务调度方法,如果我想用在8H8K64U上,是不是set_io.h和set_timer.h都需要重新设置。

王昱顺 发表于 7 天前

consoleyou 发表于 2025-10-9 17:01
感谢王工提供这么一个方便的多任务调度方法,如果我想用在8H8K64U上,是不是set_io.h和set_timer.h都需要重 ...

是的,任务部分不需要改动,这部分都是通用的

consoleyou 发表于 5 天前

Rebuild started: Project: TASK_Test
Rebuild target 'Target 1'
User command #1: .\Auto_Keil.exe
compiling main.c...
compiling set_task.c...
compiling set_io.c...
compiling set_timer.c...
set_timer.c(234): error C168: interrupt: value not in range 0 ... 31
Target not created.
Build Time Elapsed:00:00:01
直接用源代码编译出错。请问王工,我这是错在哪里了?
页: 1 2 3 4 5 [6] 7
查看完整版本: 【协程方式】实现【多任务调度 / 多线程】 仅需2byte的RAM 并带有详细视频讲解