13918210822 发表于 2024-5-13 12:23:54

本帖最后由 13918210822 于 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,加油!


神农鼎 发表于 2024-5-13 13:01:37



任务调度方法,【无错,至简】!“多任务分时调度” - uCOS/FreeRTOS,GUI-uGFX/U8g2, 文件系统, 国产RTOS, 实时操作系统 国芯技术交流网站 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

13918210822 发表于 2024-5-13 15:54:36

神农鼎 发表于 2024-5-13 13:01
任务调度方法,【无错,至简】!“多任务分时调度” - uCOS/FreeRTOS,GUI-uGFX/U8g2, 文件系统, 国产RTO ...

这是一个很好的模型。

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

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

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

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

杨为民 发表于 2024-5-13 16:44:31

13918210822 发表于 2024-5-13 15:54
这是一个很好的模型。

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


你要用在STC8系列,还是STC32G系列?

13918210822 发表于 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操作,打印端口共享等...

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

蜗牛 发表于 2024-5-13 20:42:57

13918210822 发表于 2024-5-13 19:18
STC8H能跑到24M以上,也是1T, OP大部分是1~2周期。

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

不懂RTOS,感觉能实现这样的功能大多数产品也够用了

杨为民 发表于 2024-5-13 23:21:05

13918210822 发表于 2024-5-13 19:18
STC8H能跑到24M以上,也是1T, OP大部分是1~2周期。

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

等待你的“FOP51”研究结果

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

xiangzichen 发表于 2024-5-14 03:25:21

u16 delay_ms_v1 = 0;               //全局延时值
u16 delay_ms_v2 = 0;

void TM0_Isr() interrupt 1{         //设定为1ms的周期
    if(delay_ms_v1) delay_ms_v1--;//如果非零,减一
    if(delay_ms_v2) delay_ms_v2--;
}

void myfun1(){
    static u8 delay_start = 0;      //开始延时标记
   
    if(delay_start == 0){         //无延时标记,执行延时之前的动作
      printf("1");
      printf("2");
      printf("3");
      printf("4");
      //_delay_ms(100);                                 //延时
      delay_ms_v1 = 100;
      delay_start = 1;            //设定标记
    }
    else{                           //有延时标记了.
      if(delay_ms_v1 == 0){       //是不是延时到了?
            printf("11");
            printf("22");
            printf("33");
            printf("44");
            delay_start = 0;      //清除标记
      }
    }
}

void myfun2(){
    static u8 delay_start = 0;      //开始延时标记
   
    if(delay_start == 0){         //无延时标记,执行延时之前的动作
      printf("1");
      printf("2");
      printf("3");
      printf("4");
      //_delay_ms(100);                                 
      delay_ms_v2 = 200;          //延时
      delay_start = 1;            //设定标记
    }
    else{                           //有延时标记了.
      if(delay_ms_v2 == 0){       //是不是延时到了?
            printf("11");
            printf("22");
            printf("33");
            printf("44");
            delay_start = 0;      //清除标记
      }
    }
}

void main(){
    while(1){
      myfun1();
      myfun2();
    }
}

/*不是很懂OS那些,不过你是要这个意思吗?
myfun1和myfun2里面的,执行了设定延时值就会出来,然后每次去判断,是不是时间到了.到了就执行另外一段代码.
*/

xiangzichen 发表于 2024-5-14 03:28:36

xiangzichen 发表于 2024-5-14 03:25


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

13918210822 发表于 2024-5-14 04:07:12

xiangzichen 发表于 2024-5-14 03:28
以前写一个什么传感器,查询一次后需要时间才有结果,干等着很麻烦,就是类似这种模式实现的. ...

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

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

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

页: 1 2 3 [4] 5 6
查看完整版本: 最小“非抢占”系统调度服务的必须功能--理念讨论贴,小白发贴,欢迎各位高手及小白