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