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

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

  [复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:216
  • 最近打卡:2026-03-06 08:18:48

15

主题

228

回帖

423

积分

中级会员

积分
423
发表于 2026-1-13 13:50:26 | 显示全部楼层
被你这么一说,忽然感觉多线程好像里我也不远
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:580
  • 最近打卡:2026-03-07 08:48:31

42

主题

211

回帖

960

积分

高级会员

积分
960
发表于 2026-1-22 11:11:26 | 显示全部楼层
看了王老师的代码,使用了涵数指针。但不明白王老师为什么把定时器设置功能,设计的那么复杂,要用到T4和T11定时器来进行计算。这给移植带来了许多困难。

点评

你可以随便做一个定时器中断,把多线程的处理函数放进去就行了。 我那个是源于一个定时器的库,为了方便配置做的而已,内部复杂是肯定的,但是配置起来比较简单  详情 回复 发表于 2026-1-22 13:47
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:687
  • 最近打卡:2026-03-05 13:33:59
已绑定手机
已实名认证

129

主题

3375

回帖

8784

积分

版主

积分
8784
发表于 2026-1-22 13:47:01 | 显示全部楼层
康辉*** 发表于 2026-1-22 11:11
看了王老师的代码,使用了涵数指针。但不明白王老师为什么把定时器设置功能,设计的那么复杂,要用到T4和T1 ...

你可以随便做一个定时器中断,把多线程的处理函数放进去就行了。
我那个是源于一个定时器的库,为了方便配置做的而已,内部复杂是肯定的,但是配置起来比较简单
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-23 10:02:21
已绑定手机

0

主题

5

回帖

60

积分

注册会员

积分
60
发表于 2026-1-23 10:02:21 | 显示全部楼层
STC32G8K的,将协程移植放进去,task_delay(1000);不是一1S。非常快,串口一直不停的发。根本没延时,P34P35是LED灯也不受控。怎么也关不掉。是怎么回事,以下是各相关的代码,帮忙看一下
void Task11(void)
{
        task_start(11);
        TX1_write2buff(0x30);
        TX1_write2buff(0x37);
        TX1_write2buff(0x31);
        TX1_write2buff(0x30);
        P34=~P34;
        P35=~P35;
        task_delay(1000);
        task_end(1);
}
……………………
#define Task_Max_Num 12
……
//每隔任务的数据结构
typedef struct
{
        unsigned int time;
        unsigned long state;
} _task;
……
void        Timer_config(void)
{
        TIM_InitTypeDef                TIM_InitStructure;                                                //结构定义
        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;        //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;                                //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value     = (u16)(65536UL - (MAIN_Fosc / 1000UL));                //中断频率, 1000次/秒
        TIM_InitStructure.TIM_PS        = 0;                                        //8位预分频器(n+1), 0~255
        TIM_InitStructure.TIM_Run       = ENABLE;                                        //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer0,&TIM_InitStructure);                                        //初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer0_Init(ENABLE,Priority_0);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}
……
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR                //进中断时已经清除标志
{
        set_task_mode();
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:580
  • 最近打卡:2026-03-07 08:48:31

42

主题

211

回帖

960

积分

高级会员

积分
960
发表于 2026-1-23 10:04:54 | 显示全部楼层
按照王老师的思路,我用STCISP中的魔方生成了STC8H8K64U的代码框架,然后把协程的代码加进去,放弃原协程的定时器设置文件,使用代码框架中的定时器0产生的1ms节拍,成功移植到了STC8H8K64U上面。
谢谢王老题指点。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:580
  • 最近打卡:2026-03-07 08:48:31

42

主题

211

回帖

960

积分

高级会员

积分
960
发表于 2026-1-23 11:08:17 | 显示全部楼层
irop*** 发表于 2026-1-23 10:02
STC32G8K的,将协程移植放进去,task_delay(1000);不是一1S。非常快,串口一直不停的发。根本没延时,P34P3 ...

void Task11(void)
{
        task_start(11);
        TX1_write2buff(0x30);
        TX1_write2buff(0x37);
        TX1_write2buff(0x31);
        TX1_write2buff(0x30);
        P34=~P34;
        P35=~P35;
        task_delay(1000);
        task_end(1);
}

task_start 和task_end需要配对使用,你关闭的是任务1,任务11一直处于打开状态,没有关闭。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-01-23 10:02:21
已绑定手机

0

主题

5

回帖

60

积分

注册会员

积分
60
发表于 2026-1-23 11:19:17 | 显示全部楼层
康辉*** 发表于 2026-1-23 11:08
void Task11(void)
{
        task_start(11);

#define task_end(reload) if(reload)user_task[_this_task].state=0;else user_task[_this_task].state = __LINE__;break;}
//线程结束,内部填入是否重新开始线程,1为重新开始,0为结束等待

点评

任务有最大数量限制,如果使用到11,记得调整一下h文件中的定义,否则数组是没有定义到的,会跑飞  详情 回复 发表于 2026-1-23 13:36
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:687
  • 最近打卡:2026-03-05 13:33:59
已绑定手机
已实名认证

129

主题

3375

回帖

8784

积分

版主

积分
8784
发表于 2026-1-23 13:36:33 | 显示全部楼层
irop*** 发表于 2026-1-23 11:19
#define task_end(reload) if(reload)user_task[_this_task].state=0;else user_task[_this_task].state  ...

任务有最大数量限制,如果使用到11,记得调整一下h文件中的定义,否则数组是没有定义到的,会跑飞
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-02-12 06:12:18
已绑定手机

0

主题

12

回帖

113

积分

注册会员

积分
113
发表于 2026-2-12 06:12:18 | 显示全部楼层
王工真是英雄之见略同呀
我们也有一个类似的TTSS架构 和你的协程类似的思路 我们也叫伪时间片的操作系统,是一个严格按流程图完成的嵌入式的系统软件设计架构, 脚手架级别的设计,容易上手
正确的地方放正确的数据
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-7 15:32 , Processed in 0.119418 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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