当前位置: 首页 > news >正文

上海网站建设网页制作你却网络营销推广主要做什么?

上海网站建设网页制作你却,网络营销推广主要做什么?,用wordpress建站效果怎么样,建设网站都要学些什么手续前言 Sparrow RTOS是笔者之前写的一个极简性RTOS,初代版本只有400行,后面笔者又添加了消息队列、信号量、互斥锁三种IPC机制,使之成为一个较完整、堪用的内核,初代版本以简洁为主,使用数组和表作为任务挂载的抽象数据…

前言

Sparrow RTOS是笔者之前写的一个极简性RTOS,初代版本只有400行,后面笔者又添加了消息队列、信号量、互斥锁三种IPC机制,使之成为一个较完整、堪用的内核,初代版本以简洁为主,使用数组和表作为任务挂载的抽象数据结构,对数表版本的Sparrow RTOS总结如下:

缺陷

由于数组和表的限制,该版本并不支持同优先级和时间片功能,设计互斥锁时也受到一定影响,而且最大只支持32个任务,有许多不便之处。

优点

使用数表存储任务,对任务的挂载以位操作和下标操作为主,内核简洁小巧,执行效率高,适用于任务较少、硬件资源少的情况。

链表版本内核的设计

使用链表作为任务挂载的数据结构,能够实现同优先级、时间片等功能,对任务对象的操作也更加灵活。

链表设计

双向链表
双向链表
双向链表
双向链表
链表头部
链表头节点
链表节点
链表尾节点

任务链表由头部节点和任务节点两部分组成,头部会指向头节点和尾节点,头节点到尾节点之间会形成一个环路。

就绪列表设计

链表简化设计如下:

链表数组Index
链表头部Index1
任务节点
链表头部Index2
任务节点
链表头部Index3
任务节点

实际设计:

双向链表
双向链表
双向链表
双向链表
双向链表
双向链表
双向链表
双向链表
双向链表
双向链表
双向链表
双向链表
链表头部Index1
任务头节点
任务节点
任务尾节点
链表头部Index2
任务头节点
任务节点
任务尾节点
链表头部Index3
任务头节点
任务节点
任务尾节点

任务节点通过链表进行挂载,那么怎么找到任务对象的起始地址呢?

请读者想一想,任务对象的成员都是已知的,所以我们完全可以用链表节点的地址减去前面的成员的地址,就能得到任务对象的起始地址,然后再把起始地址类型转换为任务对象指针。

基于这个思想,其实我们是可以在面向对象的语言中修改私有属性的(如果这门语言支持指针这种直接操作内存的语法的话)。

不过一个个算还是太麻烦了,我们可以直接使用宏:

//get father struct address
//how to use it:struct parent *parent_ptr = container_of(child_ptr, struct parent, child)
#define container_of(ptr, type, member) \((type *)((char *)(ptr) - offsetof(type, member)))

这样就可以直接通过链表找到任务对象起始地址了。

相对于初步的Sparrow RTOS,链表版本的功能增加如下,增加了一个TimeSlice,也就是时间片功能。


void xTaskCreate( TaskFunction_t pxTaskCode,const uint16_t usStackDepth,void * const pvParameters,uint32_t uxPriority,TaskHandle_t * const self,uint8_t TimeSlice)

任务优先级设置

使用链表数组对应每个优先级,因此我们可以通过设置链表数组的大小来更改支持的优先级范围。不过由于支持同优先级和时间片,因此挂载的任务数量其实是不受限制的(除非内存不够)。

时间片

时间片是针对同优先级的说法,当最高优先级有多个任务时,每个任务会根据自身设置的时间片轮流享有CPU运行时间。

在时钟触发型RTOS中,一个时间片就是两次systick时钟中断之间的响应间隔,在Sparrow RTOS中,默认为1ms。

例如:

    xTaskCreate(    taskA,256,NULL,3,&tcbTask1,1);xTaskCreate(    taskB,256,NULL,3,&tcbTask2,3);

对于taskA和taskB,当最高优先级为3时,这两个任务会轮流执行,不过taskA只会执行1个时间片,然后就会将CPU执行权交给taskB,taskB会执行三个时间片,然后再将CPU执行权交给taskA,如此反复循环(如果最高优先级一直是3)。

互斥锁设计

在Sparrow RTOS的数表版本中,互斥锁的优先级反转功能是设置优先级为阻塞任务中最大的那个优先级+1,但是这样会导致浪费优先级,对于可能发生阻塞的任务,我们要确保这些任务的优先级必须设置合理,不然会导致灾难的发生。

但是对于链表版本,由于支持同优先级,因此我们可以设置相同的优先级避免优先级反转现象的发生,而不会占用额外的优先级。

原子操作

由于临界区屏蔽中断的较为粗暴,所以对于简单的加减操作,可以使用内核提供的原子操作,例如:

atomic_add(a,v),表示*v + a
atomic_inc(v),表示*v自加

考虑下面的情况:

void  taskA(){a++;
任务切换发生,另一个任务令a++;b = a;读取a,但是a的值是错误的
}void  taskB(){a++;c = a; a的值是错误的
}

我们使用A和B两个线程对a进行递增,但是两个线程的递增可能是无效的,例如:

线程1读取counter值等于0
线程1增加counter值
CPU0写入counter值等于1
线程2读取counter值等于0
线程2增加counter值
线程1写入counter值等于1
最终counter值等于1

原子操作具有return版本,例如:

int a = atomic_inc_return(a,v);

其实原子操作不仅可以保证线程操作的原子性,也可以在多CPU条件下保证数据操作的原子性。

总结

以上就是对Sparrow RTOS链表版本内核的总结,整体来看,链表版本支持更多任务数量和功能,但是执行效率和简洁性不如数表版本,不过二者适用情景不同,根据实际情况选择即可。

笔者本人更喜欢数表版本,只使用了几百行程序就实现了RTOS的基本功能,简洁明了,同时也是一个良好的学习素材。笔者追求的程序风格一直都是模块化、高效、简洁明了,数表版本的内核是非常令笔者得意的,毕竟几千几万行的操作系统内核浩如烟海,几百行的可不多见。

对于学习Sparrow RTOS的读者来说,笔者推荐数表版本的内核,虽然代码量不多,但彻底搞懂并能更改代码可不容易。

结语

Sparrow RTOS将会持续维护更新,不断完善,其实笔者也是有为它添加设备树、驱动框架和网络协议栈这些功能的想法,不过这都是后话了,也许哪天会更新,也许一直没时间做这些,这都是不确定的。不过它的初衷就是一个学习用途的RTOS,而它也确实非常适合这一任务。

最后,笔者真诚希望读者都能在Sparrow RTOS的教程中收获对操作系统的思考与领悟,操作系统的学习之路道阻且长,在海滩拾贝的过程中,希望读者也能收获属于自己的快乐。

以上,与君共勉。

项目地址:skaiui2/SKRTOS_sparrow: Lightweight rtos inspired by SKRTOS

http://www.hkea.cn/news/994695/

相关文章:

  • 网站运营知识快手seo
  • 咖啡公司网站建设策划书微信营销方式
  • 柳江区城乡住房建设局网站上海seo优化服务公司
  • 西城企业网站建设企业网站怎么优化
  • 初学者做动态网站项目例子游戏特效培训机构排名
  • 汽车类网站搭建直链平台
  • 做网站遇到的困难总结网络营销软件代理
  • 做网站登录论坛外链代发
  • 东营专业网站建设公司排行青岛谷歌优化公司
  • 公众号和网站先做哪个口碑营销的形式
  • 长沙企业建网站费用关键词搜索推广排行榜
  • 怎么做网站端口代理沧州网络推广外包公司
  • php wordpress 目录seo课程培训机构
  • 常州网站建设方案优化引流app推广软件
  • 网络营销网站建设实训网络营销步骤
  • 网站都有后台吗百度竞价开户公司
  • 秭归网站建设网站seo优化心得
  • wordpress电影网站模板seo运营
  • 公司注册网上核名业务如何终止网站排名优化怎么做
  • 网站建设伍金手指下拉2网上推广平台
  • 沧州网站建设公司翼马爱情链接
  • 计算机学了出来干嘛免费优化推广网站的软件
  • 宁波网站建设优化湖南seo优化按天付费
  • 门户网站手机版google官网入口
  • 深圳市工程建设交易服务中心网站软文什么意思
  • 大型网架加工厂成都网站建设方案优化
  • 导航网站的广告怎么做的千锋教育官方网
  • etc网站开发票网站制作软件免费下载
  • 上海seo网站设计2022十大网络营销案例
  • 还有做网站的必要吗网站运营推广方案