Zephyr内核到1.5版本的改进
2017-07-02 16:07
113 查看
Zephyr内核从1.0到1.5版本发生了很大改变,这些改变给开发人员带来了很大方便,具体如下:
①消除微内核和超微内核构建类型的分离
②消除微内核应用程序中的MDEF
③更简单易用的内核API
④宽松了内核对象的使用限制
⑤通过合并重复的服务减少内存消耗
⑥通过减少上下文的切换减少开销、提高性能
更加详细的改变如下描述:
⑴应用程序设计相关
早期独立的微内核和超微内核被合并到了一起,新的内核被命名为“the kernel”。因此,现在的Zephyr应用程序不需要为微内核和超微内核单独设计,它们的应用程序是互相兼容的。
任务和纤程上下文被统一为一种类型,叫做线程。如果线程的优先级是负数,那么这个线程叫做“cooperative thread”,cooperative thread调度器遵循纤程调度算法。如果纤程的优先级是正数,那么这个线程叫做“preemptive thread”,preemptive thread调度器遵循任务调度器算法。这两种类型线程受不同调度器调度、遵循不同的调度算法。
现在的内核对象可以同时被任务线程和纤程线程使用
现在的内核对象允许多线程等待同一个指定对象
现在的内核对象APIs是在调用线程上下文中执行的
因为去掉了MEDF,所以所有的内核对象都是在代码中直接定义的
⑵内核APIs相关
大多数内核APIs都被重新命名或者改变了它们的参数,使得APIs看起来更加直观、提高代码一致性。现在大多数内核APIs都是以k_和K_作为前缀
现在在任务、纤程、或者是中断服务函数中调用内核操作APIs是统一、相同的,而以前在不同环境需要调用不同APIs
现在大多数内核APIs返回零都表示操作成功、返回非零表示相应的错误码
⑶线程相关
一个任务型线程可以通过临时给调度器上锁使自己变成不可抢占线程
现在可以给线程入口点函数传入三个参数
现在可以延时线程的开始时间点,这个延时时间是可配置的
任务线程不在指定任务的终止处理函数,所以被终止时不能处理用户指定操作
现在的应用程序可以通过私有的API来改变和任务线程相关的操作
现在的启动代码中,同时派生出了一个主线程和一个空闲线程
主线程执行系统初始化代码之后调用main()函数,如果main()函数不存在,那么主线成功被终止
在空闲线程执行时,现在的初始化代码可以执行阻塞式操作
⑷定时器相关
现在大多数内核APIs超时间隔都是以毫秒为单位,而不是系统时钟为单位,这样可以使代码看起来更直观。但是底层实现的时候,内核仍然是以系统时钟为基准的。
现在的微内核和超微内核定时器对象被合并成为一个数据类型
⑸内存申请相关
微内核内存映射对象重新命名为“内存块”,这正好和内存管理单元以等大小内存来管理的方式相符
通过内存块和内存池可以很容易的实现内存对齐
现在在代码中可以跟方便的定义一个内存池
现在可以通过malloc管理器在堆空间中申请空闲的内存空间
⑹同步相关
以前的微内核和超微内核信号量对象合并成一个统一数据类型,新的数据类型可用于互斥信号量和计数信号量中
在实现了select()或者poll()之前是不允许一个应用程序同时等待多个信号量的,如果想实现这种功能,应用程序必须以阻塞方式独立测试每一个信号量是否可以使用
以前的微内核事件类型重新命名为“alert”,这是一种类似Unix风格的信号。由于信号量实现代码的改进,目前alert效率还不如信号量。因此,alert应该在请求回调函数应用场景下使用
⑺数据传输相关
把以前微内核中的FIFO对象类型重新命名为消息队列,这样可以避免和超微内核的FIFO对象类型混淆
现在可以通过数据单元实现消息队列中存储数据的对齐功能
以前微内核中的消息邮箱对象类型去掉了显式的设置优先级的概念,而现在消息邮箱对象的优先级和发送它的线程优先级相等
现在的消息邮箱对象类型可以通过消息缓冲区实现异步发送的功能
现在在管道对象缓冲区中可以指定数据对齐
①消除微内核和超微内核构建类型的分离
②消除微内核应用程序中的MDEF
③更简单易用的内核API
④宽松了内核对象的使用限制
⑤通过合并重复的服务减少内存消耗
⑥通过减少上下文的切换减少开销、提高性能
更加详细的改变如下描述:
⑴应用程序设计相关
早期独立的微内核和超微内核被合并到了一起,新的内核被命名为“the kernel”。因此,现在的Zephyr应用程序不需要为微内核和超微内核单独设计,它们的应用程序是互相兼容的。
任务和纤程上下文被统一为一种类型,叫做线程。如果线程的优先级是负数,那么这个线程叫做“cooperative thread”,cooperative thread调度器遵循纤程调度算法。如果纤程的优先级是正数,那么这个线程叫做“preemptive thread”,preemptive thread调度器遵循任务调度器算法。这两种类型线程受不同调度器调度、遵循不同的调度算法。
现在的内核对象可以同时被任务线程和纤程线程使用
现在的内核对象允许多线程等待同一个指定对象
现在的内核对象APIs是在调用线程上下文中执行的
因为去掉了MEDF,所以所有的内核对象都是在代码中直接定义的
⑵内核APIs相关
大多数内核APIs都被重新命名或者改变了它们的参数,使得APIs看起来更加直观、提高代码一致性。现在大多数内核APIs都是以k_和K_作为前缀
现在在任务、纤程、或者是中断服务函数中调用内核操作APIs是统一、相同的,而以前在不同环境需要调用不同APIs
现在大多数内核APIs返回零都表示操作成功、返回非零表示相应的错误码
⑶线程相关
一个任务型线程可以通过临时给调度器上锁使自己变成不可抢占线程
现在可以给线程入口点函数传入三个参数
现在可以延时线程的开始时间点,这个延时时间是可配置的
任务线程不在指定任务的终止处理函数,所以被终止时不能处理用户指定操作
现在的应用程序可以通过私有的API来改变和任务线程相关的操作
现在的启动代码中,同时派生出了一个主线程和一个空闲线程
主线程执行系统初始化代码之后调用main()函数,如果main()函数不存在,那么主线成功被终止
在空闲线程执行时,现在的初始化代码可以执行阻塞式操作
⑷定时器相关
现在大多数内核APIs超时间隔都是以毫秒为单位,而不是系统时钟为单位,这样可以使代码看起来更直观。但是底层实现的时候,内核仍然是以系统时钟为基准的。
现在的微内核和超微内核定时器对象被合并成为一个数据类型
⑸内存申请相关
微内核内存映射对象重新命名为“内存块”,这正好和内存管理单元以等大小内存来管理的方式相符
通过内存块和内存池可以很容易的实现内存对齐
现在在代码中可以跟方便的定义一个内存池
现在可以通过malloc管理器在堆空间中申请空闲的内存空间
⑹同步相关
以前的微内核和超微内核信号量对象合并成一个统一数据类型,新的数据类型可用于互斥信号量和计数信号量中
在实现了select()或者poll()之前是不允许一个应用程序同时等待多个信号量的,如果想实现这种功能,应用程序必须以阻塞方式独立测试每一个信号量是否可以使用
以前的微内核事件类型重新命名为“alert”,这是一种类似Unix风格的信号。由于信号量实现代码的改进,目前alert效率还不如信号量。因此,alert应该在请求回调函数应用场景下使用
⑺数据传输相关
把以前微内核中的FIFO对象类型重新命名为消息队列,这样可以避免和超微内核的FIFO对象类型混淆
现在可以通过数据单元实现消息队列中存储数据的对齐功能
以前微内核中的消息邮箱对象类型去掉了显式的设置优先级的概念,而现在消息邮箱对象的优先级和发送它的线程优先级相等
现在的消息邮箱对象类型可以通过消息缓冲区实现异步发送的功能
现在在管道对象缓冲区中可以指定数据对齐
相关文章推荐
- jQuery 1.5最新版本的改进细节分析
- jQuery 1.5最新版本的改进细节分析
- jQuery 1.5最新版本的改进细节分析
- 如何查看Linux内核版本
- 查看linux内核,系统版本,以及cup,内存等信息
- centos的版本和内核查看
- 王者荣耀交流协会互评Beta版本及答复功能改进建议、Bug修正
- Linux内核目录结构(2.6版本以上的kernel)
- 声波通信原理商用改进版本和源代码
- 编译了下linux的版本为2.6.18的内核——今天的进展
- 0.8版本升级到0.9版本改进的技术
- 查看内核版本
- 一次意外的ioctl调用错误—论不同版本内核的ioctl函数实现
- Fedora 24最新工作站版本之四大重要改进
- redhat9安装RTLINUX-3.2,内核版本为Kernel-2.4.23
- 解析 Linux 内核可装载模块的版本检查机制
- 恭喜CocoStudio 1.5和Mac版本发布
- 新内核版本ioctl的变化 _IO, _IOR, _IOW, _IOWR 幻数的理解
- Linus Torvalds讨论内核版本是否要跳到4.x