- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2025-03-10 16:08:45
高级会员
- 积分
- 666
|
本帖最后由 13918210822 于 2024-5-12 16:42 编辑
需求上
1. DelayMs的时候,让其他需要的事情能够处理起来
2. 无论多重要,不要丢中断,不要丢信号
3. 知道这个CPU干活有多少,还有多少潜力,哪些任务比较占时间
4. 让用户有一个大状态机,“永远不死”
暂时就想到这些
实现上期望:
增加的代码或者宏,占用空间时间越少越好,少到 128字节都能跑,1~2K flash都能跑(tiny配置),复杂的功能可以配置使用,如果MCU资源多,128K RAM, 128K Flash也许是上限
ASM部分越少越好
能让使用者,自己搞清楚加了什么特性,负担多少,当然这个不着急
想法比较粗燥,各位见谅
--robin 20240506
本周除了设计硬件,主要都在学习各位的大作,以及思考轻量级的多任务究竟需要怎么划分功能,而且作为多任务运行库的支持API最少要哪些功能,以下仍然是粗略的思考:
从理念上,不再把MCU-RTOS当作传统意义上的操作系统,因为MCU本质上是单用户多数据源的应用。
传统操作系统2大部分功能 1:运行资源提供, 2: 多任务切换(主动与被动)与同步(加锁与免锁),在一个单用户应用中其实意义有所不同。
在一个增强型51MCU多任务系统中,没有线性内存,也没有资源影射,寄存器都是公用的,除了R0~R8有4个bank也是裸露在所有任务面前
由此,在一个MCU-RTOS上,任何虚拟化都是没有必要的。自然所谓的内核态也没有意义。
其实能提供的就是一个多任务的运行库提供异步读写与任务同步对象的支持。
统计功能作为一个子任务都是附加的,可裁减的非必要功能。
而必需的,至少有以下一些(逐步完善,并提供必要程度分级,0级表示最必需的)
1. 一个阻塞读取(休眠): reaedQ(qid, timeout) 0级
qid = 0, 表示只是单纯释放控制权, timeout期待的时间片数量,如果时间片为100us, 10表示1ms,
若设置为0,表示任务希望释放当前时间片。delay(timeout) 等价于 readQ(0,timeout)
qid > 0, 表示读取特定信号队列,比如DMA Uart Recv Fifo, ADC Value Fifo, ... 之所以规约为Q(Fifo),
因为这个结构如果是单生产单消费,是一个免锁结构,不必增加关闭中断的步骤
2. 一个非延迟异步写,不需要运行库,但是最好一个Q(Fifo)绑定
3. 一个带延迟同步写,需要运行库,delay(timeout)即readQ(0,timeout), 这种极限利用的操作,要求快速的任务切换,时间片应该是微秒级别。
4. ISR, 中断服务(DMA-UART/UART, ADC...,作为一个多任务运行库,不应该限制任何中断的使用,
除了一个定时器中断和其他任务可以重用,但是至少运行库要分享一个定时器中断
运行库关键支持功能:
1. 一个任务信息(优先级,是否可以允许打断...)更新,集成在运行库API的下端被调用
2. LCALL/ACALL/中断/发生后的栈处理
3. 某个定时中断内,更新多任务状态机
附8051指令码(STC8H) 第一字节OPCODE 256坑位图,要熟悉汇编,整理一下.
不同颜色是不同速度,绿色1周期,黄色2周期,棕色(乘法除法)4周期
下周争取抽空整理一个轻量多任务的框架--robin 20240512
|
-
1
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
-
+2
楼主威武~
|