打印

用一个春节写完一个RTOS,稳定+可靠【连载】

[复制链接]
楼主: hjz007
手机看帖
扫描二维码
随时随地手机跟帖
21
hjz007|  楼主 | 2014-2-8 20:03 | 只看该作者 回帖奖励 |倒序浏览
本帖最后由 hjz007 于 2014-2-8 20:04 编辑

我想OS的基本模型样子就有了。
后面的都是写繁杂的东西了,基本上是用C语言写的。
其中包括信号量,标识位,互斥量,用户接口调用的原子性操作,任务的调度等,非常复杂(不是代码多,而是其间的关系非常微妙,也就是说软件耦合度很高,逻辑关系非常复杂,已经不可能像任务调度一样,理出个简洁的脉络),我打算用PDF来描述,等我写好以后贴出来。

使用特权

评论回复
22
ballack_linux| | 2014-2-8 23:08 | 只看该作者
呵呵 有想法

使用特权

评论回复
23
shuidi_wangdan| | 2014-2-11 15:07 | 只看该作者
真心崇拜!

使用特权

评论回复
24
hjz007|  楼主 | 2014-2-11 16:09 | 只看该作者
当然一般的,在ISR里,是不能使用阻塞式函数.
不过,在HOS里,你可以使用HOSSemPost等类似函数。在HOS里,HOSSemPost函数会判断自己是否运行在ISR还是常规任务环境下,从而执行不同的操作,比如在ISR里,HOSSemPost就不会再触发OS调用的中断,这样可以防止中断再次触发中断...。
这样做和其它OS的不同是,在HOS里,这样做的目的是为了简化接口。

使用特权

评论回复
25
dota_yy| | 2014-2-11 16:52 | 只看该作者

使用特权

评论回复
26
08211004kun| | 2014-2-11 22:23 | 只看该作者
牛x

使用特权

评论回复
27
349264710| | 2014-2-12 21:46 | 只看该作者
hjz007 发表于 2014-2-6 10:53
先从最简单的开始吧
OS的本质就是任务调度。即把一个CPU虚拟成多个CPU,各个CPU之间尽量独立,最好是谁都不 ...

楼主,问个困扰我很久的问题,任务切换时除了要保存寄存器的值到任务栈中,还要保存PC、SP指针及任务的局部变量,请问OS是怎么知道哪些变量需要保存在任务栈中呢?

使用特权

评论回复
28
hjz007|  楼主 | 2014-2-12 23:12 | 只看该作者
局部变量是C编译器通过堆栈来分配的。OS不需要关心。

使用特权

评论回复
29
349264710| | 2014-2-13 12:49 | 只看该作者
hjz007 发表于 2014-2-12 23:12
局部变量是C编译器通过堆栈来分配的。OS不需要关心。

照这么说,任务栈的大小应该是固定的了,就是保存寄存器、PC、SP就可以了,但实际上答案是否定的,函数中的局部变量确实是编译器分配的,但程序正在函数内部执行,这时调用任务切换函数,切换任务,离开该函数体,这时操作系统应该还要保存该函数的局部变量,那操作系统是如何知道离开该函数需要保存哪些局部变量呢?

使用特权

评论回复
30
zxf0168| | 2014-2-13 15:03 | 只看该作者
不错,学习了

使用特权

评论回复
31
sdnumcu| | 2014-2-13 15:05 | 只看该作者
不错,比春晚靠谱多了

使用特权

评论回复
32
hjz007|  楼主 | 2014-2-13 17:41 | 只看该作者
349264710 发表于 2014-2-13 12:49
照这么说,任务栈的大小应该是固定的了,就是保存寄存器、PC、SP就可以了,但实际上答案是否定的,函数中 ...

在放变量的堆栈后面入栈的就是寄存器了,OS返回的时候,存放变量的堆栈又没改变过。

你买一套我的开发板吧,我带你入行啊。呵呵....

使用特权

评论回复
33
john_lee| | 2014-2-13 19:35 | 只看该作者
349264710 发表于 2014-2-13 12:49
照这么说,任务栈的大小应该是固定的了,就是保存寄存器、PC、SP就可以了,但实际上答案是否定的,函数中 ...

有个术语叫做“context”,看看wikipedia上的资料吧。

使用特权

评论回复
34
349264710| | 2014-2-14 00:03 | 只看该作者
hjz007 发表于 2014-2-13 17:41
在放变量的堆栈后面入栈的就是寄存器了,OS返回的时候,存放变量的堆栈又没改变过。

你买一套我的开发板 ...

OS返回的时候,存放变量的堆栈又没改变过,既然存放变量的栈没有改变过,又何来之保存任务的局部变量?直接恢复SP指针就行了,另外,当离开函数时,编译器会释放栈,而栈是存放局部变量的,也就是说,正在执行函数时,发生任务切换,离开函数体,由于离开了函数体,编译器可能在其他任务中使用函数体的栈(即存放变量的栈还是会变化的),如果OS不保护栈中的局部变量,返回时将出现错误,所以我觉得要把函数中使用的局部变量都要保存在任务栈中。不知道我这样理解对不对。

使用特权

评论回复
35
yanwenbin33| | 2014-2-16 12:42 | 只看该作者
这种高科技的东西,留下。。。。

使用特权

评论回复
36
黑小子mxx| | 2014-3-5 14:52 | 只看该作者
mark

使用特权

评论回复
37
andywyt| | 2014-3-5 15:39 | 只看该作者
学习了。,,,非常感谢

使用特权

评论回复
38
charrijon| | 2014-3-7 09:50 | 只看该作者
很有感触,下次有机会我也上传一个全C代码写的操作系统

使用特权

评论回复
39
深夜星空| | 2014-3-7 17:54 | 只看该作者
自己写OS的都是大牛啊

使用特权

评论回复
40
情意深深| | 2021-3-18 15:08 | 只看该作者
插眼

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则