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来调用多个轮询执行例程
我希望做的事,由中断或者时钟触发多个任务就绪标志,然后在“协作”空闲时将某就绪任务启动
我目标中的这个模式更类似有一个任务调度者,只不过,用的不是传统意义上线程,而是一种更轻量级的实现方式--纤程