找回密码
 立即注册
楼主: 13918210822

最小“非抢占”系统调度服务的必须功能--理念讨论贴,小白发贴,欢迎各位高手及小白

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-10 16:08:45

6

主题

131

回帖

666

积分

高级会员

积分
666
发表于 2024-5-13 12:23:54 | 显示全部楼层
本帖最后由 139182*** 于 2024-5-13 12:26 编辑
13918210822 发表于 2024-5-9 17:53
也许,一个类似Fiber的支持工具宏,可以在51(128~1K ram, 2k~8k flash)上支持快速切换

如果能控制现场 ...

Fiber纤程,最早多用于用户态多任务快速切换,比一般线程快1个数量级,在PC上可以少到2ns,比如在SQLServer高并发背后就有Fiber的机制在保障。

51裸机下虽然没有操作系统,但是仍然可以应用Fiber的概念

或者说Fiber Operating Platform并不需要操作系统作为服务,而是自我管理的
当然, 一旦Multi-Fibers完整运行起来,也可以看成一个自治的功能缩减的局部操作系统。

FOP51, 也许以这个名字去命名51上的快速多任务运行支持库是比较合适的

目标是各位RTOS的一个缩减板,缩减的目标不是刻意减少功能,而是只用最必要的功能

提供一个针对51的轻量的多任务运行环境,在提供单核高实时响应,伪并发的基础上,
不丢失任何信号(不关中断),但是会充分利用DMA作为信号缓存

至少争取在一个产品的工程实例上做到稳定,

以上,定一个目标,作为自我约束激励。FOP51,加油!


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-5-13 13:01:37 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-10 16:08:45

6

主题

131

回帖

666

积分

高级会员

积分
666
发表于 2024-5-13 15:54:36 | 显示全部楼层
神*** 发表于 2024-5-13 13:01
任务调度方法,【无错,至简】!“多任务分时调度” - uCOS/FreeRTOS,GUI-uGFX/U8g2, 文件系统, 国产RTO ...

这是一个很好的模型。

但也有一些力所不及的时候,比如一个任务要分很多小步骤完成,中间要多次delayMS

这些delay是否可以某种方式不用while(nop)。

而且,多种事件的处理是否可以伪并行

这是我考虑加一个任务快速切换支持的原因。

点评

你要用在STC8系列,还是STC32G系列?  详情 回复 发表于 2024-5-13 16:44
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-5-13 16:44:31 | 显示全部楼层
139182*** 发表于 2024-5-13 15:54
这是一个很好的模型。

但也有一些力所不及的时候,比如一个任务要分很多小步骤完成,中间要多次delayMS

你要用在STC8系列,还是STC32G系列?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-10 16:08:45

6

主题

131

回帖

666

积分

高级会员

积分
666
发表于 2024-5-13 19:18:26 | 显示全部楼层
本帖最后由 13918210822 于 2024-5-13 19:21 编辑

STC8H能跑到24M以上,也是1T, OP大部分是1~2周期。

我希望用在STC8H系列,STC32应该可以支持稍微复杂一点的RTOS,

但一个更轻量的Fiber Operating Platform应该同样也可跑在STC32上

但为了更清晰的理解要做的事情,我准备用STC8H来跑这个简化版本任务库

关于死锁这类问题,在51上,也不准备再多任务运行库这个级别考虑,死锁由任务在申请共享资源对象时,按照一定申请序列规范来避免
至于抢占还是协作,我认为协作作为多极中断的补充也已够用

我比较不能忍耐的是,一个超慢的多步骤命令中间直接用while_nop来延时,比如LCD操作,打印端口共享等...

与其搞一个子任务的状态机,不如实现一个任务阻塞切换。

点评

等待你的“FOP51”研究结果 目前多任务切换STC8H为20uS的水平,纤程切换应该可以小于1uS  详情 回复 发表于 2024-5-13 23:21
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:287
  • 最近打卡:2025-05-01 13:00:01

0

主题

52

回帖

1280

积分

金牌会员

积分
1280
发表于 2024-5-13 20:42:57 | 显示全部楼层
139182*** 发表于 2024-5-13 19:18
STC8H能跑到24M以上,也是1T, OP大部分是1~2周期。

我希望用在STC8H系列,STC32应该可以支持稍微复杂一点 ...

不懂RTOS,感觉能实现这样的功能大多数产品也够用了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-5-13 23:21:05 | 显示全部楼层
139182*** 发表于 2024-5-13 19:18
STC8H能跑到24M以上,也是1T, OP大部分是1~2周期。

我希望用在STC8H系列,STC32应该可以支持稍微复杂一点 ...

等待你的“FOP51”研究结果

目前多任务切换STC8H为20uS的水平,纤程切换应该可以小于1uS
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-04-25 16:31:21
已绑定手机

14

主题

600

回帖

2199

积分

荣誉版主

积分
2199
发表于 2024-5-14 03:25:21 | 显示全部楼层
  1. u16 delay_ms_v1 = 0;                 //全局延时值
  2. u16 delay_ms_v2 = 0;
  3. void TM0_Isr() interrupt 1{         //设定为1ms的周期
  4.     if(delay_ms_v1) delay_ms_v1--;  //如果非零,减一
  5.     if(delay_ms_v2) delay_ms_v2--;
  6. }
  7. void myfun1(){
  8.     static u8 delay_start = 0;      //开始延时标记
  9.    
  10.     if(delay_start == 0){           //无延时标记,执行延时之前的动作
  11.         printf("1");
  12.         printf("2");
  13.         printf("3");
  14.         printf("4");
  15.         //_delay_ms(100);                                   //延时
  16.         delay_ms_v1 = 100;
  17.         delay_start = 1;            //设定标记
  18.     }
  19.     else{                           //有延时标记了.
  20.         if(delay_ms_v1 == 0){       //是不是延时到了?
  21.             printf("11");
  22.             printf("22");
  23.             printf("33");
  24.             printf("44");
  25.             delay_start = 0;        //清除标记
  26.         }
  27.     }
  28. }
  29. void myfun2(){
  30.     static u8 delay_start = 0;      //开始延时标记
  31.    
  32.     if(delay_start == 0){           //无延时标记,执行延时之前的动作
  33.         printf("1");
  34.         printf("2");
  35.         printf("3");
  36.         printf("4");
  37.         //_delay_ms(100);                                 
  38.         delay_ms_v2 = 200;          //延时
  39.         delay_start = 1;            //设定标记
  40.     }
  41.     else{                           //有延时标记了.
  42.         if(delay_ms_v2 == 0){       //是不是延时到了?
  43.             printf("11");
  44.             printf("22");
  45.             printf("33");
  46.             printf("44");
  47.             delay_start = 0;        //清除标记
  48.         }
  49.     }
  50. }
  51. void main(){
  52.     while(1){
  53.         myfun1();
  54.         myfun2();
  55.     }
  56. }
  57. /*不是很懂OS那些,不过你是要这个意思吗?
  58. myfun1和myfun2里面的,执行了设定延时值就会出来,然后每次去判断,是不是时间到了.到了就执行另外一段代码.
  59. */
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:338
  • 最近打卡:2025-04-25 16:31:21
已绑定手机

14

主题

600

回帖

2199

积分

荣誉版主

积分
2199
发表于 2024-5-14 03:28:36 | 显示全部楼层

以前写一个什么传感器,查询一次后需要时间才有结果,干等着很麻烦,就是类似这种模式实现的.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-10 16:08:45

6

主题

131

回帖

666

积分

高级会员

积分
666
发表于 2024-5-14 04:07:12 | 显示全部楼层
xiangz*** 发表于 2024-5-14 03:28
以前写一个什么传感器,查询一次后需要时间才有结果,干等着很麻烦,就是类似这种模式实现的. ...

这个本质上还是轮询,不过是统一交给Main来调用多个轮询执行例程

我希望做的事,由中断或者时钟触发多个任务就绪标志,然后在“协作”空闲时将某就绪任务启动

我目标中的这个模式更类似有一个任务调度者,只不过,用的不是传统意义上线程,而是一种更轻量级的实现方式--纤程

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:41 , Processed in 0.150106 second(s), 118 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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