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

网站研发漳州做网站的公司

网站研发,漳州做网站的公司,eclipse做购物网站,在线阅读小说网站怎么做前言 Sparrow RTOS是笔者之前写的一个极简性RTOS#xff0c;初代版本只有400行#xff0c;后面笔者又添加了消息队列、信号量、互斥锁三种IPC机制#xff0c;使之成为一个较完整、堪用的内核#xff0c;初代版本以简洁为主#xff0c;使用数组和表作为任务挂载的抽象数据…前言 Sparrow RTOS是笔者之前写的一个极简性RTOS初代版本只有400行后面笔者又添加了消息队列、信号量、互斥锁三种IPC机制使之成为一个较完整、堪用的内核初代版本以简洁为主使用数组和表作为任务挂载的抽象数据结构对数表版本的Sparrow RTOS总结如下 缺陷 由于数组和表的限制该版本并不支持同优先级和时间片功能设计互斥锁时也受到一定影响而且最大只支持32个任务有许多不便之处。 优点 使用数表存储任务对任务的挂载以位操作和下标操作为主内核简洁小巧执行效率高适用于任务较少、硬件资源少的情况。 链表版本内核的设计 使用链表作为任务挂载的数据结构能够实现同优先级、时间片等功能对任务对象的操作也更加灵活。 链表设计 #mermaid-svg-NhpeYOzWAtPHdXx7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NhpeYOzWAtPHdXx7 .error-icon{fill:#552222;}#mermaid-svg-NhpeYOzWAtPHdXx7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NhpeYOzWAtPHdXx7 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-NhpeYOzWAtPHdXx7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NhpeYOzWAtPHdXx7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NhpeYOzWAtPHdXx7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NhpeYOzWAtPHdXx7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NhpeYOzWAtPHdXx7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NhpeYOzWAtPHdXx7 .marker.cross{stroke:#333333;}#mermaid-svg-NhpeYOzWAtPHdXx7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NhpeYOzWAtPHdXx7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NhpeYOzWAtPHdXx7 .cluster-label text{fill:#333;}#mermaid-svg-NhpeYOzWAtPHdXx7 .cluster-label span{color:#333;}#mermaid-svg-NhpeYOzWAtPHdXx7 .label text,#mermaid-svg-NhpeYOzWAtPHdXx7 span{fill:#333;color:#333;}#mermaid-svg-NhpeYOzWAtPHdXx7 .node rect,#mermaid-svg-NhpeYOzWAtPHdXx7 .node circle,#mermaid-svg-NhpeYOzWAtPHdXx7 .node ellipse,#mermaid-svg-NhpeYOzWAtPHdXx7 .node polygon,#mermaid-svg-NhpeYOzWAtPHdXx7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NhpeYOzWAtPHdXx7 .node .label{text-align:center;}#mermaid-svg-NhpeYOzWAtPHdXx7 .node.clickable{cursor:pointer;}#mermaid-svg-NhpeYOzWAtPHdXx7 .arrowheadPath{fill:#333333;}#mermaid-svg-NhpeYOzWAtPHdXx7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NhpeYOzWAtPHdXx7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NhpeYOzWAtPHdXx7 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-NhpeYOzWAtPHdXx7 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-NhpeYOzWAtPHdXx7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NhpeYOzWAtPHdXx7 .cluster text{fill:#333;}#mermaid-svg-NhpeYOzWAtPHdXx7 .cluster span{color:#333;}#mermaid-svg-NhpeYOzWAtPHdXx7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NhpeYOzWAtPHdXx7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 双向链表 双向链表 双向链表 双向链表 链表头部 链表头节点 链表节点 链表尾节点 任务链表由头部节点和任务节点两部分组成头部会指向头节点和尾节点头节点到尾节点之间会形成一个环路。 就绪列表设计 链表简化设计如下 #mermaid-svg-C09QcWYfovJLWfcZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-C09QcWYfovJLWfcZ .error-icon{fill:#552222;}#mermaid-svg-C09QcWYfovJLWfcZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-C09QcWYfovJLWfcZ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-C09QcWYfovJLWfcZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-C09QcWYfovJLWfcZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-C09QcWYfovJLWfcZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-C09QcWYfovJLWfcZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-C09QcWYfovJLWfcZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-C09QcWYfovJLWfcZ .marker.cross{stroke:#333333;}#mermaid-svg-C09QcWYfovJLWfcZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-C09QcWYfovJLWfcZ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-C09QcWYfovJLWfcZ .cluster-label text{fill:#333;}#mermaid-svg-C09QcWYfovJLWfcZ .cluster-label span{color:#333;}#mermaid-svg-C09QcWYfovJLWfcZ .label text,#mermaid-svg-C09QcWYfovJLWfcZ span{fill:#333;color:#333;}#mermaid-svg-C09QcWYfovJLWfcZ .node rect,#mermaid-svg-C09QcWYfovJLWfcZ .node circle,#mermaid-svg-C09QcWYfovJLWfcZ .node ellipse,#mermaid-svg-C09QcWYfovJLWfcZ .node polygon,#mermaid-svg-C09QcWYfovJLWfcZ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-C09QcWYfovJLWfcZ .node .label{text-align:center;}#mermaid-svg-C09QcWYfovJLWfcZ .node.clickable{cursor:pointer;}#mermaid-svg-C09QcWYfovJLWfcZ .arrowheadPath{fill:#333333;}#mermaid-svg-C09QcWYfovJLWfcZ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-C09QcWYfovJLWfcZ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-C09QcWYfovJLWfcZ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-C09QcWYfovJLWfcZ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-C09QcWYfovJLWfcZ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-C09QcWYfovJLWfcZ .cluster text{fill:#333;}#mermaid-svg-C09QcWYfovJLWfcZ .cluster span{color:#333;}#mermaid-svg-C09QcWYfovJLWfcZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-C09QcWYfovJLWfcZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 链表数组Index 链表头部Index1 任务节点 链表头部Index2 任务节点 链表头部Index3 任务节点 实际设计 #mermaid-svg-bfCdYGTlSweI3CJW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bfCdYGTlSweI3CJW .error-icon{fill:#552222;}#mermaid-svg-bfCdYGTlSweI3CJW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bfCdYGTlSweI3CJW .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-bfCdYGTlSweI3CJW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bfCdYGTlSweI3CJW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bfCdYGTlSweI3CJW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bfCdYGTlSweI3CJW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bfCdYGTlSweI3CJW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bfCdYGTlSweI3CJW .marker.cross{stroke:#333333;}#mermaid-svg-bfCdYGTlSweI3CJW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bfCdYGTlSweI3CJW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bfCdYGTlSweI3CJW .cluster-label text{fill:#333;}#mermaid-svg-bfCdYGTlSweI3CJW .cluster-label span{color:#333;}#mermaid-svg-bfCdYGTlSweI3CJW .label text,#mermaid-svg-bfCdYGTlSweI3CJW span{fill:#333;color:#333;}#mermaid-svg-bfCdYGTlSweI3CJW .node rect,#mermaid-svg-bfCdYGTlSweI3CJW .node circle,#mermaid-svg-bfCdYGTlSweI3CJW .node ellipse,#mermaid-svg-bfCdYGTlSweI3CJW .node polygon,#mermaid-svg-bfCdYGTlSweI3CJW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bfCdYGTlSweI3CJW .node .label{text-align:center;}#mermaid-svg-bfCdYGTlSweI3CJW .node.clickable{cursor:pointer;}#mermaid-svg-bfCdYGTlSweI3CJW .arrowheadPath{fill:#333333;}#mermaid-svg-bfCdYGTlSweI3CJW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bfCdYGTlSweI3CJW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bfCdYGTlSweI3CJW .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-bfCdYGTlSweI3CJW .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-bfCdYGTlSweI3CJW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bfCdYGTlSweI3CJW .cluster text{fill:#333;}#mermaid-svg-bfCdYGTlSweI3CJW .cluster span{color:#333;}#mermaid-svg-bfCdYGTlSweI3CJW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bfCdYGTlSweI3CJW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 双向链表 双向链表 双向链表 双向链表 双向链表 双向链表 双向链表 双向链表 双向链表 双向链表 双向链表 双向链表 链表头部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执行权交给taskBtaskB会执行三个时间片然后再将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进行递增但是两个线程的递增可能是无效的例如 #mermaid-svg-GXBwjeAeIxkaOG7T {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GXBwjeAeIxkaOG7T .error-icon{fill:#552222;}#mermaid-svg-GXBwjeAeIxkaOG7T .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GXBwjeAeIxkaOG7T .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-GXBwjeAeIxkaOG7T .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GXBwjeAeIxkaOG7T .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GXBwjeAeIxkaOG7T .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GXBwjeAeIxkaOG7T .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GXBwjeAeIxkaOG7T .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GXBwjeAeIxkaOG7T .marker.cross{stroke:#333333;}#mermaid-svg-GXBwjeAeIxkaOG7T svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GXBwjeAeIxkaOG7T .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GXBwjeAeIxkaOG7T .cluster-label text{fill:#333;}#mermaid-svg-GXBwjeAeIxkaOG7T .cluster-label span{color:#333;}#mermaid-svg-GXBwjeAeIxkaOG7T .label text,#mermaid-svg-GXBwjeAeIxkaOG7T span{fill:#333;color:#333;}#mermaid-svg-GXBwjeAeIxkaOG7T .node rect,#mermaid-svg-GXBwjeAeIxkaOG7T .node circle,#mermaid-svg-GXBwjeAeIxkaOG7T .node ellipse,#mermaid-svg-GXBwjeAeIxkaOG7T .node polygon,#mermaid-svg-GXBwjeAeIxkaOG7T .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GXBwjeAeIxkaOG7T .node .label{text-align:center;}#mermaid-svg-GXBwjeAeIxkaOG7T .node.clickable{cursor:pointer;}#mermaid-svg-GXBwjeAeIxkaOG7T .arrowheadPath{fill:#333333;}#mermaid-svg-GXBwjeAeIxkaOG7T .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GXBwjeAeIxkaOG7T .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GXBwjeAeIxkaOG7T .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-GXBwjeAeIxkaOG7T .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-GXBwjeAeIxkaOG7T .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GXBwjeAeIxkaOG7T .cluster text{fill:#333;}#mermaid-svg-GXBwjeAeIxkaOG7T .cluster span{color:#333;}#mermaid-svg-GXBwjeAeIxkaOG7T div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GXBwjeAeIxkaOG7T :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 线程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.w-s-a.com/news/787064/

相关文章:

  • 金华企业自助建站系统长沙建站公司模板
  • 云主机 做网站友情链接网站
  • 定制型网站设计天津网站模板建站
  • 为什么公司网站打开很慢wordpress汉化插件
  • 用dw做教学网站做网站用什么配置笔记本
  • 秦皇岛网站制作服务无网站无产品链接如何做SOHO
  • 国际婚恋网站做翻译合法吗南宁网络推广有限公司
  • 济南做网站公司排名销售市场规划方案
  • 营销型网站定制珠海建站网站
  • 企业网站代码wordpress页面重定向循环
  • 厦门网站建设哪家便宜用wordpress做企业网站
  • 网站备案有幕布python 做网站速度
  • 旅游网站模板psd网站后台维护主要做什么
  • 晋江做任务的网站网站如何设置关键词
  • 呼伦贝尔网站建设呼伦贝尔ps网页设计心得体会
  • 字母logo设计网站动画设计方案及内容
  • 怎样做网站建设方案wordpress 附件预览
  • 网站内容编辑wordpress cron原理
  • 户外商品网站制作建筑网络图片
  • 注册了网站怎么建设做网站是学什么专业
  • 济南建设网站哪里好网站色哦优化8888
  • 什么网站做简历最好外贸公司网站大全
  • 衡水网站托管企业二级网站怎么做
  • 丹阳网站建设公司旅游类网站开发开题报告范文
  • 地方门户网站建设苏州网站优化建设
  • 谁用fun域名做网站了网络营销的三种方式
  • 织梦网站上传天津网站建设电话咨询
  • 论坛网站搭建深圳网
  • 天津建立网站营销设计window7用jsp做的网站要什么工具
  • 英文网站wordpress所有图片