YOS的一些设计说明
阎裕
2023-12-01
一.设计原则
a.实时性,要求所有的任务挂起、就绪、运行都是可以预测和可计算的。
1)在临界区代码,也就是被关闭和打开中断代码包含部分,不应该有for()和while注意的循环,因为注意的
代码会随for和while包含的个数,线性变化。
2)临界区执行时间和中断执行时间约束,
例如:在一个ARM Cortex M3内核中,运行系统需要设置一个1ms的SysTick定时器和一个115200的串口.
a.可由1ms的SysTick,可知执行时间 < 1ms.
b.使用115200的串口,使用中断接收数据,则一个bit的间隔是10^6ns/115200=8.68ns,每10位构成以个字节,
每个字节时间=8.68*10=86.8ns,所以执行时间<86.8ns.
c.所以总的来说,执行时间要小于86.8ns,整个系统才能正常运行.
注:1)这里也跟CPU频率有关系,频率高代码执行时间更快,更容易达到实时性。
2)有人说,我要使用一个16MHz的SPI接收中断,则其他的间隔是10^9us/16M=62.5us,则1个字节=62.5*10=625us,如果说该值小于系统执行时间,
则可能出现问题,一般情况来说,碰到这样高速接口,不要使用中断来接收数据,可以使用DMA来操作,减轻CPu负担.
b.支持抢占内核.
高优先级任务在需要时,能够立刻得到CPU时间,对于实时系统来说这是不可少的。
如按下按钮内,20ms需要执行1个任务,这里简单等按钮信号的任务为最高优先级,则可轻易满足该需求。
但如果,该任务不是最高优先级任务,存在其他优先级任务,则这里任务等待执行时间是不可预期的,所以这需要你
在任务设计时,需要考虑。
注: 1)经常说实时系统,很多人认为是靠操作系统是保证的,当其实操作系统是一部分,任务设计合理性也是极其必须的。
c.支持轮转调度.
支持轮转调度,这对实时性是个考验,如果同优先级有多个任务,则这个任务获得CPU的等待时间,等于其他任务获得时间片的时间*任务个数.
如果在按下按钮内,20ms需要执行1个任务,则这里的要求是
其他任务执行时间片时间*任务个数 < 20ms,这里知因为该时间是随任务个数增加而增加,所以如果你要保持实时性必须限制在优先级下的任务个数。
当然,这里我们也可以使用不支持轮转调度策略来屏蔽这个麻烦。
d.为支持教学和研究,本项目代码将全部使用中文注释,一些特殊,关键字,也使用中文术语。
个人认为这是一个重点,按国人的习惯来写注释,所以它完全是对国人是友好的。