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

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-08-22 02:53:49
已绑定手机

0

主题

10

回帖

226

积分

中级会员

积分
226
发表于 2025-7-21 09:42:48 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:118
  • 最近打卡:2025-08-23 15:15:07
已绑定手机

0

主题

87

回帖

710

积分

高级会员

积分
710
发表于 2025-7-23 08:43:56 | 显示全部楼层
学习中
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-08-22 09:19:40
已绑定手机

0

主题

3

回帖

72

积分

注册会员

积分
72
发表于 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
  • 打卡总天数:547
  • 最近打卡:2025-08-21 21:27:12
已绑定手机
已实名认证

116

主题

2712

回帖

6806

积分

版主

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:562
  • 最近打卡:2025-08-22 11:04:46

25

主题

191

回帖

1662

积分

金牌会员

积分
1662
发表于 3 天前 | 显示全部楼层
版主你好,对你的程序很感兴趣。把你的程序下载到单片机里运行正常。程序里的主频是固定位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的定时器基准是准的就可以了 还有,建议运行不同线程的时候,对程序内的执行分开一些,不然可能会堵塞到其他部分线程的执  详情 回复 发表于 3 天前
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:547
  • 最近打卡:2025-08-21 21:27:12
已绑定手机
已实名认证

116

主题

2712

回帖

6806

积分

版主

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-23 20:19 , Processed in 0.139259 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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