发布一个纯C语言的开发平台1(数据结构和运行系统)

本文介绍了作者开发的一个C语言开源平台,旨在提供类似C++和Java的工具包。平台包括系统基本宏定义、常用数据结构(如双向循环链表、平衡二叉树)、多任务运行系统(定时器任务、文件描述符任务、简单任务)。文章详细阐述了各个部分的设计思想和使用方法,以及多任务协作中的一些问题和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

编写这个开放平台的初衷是因为自己开发了一些自认为有用的东西,并且在C语言编程环境中很少有像C++,java等语言中的工具包,所以就希望把这些大家编程可能常用到的东西整理一下,希望能够促进C语言编程开发。闲话少说,进入正题,clearEngine开发平台分为以下几个模块:

1 系统的基本宏定义(base.h),比如整数长度,内存字节对齐方式等,方便系统移植。

2 一些常用的数据结构和算法,包括双向循环链表list、平衡二叉树btree、队列queue、变长数组array、hash、表table等。

3 一个自适应多处理器的任务运行系统,以任务为基本的调度单位,系统内部动态创建合的若干个线程来并发执行多个任务,目前有三种任务:

定时器任务(timer),每隔多少毫秒触发一次任务;

文件描述符任务(fd),当文件描述符上可读、可写等事件发生时触发一次任务;

简单任务(once),用户主动触发的任务。

4 一个简单灵活的面向对象系统,实现了面向对象中的基本概念,比如对象的创建,销毁,方法,引用计数;并且增加了对象的同步事件回调和异步消息通讯机制。

5 一个文法识别器,能够完全用C语言的宏来简单灵活的定义一个上下文无关文法;并根据一个给定的上下文无关文法来匹配字符串生成一颗语法树。


因为篇幅的问题,这篇博客只是简要介绍数据结构和任务运行系统开发, 在代码中的doc中有数据结构的详细说明. 面向对象系统和文法识别器的文档和博客还在编写中。

基本系统数据定义(base.h)

为了方便程序移植,定义和编程相关的基本数据类型,

DINT8 表示8bit有符号整数;

DUINT8 表示8bit无符号整数;

类似的还有DINT16, DUINT14, DINT32, DUINT32;

DINT 表示符合体系结构的,能和指针类型互转的有符号整数类型。

DUINT 表示符合体系结构的,能和指针类型互转的无符号整数类型。

GD_ENDIAN 内存字节的对齐方式,'L'表示小端对齐,'B'表示大端对齐

常用数据结构(struct.h)

      双向循环链表GD_LIST: 就是linux kernel中的双向循环链表,非常好用!

      平衡二叉树GD_BTree: 自己以前实现过AVL树的标准算法,在之后又听说了红黑树,并且在Linux核心中有红黑树的算法实现。然后我就把核心的红黑树代码移植过来,并且比较了AVL树和红黑树的性能,发现虽然在理论上别人都说红黑树的统计性能要比AVL好,但是在实际测试中AVL树的插入删除时间都要好很多。仔细分析了一下,发现红黑树的节点中存储了父节点指针,所以在算法过程中要维持父节点指针; 而在我的AVL树节点中没有父节点指针,因为插入删除操做都是递归的从根节点到叶子节点访问,然后再从叶子节点回到根节点,在这个递归过程中传递了父节点的指针,不需要在数据结构中维持父节点指针。所以虽然红黑树在统计上少转了几次,但是每次的操作都比AVL树复杂,并且由于AVL树在道理上要比红黑树好理解,算法简单些,所以我还是选用AVL树做为平衡二叉树。(代码中仍然保留有红黑树的代码 rb_tree.c)

      队列GD_QUEUE是一个链表容器, 用户创建GD_QUEUE时指定每个节点的用户空间大小. 利用GD_QUEUE可以方便用户管理链表节点,并且可以缓冲用户释放的节点,在新创建节点时避免分配内存。

      GD_ARRAY是一个变长数组容器,数组的特点是可以快速访问指定序号的元素,缺点是插入删除操作可能需要移动数据。用户创建GD_ARRAY时指定数组每个元素的空间大小. 利用GD_ARRAY可以方便用户动态插入删除数组元素,并且在内部优化内存管理,避免频繁的realloc内存.

      表GD_TABLE实现了一个(id, value)二元对的映射,可以把表GD_TABLE是一个有两列,任意多行的表,每一个行代表一个节点。每个节点是一个(id, value)二元对, id是一个无符号整数,用来唯一标识这个节点,即每个节点的id都是不同的,除非这个节点的id为None,id为None的节点仍然在表中占一行。value是这个元素的值,value是有类型(type)的,目前支持的类型有字符串,整数,指针,GD_TABLE。

访问GD_TABLE中的节点有两种方式: 根据id查找对应的节点; 根据行号来访问节点。

     字符串池GD_STR_POOL把用户给定的一个字符串转成一个整数id,相同的字符串返回相同的id.

     哈希GD_HASH和GD_TABLE类似,也是一个二元对(key, value)的映射表,但是key可以为一个整数id或一个字符串, value只能是指针,并且GD_HASH只能通过key来查找节点,而不能通过行号顺序遍历节点。

多任务运行系统

基本介绍和用法

这是一个自适应多核心多处理器的任务运行系统,不以线程为调度单位,而是以任务为的调度运行单位,用户创建各种任务,

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值