源代码下载:http://www.cn-dos.net/forum/attachment.php?aid=3573&checkid=01076&download=1
注意:C_code.rar文件纠正了回调函数无法使用浮点数操作的问题...
演示下载:http://zhenlove.com.cn/cndos/fileup/files/gui_demo.rar
完整功能如下所述:
rtCell 实时微内核-具有下列功能:
1. 完全抢占的实时微内核结构,独立的内核栈,中断和系统调用均切换到内核栈执行;
2. 256(64、32)个优先级,0为最高优先级(系统保留),256(64、32)为空闲优先级;
3. 不同优先级任务完全抢占,同优先级之间可按先进先出或时间片轮转方式执行;
4. 在一系统(定时器服务)任务中实现内核定时器,用于超时等待内核对象、周期性定时器、任务延迟、一次定时(此时需定义一超时后执行的过程);此服务任务的优先级由其客户任务的最高优先级驱动,随之动态改变,以消除隐式优先级反转现象;
5. 提供任务(Task)、互斥锁(Mutex)、信号量(Semaphore)、位域标志(Flag定时器(Timer)、优先级消息(Message)和环形队列(Ring buffer)内核对象;
6. 任何内核对象用一整数ID标识,而非指针,从而可避免用户任务野指针的副作用,内核对象总数不超过61440(即60K);
7. 互斥锁支持优先级继承和优先级置顶协议,在创建时设置该协议,且总按优先级等待,优先级继承协议时仅支持同一互斥锁的嵌套调用,优先级置顶协议还可支持不同互斥锁的多次嵌套调用;
8. 其它对象的等待方式有:优先级等待和先进先出(节省内存)等待,在创建时设置;
9. 内核数据的同步,除在任务切换,及任务和内核之间切换堆栈时暂时关中断外,其它地方均以延迟过程调用(DPC)方式执行;
10. 任务对象支持异步过程调用(Window用语APC,相当于UNIX中的信号机制),从而可引导任务异步的执行一个过程(前提是任务栈不小于1024字节),此过程将在该任务下次被调度时执行;
11. 删除避免机制,拥有互斥锁的任务及处于占有状态的互斥锁均具有防止被删除的机制,要删除拥有互斥锁的任务必须自行终止或调用任务终止函数,而要删除任一个互斥锁则必须先使其处于空闲状态,即没有任何任务占有此互斥锁,否则禁止删除;
12. 对象命名机制,同类内核对象可用唯一的名称标识来获取其ID,达到引用目的。
13. 在内核中实现了中断的进出接口,因此用户中断处理只需写标准的C函数,而不必关心中断底层处理的细节;
14. 系统调用以陷阱指令(x86中int指令)实现,易于扩展到“内存保护”的进程模式;
15. 在内核库之外提供了一个简单的堆内存分配机制,用于内核对象动态内存分配时调用;
16. 支持毫秒级定时器,内核定时器周期为一毫秒;
17. 支持 X387/287 硬件浮点协处理器的任务状态保护,被动方式的任务浮点状态切换(开中断执行,由于使用了特权指令实现,因此只能在纯DOS实模式下或虚拟机X386/X387及后续机型上执行,而无法在Windows的DOS窗口中运行)。
giCell 视口裁减及消隐处理引擎-功能如下:
1. 完善而精巧的多视口裁剪和消隐处理引擎,与微内核rtCell紧密结合;
2. 真正的事件(或消息)驱动的多窗口(视口)技术,支持顶层窗口和透明窗口的显示和裁剪处理;
3. 当前支持Label、Edit、Botton、Slider、Listbox、TreeView和Checkbox控件,其中的Edit控件支持剪切、复制和粘贴(ctrl+x,ctrl+c,ctrl+v);
4. 支持窗口的平移、缩放,光标切换和窗口系统按钮,及窗口和控件的过程回调;
5. 基于透明视口(或窗口)的裁剪和消隐处理,可生成任何非矩形(多态)窗口,本示例中的三角形窗口就是基于透明视口来实现的;
7. 支持图形内存设备(GDC),有效避免窗口重绘时闪烁,易于实现视频及动画处理;
6. 内存需求小,窗口和控件的缺省状态均不使用GDC(而是采用直接屏技术),所耗内存小,因此实用性强,包括rtCell调度器、鼠标、键盘及图形驱动的库文件在DOS下仅77K。
关于可文件Engine.lib和mcOutLib.obj:
1. 考虑到DOS内存的限制,库文件Engine.lib中的rtCell内核仅支持32个任务优先级(因为优先级队列太占用内存),这样即使在640K内存下,也可创建上数百个内核及GUI对象,可满足一定规模的应用程序要求;
2. 库文件mcOutLib.obj是目录giCell\mcOSLib下文件的编译结果,用于处理任务的浮点协处理器(硬件)状态切换,任务浮点数状态初始化,内存分配,信息显示等操作(主要用于内核),用户也可自己编译giCell\mcOSLib目录下的文件,注意:Borland C/C++ 3.1可能无法识别其中的某些浮点数操作指令;
3. 文件MAIN.C是对Engine.lib使用的具体实例,在Borland C/C++ 3.1中编译时必须打开X387/287选项和C函数参数传递约定,此文件还对任何使用透明窗口来生成非矩形窗口,以及如何使用GDC生成动画进行了演示;
4. 注意其中的一些执行顺序:浮点数操作不得放到回调函数中执行,而只能在其它任务中执行(可从回调函数中向其它任务发送消息来实现),否则程序将进行无限循环;
5. 因为浮点协处理器的任务状态切换机制使用了特权指令,所生成的可执行文件只能在纯DOS实模式下或虚拟机X386/X387及后续机型上执行,而无法在Windows的DOS窗口中运行;
6. 由MAIN.C所生成的可执行文件在AMD机器DOS实模式、X86虚拟机qemu-0.9.0-windows以及Bochs-2.1.1下均执行良好,注意:生成的可执行文件依然是16位实模式。
压缩文件C_lib.rar中包含窗口及其子控件的源代码,演示文件MAIN.C和DateTime.c,以及一个专用于Borland C/C++ 3.1的工程文件。
注意:使用浮点数操作时最好把相关任务的栈设置到2K以上。
联系邮件:taowentao_twt@163.com, taowentao_twt@sohu.com
源代码下载:
汉字字库为Windows XP 标准9号宋体(http://www.cn-dos.net/forum/attachment.php?aid=3840&checkid=6c12e&download=1)。
注意DOS不可重入,在GUI任务之外调用DOS功能之前应加GUI锁,调用之后应解锁,而且调用DOS功能的任务优先级应低于16:
void _cdecl_ GUILock(void); /* 锁定GUI,保护共享数据安全 */
void _cdecl_ GUIUnLock(void); /* 解锁GUI,加解锁应成对出现 */
此外,在此演示中还需矢量字库文件:KTDOT.PS,请到“矢量汉字显示实例——happybasic”(http://www.cn-dos.net/forum/viewthread.php?tid=27441&fpage=3) 中下载此文件
[ Last edited by taowentao on 2007-8-23 at 10:06 PM ]
注意:C_code.rar文件纠正了回调函数无法使用浮点数操作的问题...
演示下载:http://zhenlove.com.cn/cndos/fileup/files/gui_demo.rar
完整功能如下所述:
rtCell 实时微内核-具有下列功能:
1. 完全抢占的实时微内核结构,独立的内核栈,中断和系统调用均切换到内核栈执行;
2. 256(64、32)个优先级,0为最高优先级(系统保留),256(64、32)为空闲优先级;
3. 不同优先级任务完全抢占,同优先级之间可按先进先出或时间片轮转方式执行;
4. 在一系统(定时器服务)任务中实现内核定时器,用于超时等待内核对象、周期性定时器、任务延迟、一次定时(此时需定义一超时后执行的过程);此服务任务的优先级由其客户任务的最高优先级驱动,随之动态改变,以消除隐式优先级反转现象;
5. 提供任务(Task)、互斥锁(Mutex)、信号量(Semaphore)、位域标志(Flag定时器(Timer)、优先级消息(Message)和环形队列(Ring buffer)内核对象;
6. 任何内核对象用一整数ID标识,而非指针,从而可避免用户任务野指针的副作用,内核对象总数不超过61440(即60K);
7. 互斥锁支持优先级继承和优先级置顶协议,在创建时设置该协议,且总按优先级等待,优先级继承协议时仅支持同一互斥锁的嵌套调用,优先级置顶协议还可支持不同互斥锁的多次嵌套调用;
8. 其它对象的等待方式有:优先级等待和先进先出(节省内存)等待,在创建时设置;
9. 内核数据的同步,除在任务切换,及任务和内核之间切换堆栈时暂时关中断外,其它地方均以延迟过程调用(DPC)方式执行;
10. 任务对象支持异步过程调用(Window用语APC,相当于UNIX中的信号机制),从而可引导任务异步的执行一个过程(前提是任务栈不小于1024字节),此过程将在该任务下次被调度时执行;
11. 删除避免机制,拥有互斥锁的任务及处于占有状态的互斥锁均具有防止被删除的机制,要删除拥有互斥锁的任务必须自行终止或调用任务终止函数,而要删除任一个互斥锁则必须先使其处于空闲状态,即没有任何任务占有此互斥锁,否则禁止删除;
12. 对象命名机制,同类内核对象可用唯一的名称标识来获取其ID,达到引用目的。
13. 在内核中实现了中断的进出接口,因此用户中断处理只需写标准的C函数,而不必关心中断底层处理的细节;
14. 系统调用以陷阱指令(x86中int指令)实现,易于扩展到“内存保护”的进程模式;
15. 在内核库之外提供了一个简单的堆内存分配机制,用于内核对象动态内存分配时调用;
16. 支持毫秒级定时器,内核定时器周期为一毫秒;
17. 支持 X387/287 硬件浮点协处理器的任务状态保护,被动方式的任务浮点状态切换(开中断执行,由于使用了特权指令实现,因此只能在纯DOS实模式下或虚拟机X386/X387及后续机型上执行,而无法在Windows的DOS窗口中运行)。
giCell 视口裁减及消隐处理引擎-功能如下:
1. 完善而精巧的多视口裁剪和消隐处理引擎,与微内核rtCell紧密结合;
2. 真正的事件(或消息)驱动的多窗口(视口)技术,支持顶层窗口和透明窗口的显示和裁剪处理;
3. 当前支持Label、Edit、Botton、Slider、Listbox、TreeView和Checkbox控件,其中的Edit控件支持剪切、复制和粘贴(ctrl+x,ctrl+c,ctrl+v);
4. 支持窗口的平移、缩放,光标切换和窗口系统按钮,及窗口和控件的过程回调;
5. 基于透明视口(或窗口)的裁剪和消隐处理,可生成任何非矩形(多态)窗口,本示例中的三角形窗口就是基于透明视口来实现的;
7. 支持图形内存设备(GDC),有效避免窗口重绘时闪烁,易于实现视频及动画处理;
6. 内存需求小,窗口和控件的缺省状态均不使用GDC(而是采用直接屏技术),所耗内存小,因此实用性强,包括rtCell调度器、鼠标、键盘及图形驱动的库文件在DOS下仅77K。
关于可文件Engine.lib和mcOutLib.obj:
1. 考虑到DOS内存的限制,库文件Engine.lib中的rtCell内核仅支持32个任务优先级(因为优先级队列太占用内存),这样即使在640K内存下,也可创建上数百个内核及GUI对象,可满足一定规模的应用程序要求;
2. 库文件mcOutLib.obj是目录giCell\mcOSLib下文件的编译结果,用于处理任务的浮点协处理器(硬件)状态切换,任务浮点数状态初始化,内存分配,信息显示等操作(主要用于内核),用户也可自己编译giCell\mcOSLib目录下的文件,注意:Borland C/C++ 3.1可能无法识别其中的某些浮点数操作指令;
3. 文件MAIN.C是对Engine.lib使用的具体实例,在Borland C/C++ 3.1中编译时必须打开X387/287选项和C函数参数传递约定,此文件还对任何使用透明窗口来生成非矩形窗口,以及如何使用GDC生成动画进行了演示;
4. 注意其中的一些执行顺序:浮点数操作不得放到回调函数中执行,而只能在其它任务中执行(可从回调函数中向其它任务发送消息来实现),否则程序将进行无限循环;
5. 因为浮点协处理器的任务状态切换机制使用了特权指令,所生成的可执行文件只能在纯DOS实模式下或虚拟机X386/X387及后续机型上执行,而无法在Windows的DOS窗口中运行;
6. 由MAIN.C所生成的可执行文件在AMD机器DOS实模式、X86虚拟机qemu-0.9.0-windows以及Bochs-2.1.1下均执行良好,注意:生成的可执行文件依然是16位实模式。
压缩文件C_lib.rar中包含窗口及其子控件的源代码,演示文件MAIN.C和DateTime.c,以及一个专用于Borland C/C++ 3.1的工程文件。
注意:使用浮点数操作时最好把相关任务的栈设置到2K以上。
联系邮件:taowentao_twt@163.com, taowentao_twt@sohu.com
源代码下载:
汉字字库为Windows XP 标准9号宋体(http://www.cn-dos.net/forum/attachment.php?aid=3840&checkid=6c12e&download=1)。
注意DOS不可重入,在GUI任务之外调用DOS功能之前应加GUI锁,调用之后应解锁,而且调用DOS功能的任务优先级应低于16:
void _cdecl_ GUILock(void); /* 锁定GUI,保护共享数据安全 */
void _cdecl_ GUIUnLock(void); /* 解锁GUI,加解锁应成对出现 */
此外,在此演示中还需矢量字库文件:KTDOT.PS,请到“矢量汉字显示实例——happybasic”(http://www.cn-dos.net/forum/viewthread.php?tid=27441&fpage=3) 中下载此文件
[ Last edited by taowentao on 2007-8-23 at 10:06 PM ]
Gemini 解答
技术实现说明
1. 核心机制:rtCell 微内核与 GUI 引擎的结合
- 实时内核设计:rtCell 采用抢占式调度,通过独立内核栈隔离中断/系统调用与用户任务栈,避免野指针影响内核稳定性。内核对象使用整数 ID 而非指针,进一步降低用户态错误的副作用。
- 优先级管理:支持最多 256 级优先级,通过「定时器服务任务动态调整优先级」的机制缓解隐式优先级反转(即低优先级任务占用资源导致高优先级任务等待)。互斥锁的优先级继承/置顶协议则针对显式优先级反转场景(如任务持有互斥锁时被高优先级任务抢占)。
- GUI 与内核的协同:窗口系统基于事件驱动模型,通过微内核的消息队列(Message 对象)实现任务间通信。透明窗口的裁剪依赖「视口消隐引擎」对图形输出的逐像素判断,非矩形窗口通过标记透明区域实现(如三角形窗口的透明像素不参与绘制)。
2. 关键技术细节与限制
- 浮点协处理器支持:任务切换时保存 X387/287 状态依赖特权指令(如
FNSTCW/FLDCW结合内核态操作),因此仅能在纯 DOS 实模式或支持实模式的虚拟机(如 QEMU、Bochs)中运行,Windows DOS 窗口因权限限制无法使用。回调函数禁止浮点操作的原因是:回调通常在中断/内核上下文执行,此时浮点状态未被正确保存,易导致无限循环或数据损坏。- DOS 兼容性处理:DOS 系统调用(如文件操作)为单任务设计,不可重入。因此调用 DOS 前需通过
GUILock()锁定 GUI(本质是暂停高优先级 GUI 任务),且调用任务优先级需低于 16(避免抢占内核接管的硬件中断)。- 图形性能优化:默认使用「直接屏技术」减少内存占用,重绘时通过「内存设备上下文(GDC)」预渲染再一次性输出,避免闪烁。TreeView、ListView 等复杂控件的滚动/缩放依赖独立的视口裁剪逻辑,确保仅更新可见区域。
3. 历史语境下的技术定位
2000 年代前后,DOS 平台的多任务 GUI 多基于协作式调度(如 Windows 3.x)或简单抢占式内核,rtCell 引入的优先级继承、APC(异步过程调用)等机制接近现代实时操作系统(如 VxWorks)的设计。但受限于 DOS 实模式的内存(640KB 基础内存)和硬件限制,内核仅支持 32 级优先级(默认编译选项),且任务总数受内核对象 ID 数量(61440)约束。
4. 后续讨论补充
- 跟帖中用户提到「关键代码缺失」,可能是指 rtCell 内核的核心实现(如任务切换、调度器)未完全开源,仅提供了 GUI 控件层的代码。
- 「Windows DOS 窗口无鼠标」的问题源于:Windows 下的 DOS 窗口未模拟实模式鼠标中断(如 IRQ12),而纯 DOS 下程序通过直接访问鼠标硬件端口实现输入。
来自山东,现居沈阳

