状态机

CLR 异步函数

三世轮回 提交于 2019-12-02 12:21:24
CLR - I/O限制的异步操作 windows是如何执行I/O操作的?计算机的每个模块都有自己的微型处理器,当写文件到磁盘中时,操作系统将写文件的任务交给磁盘的处理单元就可以做其他的了。还有需要TCP/IP 与另一台电脑通信时,系统只要将发送的数据写入TCP的缓存区就可以做其他的了,发送数据由网卡处理单元完成。 但是这些模块的处理单元的计算能力远不如CPU快,如果将CPU的计算资源总是和这些模块的处理单元同步的话,就会影响应用程序的性能,给用户带来不好的体验。这一节就讲解如何执行计算限制的操作,利用线程池在多个CPU 内核上调度任务,使多个线程并发工作,从而高效使用系统资源。 1 Windows 如何执行I/O 操作 用一个从磁盘中读取文件中的数据为例: 1 程序通过构造一个 FileStream 对象来打开磁盘文件,然后调用 Read 方法从文件读取数据。 2 调用 FileStream 的Read 方法时,你的线程从托管代码转变为本机/用户模式代码,Read 内部调用 Win32 ReadFile 函数。 3 ReadFile 分配一个小的数据结构,称为 I/O 请求包 (I/O Request Packet,IRP)。 然后 ReadFile 将你的线程从本机/ 用户模式代码转变成本机/内核模式代码,向内核传递 IRP 数据结构,从而调用 Windows 内核。 4 根据

浅谈单片机开发---操作系统

时间秒杀一切 提交于 2019-12-02 02:08:45
工作中分析了一下现状,项目繁多,需求不一,团队成员单片机开发经验缺乏,编程风格各异,几乎没有可以重复利用的模块,无现成提高开发效率与测试的工具。 为使开发更迅速,流程更标准,同时也让系统模块化更强,拥有更好的复用性,需要有一个单片机操作系统。现有的操作系统琳琅满目,开源的无技术支持,商用的价格高,最重要的是我们的系统虽然繁杂,但更倾向于控制型,使用这些操作系统对团队开发要求较高,而且占用资源多,所以使用这种类型的操作系统就显的大才 小用了。但我们更不希望裸奔,为此,我们需要开发适合自己团队的系统。 我们的目标是:1、传统的开发模式;2、标准化的开发流程;3、高效的开发效率;4、丰富的接口(或工具) 有了这个大体目标,根据我们现有或规划的项目需求,设计了我们的操作系统AEOS。 AEOS工作简介与原理: AEOS是一种非调度式操作系统,结构小巧,极易移植,占用空间小,可根据需要裁减。由于其非调度的特性,符合我们传统的开发模式,但对于多任务开发则较为麻烦。它提供了任务管理、时间管理、事件管理等基本功能。 AEOS以定时的方式执行任务,为了每个任务都可以获得CPU资源,要求任务执行时间尽可能的短,如果时间较长则需要通过状态机来实现,等待资源或者延迟处理的时候通过跳转状态来释放CPU资源。 任务管理: AEOS最多支持32个普通任务和32个紧急任务,没有优先级之分

成都仪器开发:用状态机的方法进行串口触摸屏的界面设计

泄露秘密 提交于 2019-12-01 06:12:51
做工业控制的时候,很多开发者喜欢一步一步来,第一步做什么,接着做什么,发生了某个事件执行某个动作处理,这是最简单也是最符合人的一般思维的方式,简单的控制系统这么做无疑是非常轻松的,可是一旦工业控制系统变得复杂了的话,一般的流程控制或者顺序控制将会十分困难,一是开发者面对复杂的系统很难在短时间内把各种关系捋顺,而且这样做成的系统一旦后期想有一点点的改动都会付出很大的工作量来修改。那么,状态机控制就是解决复杂控制问题的很好的一种方法。 有限状态机(Finite-state machine, FSM),又称为有限状态自动机,简称状态机,是一个数学模型。是一个抽象机器,在任何时候都可以处于有限数量的状态之一。响应某些外部输入,FSM可以从一个状态转换到另一个状态;从一种状态到另一种状态的变化称为过渡。有限状态机是非顺序的,没有事先的设定,跳转到哪个状态由事件决定。 状态机有几个要素:状态,条件,动作和下个状态,在某个状态时在某种条件(事件)下才会执行某个动作跳转到下一个状态,其中动作不是必需的。如图 1为一个3元有限状态机的模型,它有着3个状态,触发状态切换的事件最多有2 3 =6个。当机器处于状态1时,只有发生了事件1才会切换到状态2,同样,在状态2时只有发生了事件2才会切换到状态1,其余的状态切换流程以此类推。在某一个状态,你可以根据需求定义机器的参数,例如温度达到多少、流量是多少等

Flow-level State Transition as a New Switch Primitive for SDN

假如想象 提交于 2019-11-30 22:34:19
Name of article:Flow-level State Transition as a New Switch Primitive for SDN Origin of the article:Moshref M , Bhargava A , Gupta A , et al. [ACM Press the 2014 ACM conference - Chicago, Illinois, USA (2014.08.17-2014.08.22)] Proceedings of the 2014 ACM conference on SIGCOMM - SIGCOMM \"14 - Flow-level state transition as a new switch primitive for SDN[J]. Acm Sigcomm Computer Communication Review, 2014:377-378. ABSTRACT: In software-defined networking, the controller installs flow-based rules at switches either proactively or reactively 在软件定义的网络中,控制器 主动或被动 地在交换机上安装 基于流的规则 。

SOFAJRaft Snapshot 原理剖析 | SOFAJRaft 实现原理

前提是你 提交于 2019-11-30 09:28:31
SOFAStack ( S calable O pen F inancial A rchitecture Stack)是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。 SOFAJRaft 是一个基于 Raft 一致性算法的生产级高性能 Java 实现,支持 MULTI-RAFT-GROUP,适用于高负载低延迟的场景。 本文为《剖析 | SOFAJRaft 实现原理》最后一篇,本篇作者胡宗棠,来自中国移动。《剖析 | SOFAJRaft 实现原理》系列由 SOFA 团队和源码爱好者们出品,项目代号: SOFA:JRaftLab/ ,文末包含往期系列文章。 SOFAJRaft: https://gitee.com/sofastack/sofa-jraft 导读 本文主要介绍 SOFAJRaft 在日志复制和管理中所采用的快照机制。考虑到单独介绍 SOFAJRaft 中的快照机制原理和实现或许有一些唐突,我会先通过一个读者都能够看得明白的例子作为切入点,让大家对快照这个概念、它可以解决的主要问题,先有一个比较深刻的理解。 一、快照的概念与特点 SOFAJRaft 是对 Raft 共识算法的 Java 实现。既然是共识算法,就不可避免的要对需要达成共识的内容,在多个服务器节点之间进行传输,一般将这些共识的内容称之为日志块

Unity动画状态机Animator使用

人走茶凉 提交于 2019-11-30 06:17:12
前言 unity可以用两种方式控制动画 1 Animations,这种方式简单,直接 Play(“Idle”) 或者 CorssFade(“Idle”) 就可以播放动画 2 Animator,5.x之后推荐使用这种方式,因为里面可以加上混合动画,让动画切换更加平滑 Animator Controller , 动画控制器,负责在不同的动画间切换,属于制作动画效果的必备原件。如果看过 Unity/Animation – 创建Animation Clip,你可能还记得在我们为一个GameObject创建动画时,Unity会自动帮我们生成一个Animation Clip和一个Animator Controller。因为我们之前只用到了一个动画效果,所以Animator Controller就没有进入我们的视线。在这里,我们有必要再次强调一下Animator Controller是如何生效的。 1. Animator组件 你通过Animation窗口(快捷键是 Ctrl+6)中的 Create New Clip 创建Animation时,一个 Animator 已经悄无声息地出现在了对应的GameObject上 2. Animator Controller文件 在第一步中生成的Animator组件上, 第一个 Controller 参数在创建Animator时已经被赋值了,可以点击该值

raw os 之状态机编程

不想你离开。 提交于 2019-11-30 06:16:19
状态机编程的历史很可能久于传统的操作系统, 传统的一个大while 循环模式普遍用到了状态机模式编程, 状态机一般是基于fsm 的有限状态机,或者更先进点的是hsm 分层的状态机。具体的fsm 以及hsm 状态机的概念读者自行参考有关概念学习,这里不再表述。推荐看 Practical UML Statecharts in c/c++ 这本书。raw os 的状态机理念,很大部分参考了它,和著名的面向事件的操作系统QP 具有异曲同工之妙。 状态机编程的其中一个优势是所有的任务可以共享一个栈,这样可以避免传统的操作系统一个任务一个栈空间的局限。所以能普遍被资源短缺的单片机系统采用,另外一个优势是面对复杂的逻辑时,往往能化繁为简,出奇制胜。 由于状态机的特殊编程机制,状态机往往配合事件驱动机制来配合一起使用。 raw os 巧妙地把状态机编程引进到了空闲任务里,这样的话系统空闲的时候可以进行面向状态机的编程,更进一步发挥出系统使用的效率。 读者感兴趣的可以参考状态机代码raw_stm.c 以及基于事件驱动机制的状态机代码raw_idel_event.c.具体的测试代码可以打开vc 的测试代码main,c 启动stm_test。 stm_test 这个例子里运用fsm 状态机实现了一个软件的模型,读者可以自行测试。 来源: CSDN 作者: iteye_21199 链接: https:/

串口状态机,这东西很好用啊

假装没事ソ 提交于 2019-11-30 06:15:53
以前并没有发现串口状态机的好处,以至于忘记了到底怎么用到底是干什么的,最近用到了这种指定格式的数据包解析,才发现这东西非常的好用,可以增加数据传输的鲁棒性,可以对串口的数据包进行过滤只解出符合协议的数据包。这个呢其实就是一种思想,不仅仅局限于串口之间的数据传输,我认为可以用在很多指定数据协议的数据包传输解析当中。大致代码思想写在下面,希望对大家有帮助。 /* 主要的变量声明在这边 /* 串口状态机宏 */ # define DATA_HEAD 3 # define DATA_LEN 4 # define DATA_COM 5 # define DATA_NUM 6 # define DATA_CRC 7 # define DATA_TAIL 8 # define DATA_ADD 9 # define COMMAND_SIZE 20 int g_count = 0 ; //状态机缓冲区下标 int g_uart_state = DATA_HEAD; //串口状态机状态标志 unsigned char data; //串口数据 //状态机缓冲区 unsigned char command_buf[COMMAND_SIZE] = { 0 }; unsigned char *bufptr = &data; while ( 1 ) { /* 从串口中一次只读取一个字符 */ retv =

用C语言写一个状态机

北战南征 提交于 2019-11-30 06:15:12
最近在做一个项目,中间需要一个串口数据传输并且检测有效序列的问题要解决。(是在单片机上做的 msp430f149) 由于以前做过一段时间的FPGA设计,在fpga中,这个检测就是一个序列状态检测机就能搞定。而且速度非常的快,用的是verilog语言,一种硬件描述语言。它和C语言的的工作模型完全不一样的。其实说了这些。我就是想把这种状态机知识迁移到我的单片机上,然后解决我的问题 。 我的初步思路是这样的: #define IDLE 0 #define STATEA 1 ... int state;while(1) { switch (state) { case IDLE:if() {...... } case STATEA:if() {....... } ....... } } 使用define把所有的状态宏定义出来,使用switch -case 选择,放入一个while中实现不但的检测。 说了这些,我就把最后自己在单片机430上实现的代码贴出来。大家参考参考: MCU:MSP430f194 通讯格式:RS232 9600 接收数据报(32字节),包头四字节效验位是:0xAA 0xD0 0x08 0x00; 下面是状态机状态的定义,以及序列检测函数 #include <msp430x14x.h> #define num1 0x00 #define num2 0x02 #define

链表&状态机与多线程

一个人想着一个人 提交于 2019-11-30 06:13:46
《C语言高级专题第9部分-4.9.链表&状态机与多线程》 第一部分、章节目录 4.9.1.链表的引入 4.9.2.单链表的实现 4.9.3.单链表的算法之插入节点 4.9.4.单链表的算法之插入节点续 4.9.5.从链表头部插入新节点 4.9.6.单链表的算法之遍历节点 4.9.7.单链表的算法之删除节点 4.9.8.单链表的算法之逆序 4.9.9.双链表的引入和基本实现 4.9.10.双链表的算法之插入节点 4.9.11.双链表的算法之遍历节点 4.9.12.双链表的算法之删除节点 4.9.13.linux内核链表 4.9.14.内核链表的基本算法和使用简介 4.9.15.什么是状态机 4.9.16.C语言实现简单的状态机 4.9.17.多线程简介 第二部分、章节介绍 4.9.1.链表的引入 本节从数组的缺陷说起引入链表的概念,目的是让大家自然认识到链表的意义和用途。 4.9.2.单链表的实现 本节介绍单链表的思路和编程实现,重点是链表节点的封装和实现。 4.9.3.单链表的算法之插入节点 本节讲述单链表操作的第一个算法,节点插入。主要介绍了头部插入和尾部插入这两种不同算法。 4.9.4.单链表的算法之插入节点续 本节为链表尾部插入的编程实践,带大家写代码实现从尾部插入节点。 4.9.5.从链表头部插入新节点 本节为链表头部插入的编程实践,带大家写代码实现从头部插入节点。 4.9