精华内容
下载资源
问答
  •  优秀程序员的一个突出特点是他们采用高质量的过程来创建软件。这种过程在计划的开始、中间和末尾都强调高质量。  如果你只在一个计划即将结束时强调质量,那你注重的只是测试。  如果在一个计划的开始强调质量...

    3.1 先决条件重要性
            优秀程序员的一个突出特点是他们采用高质量的过程来创建软件。这种过程在计划的开始、中间和末尾都强调高质量。
            如果你只在一个计划即将结束时强调质量,那你注重的只是测试。
            如果在一个计划的开始强调质量,这意味着你计划并要求设计一种高质量的产品。
    3.1.l 造成准备不足的原因
            一些程序员并不做准备工作,有两条忠告:第一,阅读一下下一部分工作的内容提示,或许你会从中发现一些你没想到的问题;第二,要注意自己的问题。
    3.1.2 在进行创建工作之前必须做准备工作的论据
            在你进行编码、测试和调试之前,学会这些论据,并且和你的老板推心置腹地谈谈技术项目的开发过程。
            求助于逻辑推理:进行有效程序设计的关键之一就是认识到准备工作是非常重要的。
            求助于类比:创建一个软件系统与其它需要耗费人力与财力的工程是一样的。
            求助于数据:过去十五年的研究证明,一次完成是最好的选择,不必要的修改是非常昂贵的;通常的准则是,一旦引入错误,就尽早发现和消除它;错误在软件食物链中存留的时间越长,它的危害也就传播得越远。


    3.2 问题定义先决条件
            在进行创建工作之前你要满足的第一个先决条件,便是必须弄清楚你想要解决的问题是什么。
            问题定义只描述要解决的问题是什么,根本不涉及解决方法;问题定义的工作是在需求分析之前进行,后者是对问题的更为详尽的分析;问题定义应该从用户的观点出发,使用用户的语言进行定义。


    3.3 需求分析先决条件
            需求详细描述了一个软件系统需要解决的问题,这是找到问题答案的第一步;这项活动也被称作“需求分析”、“需求定义”等。
    3.3.1 为什么要有正式的需求
            明确的需求是很重要的,因为:1)明确的需求可以保证是由用户而不是程序员决定系统的功能;2)明确的需求也可以避免引起争议;3)注意需求定义,也可以使得在开发工作开始之后,对系统作的改动最小。
            充分进行需求分析是一个项目成功的关键,很可能比使用有效的创建技术还重要
    3.3.2 稳定需求的神话
            有了稳定的需求,软件开发工作可能从结构设计到详细设计到编码,都平稳、顺利地进行。
    3.3.3 在创建阶段如何对付需求变化
            在创建阶段,为应付需求变化而应该采取的措施:1)用检查表来评估你的需求分析质量;2)让每个人都知道由于变化需求所付出的代价;3)建立一套更改控制过程;4)用开发的方法来容纳变动;5)放弃项目。
    3.3.4 检查表
            需求:这个需求检查表包含一系列关于你的项目需求的自测题。
            需求内容、关于需求的完善性、关于需求的质量。


    3.4 结构设计先决条件
            软件结构设计是较高级意义上的软件设计,它是支持详细设计的框架;结构也被称为“系统结构”、“设计”、“高水平设计”或者“顶层设计”;一般说来,结构体系往往在一个被称为“结构定义”或者“顶层设计”的单一文件中进行描述。
            为什么要把结构设计当成先决条件呢?因为结构设计的质量决定了系统概念上的完整性,而这又会决定系统的最终质量;好的结构设计可能使创建工作变得很容易,而坏的结构设计则使创建活动几乎无法进行。
    3.4.1 典型的结构要素
            程序的组织形式:一个系统结构首先需要一个总体上的概括性描述;在结构设计中,你应该能找出最终组织形式的几种方案,并且应该知道为什么选中了现在这种组织形式;在结构设计中,应该在程序中定义主要模块;每一个模块作什么应该明确定义;每个模块之间的交界面也应该明确定义。
            变动策略:变动产生的原因可能是由于反复无常的数据结构,也可能是由于文件格式和系统功能改变,新的性能等而引起的;结构设计应该清晰地描述系统应付变动的策略;结构设计中应该说明用于延缓变动的策略。
            购买而不是建造的决定:创建一个软件的最彻底的办法并不是创建—而是去购买一个软件;如果计划中要求使用已有的程序,那它就该指出如何使这些重新被使用的软件适应新的需求,而且它应该证明这个软件可以通过改动来满足新的需求。
            主要的数据结构:结构设计应该给出使用的主要文件、表和数据结构,同时,还应给出考虑的替代方案并评审做出的选择;不应该允许一个以上的模块访问数据结构,除非是通过访问子程序,以使得这种访问是抽象的而且是可控的;如果一个程序使用了数据库,那么结构中应该规定这个数据库的组织形式和内容;最后,应该遵循数据守恒定律。
            关键算法:如果结构设计依赖于某一特定算法,那它应该描述或指出这一算法。
            主要对象:在面向对象的系统中,结构中应指出要实现的主要对象,它应该规定每一个对象的责任并指出每个对象之间是如何相互作用的,其中应包括对于排序层次、状态转换和对象一致性的描述;结构中还应该指出考虑的其它对象,以及选择这种组织形式的原因。
            通用功能:用户界面、输入/输出、内存管理、字符串存储。
            错误处理:需要考虑的问题包括:1)错误处理是纠正还是仅仅测试错误?2)错误测试是主动的还是被动的?3)程序是怎样对付错误的?4)处理错误信息的约定是什么呢?5)在程序中,应该在哪一个层次上处理错误呢?6)每一个模块检验输入数据合法性的责任级别有多高?
            坚固性(Robustness):是指在发现错误后,一个系统继续运行的能力;在结构设计中需要从几个方面表述坚固性:1)裕度设计(over-engineering);2)断言(assertions);3)容错性(fault tolerance)。
            性能:性能目标包括速度和内存使用。
            通用的结构设计质量准则:一个好的结构设计特征包括对于系统中模块的讨论,每个模块中隐含的信息,选用和不选用某方案的原因;概念完整性是最重要的;每一次变动都应与总体和设计概念相符;结构的目标应该清楚地说明;结构中做出每一个决定的动机都要阐明清楚;好的软件结构往往是机器和语言相互独立;结构设计应该恰好在过分定义和定义不足的分界线上;结构中不应该有任何部分让你感到不舒服。
    3.4.2 检查表
            结构设计:一个好的结构设计应该阐明所有问题,这个表并不是用于指导结构设计的,而只是想提供一种方法。


    3.5 选择编程语言先决条件
            当程序员使用自己所熟悉的语言时,其工作效率要比使用陌生的语言高得多。
            使用高级语言编程,其效率和质量要比使用低级语言高得多。
            一些语言比其它语言更擅长解释编程思想;程序员也可能同样受到他所懂得的程序语言限制;程序语言影响程序员的思想方法。
    3.5.1 语言描述
            Ada语言:是一种在Pascal语言基础上发展的通用高级语言,它是在国防部的要求和资助下发展起来的,特别适用于实时和嵌入式系统。
           汇编语言:汇编语言,是一种低级语言,每一条语句都与一条机器指令相对应。
           Basic语言:Basic原来是一种解释性语言,现在则解释性和编译性两种形式都有。
           C语言:C是一种中级通用语言,有某些高级语言的特点,例如,结构化数据、结构化控制流、对于机器的独立性、丰富的操作指令等。
           C++语言:C++是一种面向对象的语言,除了与C兼容之外,C++提供了多态性和函数重载功能,同时,它还提供了比C更坚固的类型检查功能。
           Fortran语言:Fortran是一种高级语言,引入变量和高级循环的概念,主要在科学和工程计算中使用。
           Pascal语言:主要特征是严格的类型、结构化控制创建和结构化数据类型。
    3.5.2 语言选择快速参考表
     


    3.6 编程约定
            在高质量软件中,你可以发现结构设计的概念完整性与较低层次实现之间的密切联系。
            在复杂的软件中,结构设计指导方针对程序进行结构性平衡,而实现指导方式则在较低层次上实现程序的和谐统一,使得每一个子程序都成为总体设计的一个可以信赖的组成部分。
            在创建工作开始之前,一定要写明你将要采用的编程约定,约定说明一定要写得非常详尽,使得在编程过程中无法对其进行改动。


    3.7 应花在先决条件上的时间
            用于问题定义、需求分析和软件结构设计的时间,随项目需要的不同而不同。一般来说,一个运行良好的项目通常把20%~30%的时间用于先决条件。


    3.8 改变先决条件以适应你的项目
           先决条件随项目规模和正式性不同而变化。


    3.9 小结

    (1) 如果想开发一个高质量的软件,必须自始至终重视质量问题;在开始阶段强调质量往往比在最后强调质量更为有效。
    (2) 程序员的份内工作之一便是向老板和同事宣传软件的开发过程,包括在编程开始前从事先决条件准备工作的重要性。
    (3) 如果问题定义工作做得不好,那么在创建阶段,所解决的问题可能并不是用户真正要解决的问题。
    (4) 如果需求分析工作做得不好,很可能因此而漏掉要解决问题中的重要细节;在创建工作后更改需求,要比在需求分析阶段进行更改的成本高20到100倍;所以,在开始编程前一定要确认需求定义工作一切正常。
    (5) 在编程前规定好约定,在创建工作结束后再改变代码来满足约定几乎是不可能的。
    (6) 在创建活动开始之前如果无法完成准备工作,可以尝试在不太稳固的基础上进行创建活动。

     

           本章小结:

           本章介绍了在创建软件之前,我们需要做什么。

            实际的软件项目中,在动手编代码之前,我们要做的一件非常重要的事情就是需求评审。这件事情做得是否好,可以决定一个软件项目的成败。

            所谓的“需求”,通俗地讲就是要开发人员做什么。由于我们不是直接和客户沟通,因此要经过一个叫做SE的角色来了解需求,这就不可避免地可能会出现偏差,即做出的东西不是客户想要的。

            我们如何进行需求评审呢?一般操作如下:

            第一步:SE(系统工程师)将需求写成一个文档,并预定一个会议室,叫上相关开发人员和开发经理去评审。这里的“评审”,其实就是大家坐在一起讨论,看文档上面写的东西能否实现。

            第二步:开发人员和开发经理根据实际情况,发表意见,对于无法完成的需求予以驳回,或者是提出另外一种实现方式。

            第三步:大家就争议较大的需求进行集中讨论,最终定出一个大家都可以接受的方案,并通知客户,看是否能够得到他们的认可。

            第四步:在与客户沟通之后,SE编写一个最终的需求文档,并通知开发人员和开发经理,进而才可以正式启动开发。

            在软件项目中,我们一定要把问题扼杀在最初的需求阶段,否则越到后面,修改起来越难,花费的成本也越高。

            很多公司(包括一些大公司),是没有“需求评审”这个环节的,这样的公司做出来的东西,一般都会有很多问题,而且项目亏损的可能性极大。

    展开全文
  • 设计模式-创建软件设计模式(一)

    千次阅读 2017-07-13 14:30:57
    主要介绍下面的三个设计模式: ...简单工厂模式简单工厂模式的特点是仅仅有一个具体的创建者类,并且此类中包含一个静态的工厂方法factory().首先定义一个接口 public interface food { abstract String getInsurInfo

    主要介绍下面的三个设计模式:
    (1)工厂模式与抽象工厂模式
    (2)生成器模式
    (3)单例模式

    工厂模式

    工厂模式可以分为简单工厂模式,工厂模式以及抽象工厂模式。

    简单工厂模式

    简单工厂模式的特点是仅仅有一个具体的创建者类,并且此类中包含一个静态的工厂方法factory().

    首先定义一个接口
    public interface food
    {
        abstract String getInsurInfo();
    }
    public class apple implements food
    {
        ....
        public String getInsurInfo();
    }
    public class meat implements food
    {
        ...
        public String getInsurInfo();
    }
    
    工厂类:
    public class factory
    {
        public static food getInstance(String value)
        {
            food x = null;
            if(value.compareTo("apple")==0)
            {x=new apple();}
            else if(value.compareTo("meat")==0)
            {x=new meat();}
            return x;
        }
    }
    

    优点:
    ①工厂方法包含从一个类的结构中选择初始类的业务逻辑。
    ②客户类不直接创建产品类的对象,客户类只作为对象额消费者。、
    ③实现了责任分离。
    ④客户类不负有创建类的对象的责任,因此如果有新产品子类加入,不必修改已有的客户类代码(客户类暂时不使用新加的子类)。
    ⑤免除了客户类在创建类时的逻辑判断。
    缺点:
    ①不符合开闭原则,每当增加产品类的时候,都需要修改工厂类的代码。
    ②因为工厂类的工厂方法是静态的,所有工厂类的方法不能被继承,简单工厂类只能是一个单独的类,而不能成为一个层次的类。

    工厂方法模式

    导致简单工厂方法模式不符合开闭原则的原因是工厂方法类只是一个实类,每当有一个新的产品类被加入到产品类当中,在工厂方法类中就必须增加适当的条件语句。所以在此基础上,我们可以将简单工厂方法模式中的单一工厂类改写为一个层次类来解决这个问题。

    工厂类:
    public interface factory()
    {
        public food getInstance();
    }
    
    public class appleFactory implements factory
    {
        public food getInstance(){return new food();}
    }
    
    public class meatFactory implements factory
    {
        public food getInstance(){return new meat();}
    }
    

    工厂模式与简单工厂模式的区别:
    ①工厂方法模式的中心是抽象工厂类或者接口,而简单工厂方法模式的中心是一个实的工厂类。并且在简单工厂模式中,工厂方法是静态的,而工厂模式中,方式是动态的。
    ②简单工厂模式不符合开闭原则,工厂模式符合开闭原则。
    ③简单工厂模式中,必要的创建对象的逻辑判断包含在工厂类中。在工厂模式中,工厂类不必包含创建对象的逻辑判断。
    工厂模式的优点:
    ①将创建对象的逻辑与任务交给了工厂类。
    ②工厂方法模式支持开闭原则。

    抽象工厂模式

    抽象工厂模式与工厂方法模式有相似的概念,抽象工厂方法模式和工厂模式一样是层次类的结构,但是在这里他不仅仅负责创建一个产品类的对象,而是创建一族产品类的对象。
    抽象工厂模式包括:
    ①一系列互相有关联的产品类,这些产品类有相同的结构。
    ②一系列实的工厂类,实现由抽象工厂类提供的接口。每个实的工厂类生产一组相关的产品类的对象。

    public interface food
    {
        abstract String getInsurInfo();
    }
    public class apple implements food
    {
        ....
        public String getInsurInfo();
    }
    
    public interface food2
    {
        abstract String getInsurInfo();
    }
    public class apple2 implements food2
    {
        ....
        public String getInsurInfo();
    }
    
    工厂类:
    public abstract class factory
    {
        public static final String food= "food";
        public static final String food2= "food2";
        public abstract food getFood();
        public abstract food2 getFood2();
        public static getInstrance(String type)
        {
            factory f = null;
            if(type.equals(factory.food)){f=new foodfactory();}
            else if(type.equals(factory.food2)){f=new food2factory();}
            return f;
        }
    }
    public class foodfactory extends factory
    {
        public food getFood()
        {return new apple();}
        public food2 getFood2()
        {return new apple2();}
    }
    public class food2factory extends factory
    {
        public food getFood()
        {return new apple();}
        public food2 getFood2()
        {return new apple2();}
    }
    
    展开全文
  • 创建守护进程为什么要fork两次

    千次阅读 2017-06-19 17:12:27
    1、守护进程的概念与特点 2、创建守护进程 3、创建守护进程为什么需要fork两次

    一、守护进程的基本概念:
    守护进程也叫精灵进程,它是大多数服务器的载体。守护进程是一种运行在后台的一种特殊的进程,它独立于控制终端并且周期性的执行某种任务或是等待处理某些发生的时间。如果想让某个进程不因为用户或中断或其他变化而影响,那么就必须把这个进程变成一个守护进程。


    举个例子:在现实生活中, 许多大型的软件或服务器必须保证7*24小时(一周7天,一天24小时)无障碍的运行,例如淘宝网、百度搜索引擎、支付宝等等,那么像这样一种要一直运行的程序怎么实现呢?究其本质其实就是我们的守护进程。


    二、守护进程的特点:
    1).自成进程组,自成会话,与控制终端脱关联;
    2).守护进程的父进程是1号进程;
    3).守护进程的命令一般以字符d结尾;
    4).守护进程的生命周期是7*24小时不掉线;
    5).一般的网络服务器都以守护进程的形式在后台运行,比如常见的http,ftp等等服务器都是以守护进程的形式在后台运行;



    三、创建守护进程

    1、查看系统中的进程

    ps axj
    • 1

    参数a表示不仅列当前用户的进程,也列出所有其他用户的进程, 
    参数x表示不仅列有控制终端的进程,也列出所无控制终端的进程, 
    参数j表示列出与作业控制相关的信息。



    2、setsid函数 
    (1)创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。

    #include<unistd.h>
    pid_t setsid(void);
    • 1
    • 2

    返回值:该函数调用成功时返回新创建的Session的id(其实也就是当前进程的id),出错返回-1。


    (2)需要注意的是,,调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。 
    解决办法:先fork再调用setsid,fork创建的子进程和父进程在同一个进 程组中,进程组的Leader必然是该组的第一个进程,所以子进程不可能是该组的第一个进程,在子 进程中调用setsid就不会有问题了。


    (3)成功调用该函数的结果是: 
    1. 创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id。 
    2. 创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id。 
    3. 如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。所谓失去控制终端是指,原来的控制终端仍然是打开的,仍然可以读写,但只是一个普通的打开文件而不是控制终端了。


    3、创建守护进程的步骤 

    方式一:

    (1)调用umask将文件模式创建屏蔽字设置为0.

    umask(0);//umask必须清0,否则创建文件受系统默认权限的影响
    • 1

    文件权限掩码是屏蔽掉文件权限中的对应位。由于使用fork()函数新创建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带了很多的麻烦(比如父进程中的文件没有执行文件的权限,然而在子进程中希望执行相应的文件这个时候就会出问题)。因此在子进程中要把文件的权限掩码设置成为0,即在此时有最大的权限,这样可以大大增强该守护进程的灵活性。


    (2)调用fork,父进程退出(exit)。 
    原因: 
    1)如果该守护进程是作为一条简单的shell命令启动的,那么⽗父进程终止使得shell认为该命令已经执行完毕。
    2)保证子进程不是一个进程组的组长进程。


    (3)调用setsid创建一个新会话。 
    setsid会导致: 
    1)调用进程成为新会话的首进程。 
    2)调用进程成为一个进程组的组长进程 。 
    3)调用进程没有控制终端。(再次fork一次,保证daemon进程,之后不会打开tty设备)

    调用setsid的原因: 
    由于创建守护进程的第一步是调用fork()函数来创建子进程,再将父进程退出。由于在调用了fork()函数的时候,子进程拷贝了父进程的会话期、进程组、控制终端等资源、虽然父进程退出了,但是会话期、进程组、控制终端等并没有改变,因此,需要用setsid()韩式来时该子进程完全独立出来,从而摆脱其他进程的控制。


    (4)将当前工作目录更改为根目录。 
    防止当前目录有一个目录被删除,导致守护进程无效。 
    使用fork()创建的子进程是继承了父进程的当前工作目录,由于在进程运行中,当前目录所在的文件系统是不能卸载的,这对以后使用会造成很多的麻烦。因此通常的做法是让“/”作为守护进程的当前目录,当然也可以指定其他的别的目录来作为守护进程的工作目录。


    (5)关闭不再需要的文件描述符。 
    同文件权限码一样,用fork()函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些文件被打开的文件可能永远不会被守护进程读写,如果不进行关闭的话将会浪费系统的资源,造成进程所在的文件系统无法卸下以及引起预料的错误。

    如:关闭标准输入流、标准输出流、标准错误流。

    close(0)close(1)close(2)
    • 1
    • 2
    • 3

    (6)其他:忽略SIGCHLD信号

    signal(SIGCHLD,SIG_IGN);

    #include<stdio.h>
    #include<unistd.h>
    #include<signal.h>
    #include<stdlib.h>
    int creat_daemon()
    {  
        //(1)调用umask将文件模式创建屏蔽字设置为0.
        umask(0);    
       //(2)调用fork,父进程退出(exit)。  
        pid_t id = fork();
        if(id > 0)
        {
            exit(1);
        }
        else if(id == 0)
        {
            setsid();         //(3)创建一个新的会话
            if(chdir("/")<0)  //(4)将新建会话的工作目录改成根目录
            {
               perror("chdir");
               return;
            }
           //(5)关闭从父进程继承来的文件
            close(0);
            //close(1); 假如这里没有关闭会出现什么情况,看下面结果
            close(2);
           //(6)忽略SIGCHLD信号。
            signal(SIGCHLD, SIG_IGN);
     
        }
    }
    
    int main()
    {
        creat_daemon();
        while(1);
        return 0;
    }
    


    由上图可知通过运行自己编写的mydaemon在Linux后台创建了一个守护进程,它的父进程是1号进程,它自己是自成进程组,自成会话的。

    在Linux的根目录下有一个目录proc,/proc目录中包含许多以数字命名的子目录,这些数字表示系统当前正在运行进程的进程号,里面包含对应进程相关的多个信息文件。例如 cd /proc/18225,进入到刚才创建的守护进程的id里面,并查看它进程id所对应的文件描述符fd的情况。


    可以发现当1号文件描述符不关闭的时候,此时的1号文件描述符指向的是自己的特殊的设备文件/dev/pts/1。所以在创建守护进程的时候就是有一个步骤要关闭不必要的文件描述符。  


    方式二:创建守护进程也可以调用daemon函数:int daemon(int nochdir, int noclose); 

    一般调用daemon有两种方式:
    1).daemon(0,0); //默认更改工作目录且更改文件描述符0,1,2为空,使其指向/dev/null。这个/dev/null就类似黑洞,不管哪个文件描述符对其进行写操作,它都会直接将数据丢弃;
    2).daemon(1,0); //不更改工作目录也不更改文件描述符;


    守护进程要fork两次的原因:

    第一次fork:这里第一次fork的作用就是让shell认为这条命令已经终止,不用挂在终端输入上;再一个是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长,如果不fork子进程,那么此时的父进程是进程组组长,无法调用setsid。所以到这里子进程便成为了一个新会话组的组长。


    第二次fork:第2次fork不是必须的。也看到很多开源服务没有fork第二次。fork第二次主要目的是。防止进程再次打开一个控制终端。因为打开一个控制终端的前台条件是该进程必须是会话组长。再fork一次,子进程ID != sid(sid是进程父进程的sid)。所以也无法打开新的控制终端。

    daemon目的就是防止终端产生的一些信号让进程退出。上面函数并没有直接调用signal函数去处理它。而是间接通过fork和setsid函数使用更少代码优雅处理。而被有些人误以为是防止父进程没有正常退出而导致的僵死进程的原因需要这样处理。

      

    展开全文
  • 软件中断只有在操作系统中才有这一说,它是对硬件中断的一种克隆,在SYSBIOS中它的优先级是低于硬件中断高于任务线程的,其最多可以有32个优先级,只要系统的资源允许,理论上可以创建无穷多个软件中断,而硬件中断...

             软件中断只有在操作系统中才有这一说,它是对硬件中断的一种克隆,在SYSBIOS中它的优先级是低于硬件中断高于任务线程的,其最多可以有32个优先级,只要系统的资源允许,理论上可以创建无穷多个软件中断,而硬件中断则是少数有限个的。由于它是由SYSBIOS内核调度管理的因此在响应的时间上是要长于硬件中断的。

            今天我就来给大家介绍一下关于软件中断(SWI)的创建方法,与硬件中断的创建的方法一样,它也有两种创建方法:静态创建和动态创建。

           下面是利用图形化配置界面来创建静态的软件中断:


    相关的参数与硬件中断的创建一样,详情请查看博客SYSBIOS学习笔记---硬件中断(HWI)的创建

              下面是关于动态创建的方法,在这里要特别注意的是软件中断的创建只能在任务线程和空闲线程中创建,千万不要在软件中断线程和硬件中断线程中创建,否则会出现不可预测的后果。下面是一种典型的软件中断线程创建方法:

    Void SWIInit(Void)
    {
        // 动态创建软件中断
        Swi_Params swiParams;
    
        // 使用默认值初始化参数
        Swi_Params_init(&swiParams);
        // 触发变量 二进制 0000 0000 0000 0000 0000 0000 0000 0011
        swiParams.trigger = 3;
        swi0 = Swi_create(KEYSwi, &swiParams, NULL);
    }
     
            上述的创建结果与图形化配置的结果一样,创建完了以后如果要执行相应的中断服务函数就需要发布该中断函数,这个是通过调用 Swi_post() 函数来发布该软件中断的,该函数输入的参数为被发布的软件中断的句柄。可以看到软件中断的触发是由程序触发的,而硬件中断大多数是由中断事件触发的比如串口的接收中断事件,不一定是由程序触发的

            当然要实现一定条件的软件中断发布,可以调用Swi_andn();   Swi_dec();   Swi_inc();   Swi_or(); 等这些函数来实现一定条件的发布,对于这些函数是如何使用的可以查阅相关的手册。  













    展开全文
  • oracle软件安装和数据库的创建 ****** 一)oracle软件安装 上一课准备工作完成,安装包准备好,进入安装。 首次安装要确保安装目录干净,否则在设置安装路径时会有 OUI-10030警告:您指定了非空目录来安装此产品 ...
  • 什么软件测试?

    千次阅读 2018-03-21 22:07:47
    什么软件测试?What is software testing?软件测试是在测试中识别软件产品和服务的准确性和质量的过程。显然,它的诞生是为了验证产品是否满足客户的特定先决条件、需求和需求。在一天的工作结束前,确定特定的最终...
  • Xmind是一款非常专业的思维导图软件,收费好几百元,不过还是很多用户,因为目前用的最多,也简单易用。XMind界面友好、功能优秀、可用性极强,从而数百万人选择了它,XMind不仅可以绘制思维导图,还能绘制鱼骨图、...
  • 问:软件测试的原则? 答:https://blog.csdn.net/weixin_30363263/article/details/102986878 问:你在测试中发现了一个 bug ,但是开发经理认为这不是一个 bug ,你应该怎样解决。 1、将问题提交到缺陷...
  • 在Mac M1使用的过程中经常出现一些问题,如自己的硬盘插在Mac M1电脑上不能用、苹果电脑到底要不要清理、如果能在上面安装Windows的软件就好了、PDF文档怎么总是...,今天小编就为大家带来了几款mac M1装机必备软件...
  • 使用Zeek和ELK创建企业监视 一

    万次阅读 2020-12-05 22:38:28
    其中,Zeek是一个开放源代码的网络监视框架,该框架根据网络旁路监听的数据创建警报和事件,其本质是一个IDS。它在整个行业中都有使用,尤其是在网络异常领域,实际上,英国网络安全公司Darktrace使用Zeek作为其产品...
  • Chromium网页Graphics Layer Tree创建过程分析

    万次阅读 热门讨论 2016-02-29 00:59:09
    在前面一文中,我们分析了网页Render Layer Tree的创建过程。在创建Render Layer的同时,WebKit还会为其创建Graphics Layer。这些Graphics Layer形成一个Graphics Layer Tree。Graphics Layer可看作是一个图形缓冲区...
  • Vmware创建Linux虚拟机

    千次阅读 2017-07-13 11:30:00
    很多情况下我们想要一个Linux环境,却很难有条件单独使用一台机器来部署Linux系统,因此经常会选择使用虚拟机的形式或者是选择安装双系统。这里我主要记录一个我在虚拟机中安装Linux系统的过程。 我这里你使用的...
  • 在硬件加速渲染条件下,这个输出有可能是一个OpenGL纹理,也有可能是一系列需要进一步进行绘制的OpenGL纹理,取决于Render进程使用直接渲染器还是委托渲染器。本文接下来就对网页的绘图表面的创建过程进行详细分析。
  • 内容: 什么是绘图法?为什么使用建模工具?选择一种绘图的方法样例绘图法使用IBM Rational XDE Modeler/Developer 建模工具:对任何复杂系统都是有用的鸣谢注释关于作者文章打分Ratio
  • 软件测试之软件测试方法

    千次阅读 2019-06-15 15:50:40
    软件测试过程中,最主要的就是要掌握好软件测试的方法,掌握好了软件测试方法,有利于测试技能的大幅度提高。 软件测试方法 软件测试方法是指测试软件的方法。随着软件测试技术的不断发展,测试方法也越来越多样...
  • 软件测试面试题(含答案)

    万次阅读 多人点赞 2021-03-01 15:15:38
    软件测试面试题(含答案)
  • 架构师不仅仅是团队中的角色,更是一种思维方式,就算你是程序员,每天也会做很多设计决定,这其中有些颇具架构意义,任何人一旦做出了影响软件系统结构的决定,实际上已经充当了临时的架构师,而无论你是什么角色,...
  • GIS软件列表

    万次阅读 2016-09-05 21:36:07
    3map:行星地球项目由3map驱动,这是一个自由软件,由Telstra宽带基金会创建并支持,提供客户端与服务器的能力以在线再现虚拟地球。 Amein!:其界面介于ArcMap和UMN Mapserver之间.AmeiN!写了一个ArcMap下的...
  • 【UCOSIII】UCOSIII软件定时器

    万次阅读 2018-06-29 19:15:40
    在学习STM32的时候会使用定时器来做很多定时任务,这个定时器是单片机自带的,也就是硬件定时器,在UCOSIII中提供了软件定时器,我们可以使用这些软件定时器完成一些功能,本文我们就讲解一下UCOSIII软件定时器。...
  • 软件测试工程师工作总结

    万次阅读 多人点赞 2018-04-18 21:02:05
     因为没有经过测试的软件很难在发布之前知道该软件的质量,就好比ISO质量认证一样,测试同样也需要质量的保证,这个时候就需要在团队中开展软件测试的工作。在测试的过程发现软件中存在的问题,及时让开发人员得知...
  • 软件测试校招笔试题-软件测试基本理论

    万次阅读 多人点赞 2019-07-18 11:23:26
    1.什么软件测试? 答:软件测试是为了发现错误而执行程序的过程。 2.软件测试的目的? 答;测试的目的是想以最少的人力、物力和时间找出软件中潜在的各种错误和缺陷,通过修正错误和缺陷提高软件质量,回避软件发布...
  • 软件测试笔试面试题目完全汇总

    万次阅读 多人点赞 2019-03-06 13:29:37
    1、软件测试的流程 2、web测试和APP测试的区别 仅仅从功能测试的层面上来讲的话,在流程和功能测试上是没有区别的。那么区别在哪里呢? 由于载体不一样,所以系统测试和一些细节可能会不一样。 那么我们就要先...
  • 在我们拿到一个项目的源码,当项目经理让你把它在DB2上跑起来的时候,我们首先做的就是的DB2软件安装上,然后创建数据库和表空间还有缓冲池(要建缓冲池的原因是因为大的项目你不建的话,导致项目运行起来后总是会...
  • 软件开发流程(Software development process)

    万次阅读 多人点赞 2017-07-06 10:41:25
    软件开发流程(Software development process)
  • 创建分区 使用 mkfs 命令来设置 ext2、ext3、ext4、xfs、Reiser v3 和 vfat 文件系统 创建和管理交换空间 本文帮助您准备 Linux Professional Institute's Junior Level Administration (LPIC-1) 考试 1
  • 软考软件设计师考试总结(2018上半年)

    万次阅读 多人点赞 2018-05-28 01:29:26
    前段时间一直进行着软件编码的工作,应当是时候告一段落了。理论推动实践,实践反过来推动理论的理解。 与物质和意识的关系一样。 * 世界是物质的,物质决定意识; * 意识反过来影响物质,也就是物质的主观...
  • 创建AD DS域服务Active Directory概念AD(活动目录):是一种组织资源信息的方法,目录的意义在于我们可以通过标题或者说搜索条件来简单而有效率的在大量数据中查找匹配的信息。支撑这种信息检索的技术就是LDAP协议。...
  • 【笔试题】嵌入式软件开发:笔试总结

    万次阅读 多人点赞 2018-07-10 20:49:50
    从CSDN各个博客上摘选的一些容易做错的嵌入式软件的笔试题,做一下记录,让自己记住。 文章转自:嵌入式软件开发:笔试总结。 编程语言的基础考察 1、以下代码运行结果为: #include <iostream> using ...
  • Django项目实践1 - 创建Django项目

    万次阅读 2014-08-31 21:58:47
    Introduction Django简介 Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由...Django采用了MVC的软件设计模
  • 什么软件工程-基础概念

    千次阅读 2007-03-18 16:50:00
    1.什么软件工程 22.软件工程必须遵循什么原则 23.什么软件工程环境 24.什么是结构化方法 35.什么是软件包 36.什么软件方法学 47.软件方法学的分类和基本内容有哪些 48.什么软件复用 59.什么软件工具 510....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 311,786
精华内容 124,714
关键字:

创建软件需要什么条件