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

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

  [复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:29
  • 最近打卡:2025-10-14 14:52:41
已绑定手机

0

主题

3

回帖

132

积分

注册会员

积分
132
发表于 2025-7-24 17:41:05 | 显示全部楼层
太强了!!
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:19
  • 最近打卡:2025-08-15 09:00:09

5

主题

31

回帖

189

积分

注册会员

积分
189
发表于 2025-8-15 09:00:09 | 显示全部楼层
貌似是网上流传已久的 “小小调度器”

点评

我进行了一点小小的改进,可以支持for嵌套了,程序灵活性提升很多  详情 回复 发表于 2025-8-15 11:28
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 2025-8-15 11:28:26 | 显示全部楼层
逍遥派*** 发表于 2025-8-15 09:00
貌似是网上流传已久的 “小小调度器”

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 10:29:10

25

主题

198

回帖

1808

积分

金牌会员

积分
1808
发表于 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);
        }
}

点评

那么可能是你的oled驱动函数不大适应高频率。我的这个程序运行在什么频率都可以,只要保证1ms的定时器基准是准的就可以了 还有,建议运行不同线程的时候,对程序内的执行分开一些,不然可能会堵塞到其他部分线程的执  详情 回复 发表于 2025-8-20 18:39
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 2025-8-20 18:39:20 | 显示全部楼层
Tui*** 发表于 2025-8-20 16:16
版主你好,对你的程序很感兴趣。把你的程序下载到单片机里运行正常。程序里的主频是固定位40M吗?我加了OLE ...

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:163
  • 最近打卡:2025-10-15 21:06:46
已绑定手机

1

主题

7

回帖

777

积分

高级会员

积分
777
发表于 2025-9-2 21:24:57 | 显示全部楼层
为什么我用实验箱下载1ms时基看不出效果。改成2ms时基就可以看出效果。

点评

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 2025-9-2 22:56:06 | 显示全部楼层
axian*** 发表于 2025-9-2 21:24
为什么我用实验箱下载1ms时基看不出效果。改成2ms时基就可以看出效果。

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:548
  • 最近打卡:2025-10-15 09:47:36

8

主题

81

回帖

944

积分

高级会员

积分
944
发表于 7 天前 | 显示全部楼层
感谢王工提供这么一个方便的多任务调度方法,如果我想用在8H8K64U上,是不是set_io.h和set_timer.h都需要重新设置。

点评

是的,任务部分不需要改动,这部分都是通用的  详情 回复 发表于 7 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 7 天前 | 显示全部楼层
conso*** 发表于 2025-10-9 17:01
感谢王工提供这么一个方便的多任务调度方法,如果我想用在8H8K64U上,是不是set_io.h和set_timer.h都需要重 ...

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:548
  • 最近打卡:2025-10-15 09:47:36

8

主题

81

回帖

944

积分

高级会员

积分
944
发表于 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
直接用源代码编译出错。请问王工,我这是错在哪里了?

点评

我使用了超过31的中断号 你需要使用一个中断号拓展工具来做个补丁 https://www.stcai.com/gjrj 在这里下载  详情 回复 发表于 5 天前
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 03:39 , Processed in 0.135333 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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