有关Linux软件开发的碎碎念

2020-03-23

关键字:


在Linux外设开发时,用于CPU与外设之间通信的方式主要有以下三种:

1、轮询

2、中断

3、DMA

1、轮询

轮询法是最简单的通信方式。它仅需要开一个无限循环来不断地查询要通信的外设的状态,从而决定是否与之通信。其极为简单的开发方式所带来的后果就是它非常消耗CPU资源,程序效率较为低下。

2、中断

中断的通信方式就是轮询法的改进版本。它既兼顾了通信及时性又很好的照顾了系统资源消耗。当使用中断方式通信时,外设在相应的状态发生变化时就会使CPU产生一个中断信号,根据这个中断信号,系统就能及时而有效地处理外设信息。但这种方式也有一个缺点,就是不适合用来处理需要传输大量数据的场景,如网络通信。

3、DMA

DMA全称是Direct Memory Access,直接内存访问。它是专门用于弥补中断方式无法处理大数据量的场景的。当需要通信时,DMA可以绕过CPU,直接将数据从外设传输到内存中。正是因为这种方式数据不需要经过CPU,它才为传输大量数据提供了可能。DMA技术现在在嵌入式领域用的也越来越广泛了。

常见的软件开发模型主要有以下三种

1、瀑布模型

2、增量模型

3、统一开发模型

这三种开发模型不仅仅适用于Linux领域的软件开发,它同样适用于整个软件开发领域。

1、瀑布模型

瀑布开发模型算是一种比较理想的软件开发模型,它将软件开发过程分为以下几个阶段:1、需求阶段;2、规格说明阶段;3、系统设计阶段;3、代码实现阶段。其中,前面三个阶段都可以认为是“架构师”的职责。作为一名程序员,仅仅需要完成第四阶段就可以了。但显然,对于软件从业者而言,前面几个阶段,尤其是第三阶段是最具价值或者说是最重要的。

瀑布模型适用于软件需求在一开始就非常清晰且确定的项目。且应用这种开发模型,前期的工作量也相当大,需要架构师对整个项目有非常透彻的了解。这种线性开发的结构非常便于项目管理,但同样对于缺乏经验的人员来讲也是一个比较难以应用的模型。

2、增量模型

增量开发模型不同于瀑布开发模型需要在编码之前充分了解整个项目。它仅需要对项目了解个大概即可开始编码实现了。这种开发模型通常是先开发出一个基本的软件框架,然后再逐步根据需求实现各个功能。这种模型的优点就是可以快速见到产品,而缺点则是潜在的需求理解错误可能会导致前面的工作白费。这种开发模型使用起来非常简单。

3、统一开发模型

统一开发模型就是结合了瀑布模型与增量模型的软件开发模型。通常可以将一个软件项目分解成:1、初始阶段;2、细化阶段;3、构造阶段;3、交付阶段。每一个阶段中都既有瀑布模型的优点,又有增量模型的优点。但显然,这种模型的复杂性是最大的。因此它通常适用于大型软件的开发。

关于 malloc() , calloc() 与 realloc()

这三个函数都是用于向系统申请一块堆内存空间的。它们都位于 stdlib.h 头文件中:

#include <stdlib.h>

malloc() 的函数原型如下:

void *malloc(size_t size);

参数 size_t 就是你需要申请的内存空间大小。使用这个函数申请的空间是不会作任何处理的,即有可能所申请到的空间是脏空间,因此通常需要手动清理一下申请的空间。它的用法大致如下:

//申请20个数据长度的整型空间。
int *ibuf = (int *)malloc(sizeof(int) * 20);
memset(ibuf, 0, sizeof(int) * 20);

//申请100个数据长度的字符型空间。
char *cbuf = (char *)malloc(sizeof(char) * 100);
if(cbuf != NULL)
{
    memset(cbuf, 0, sizeof(char) * 100);
}

calloc() 的函数原型如下:

void *calloc(size_t nmemb, size_t size);

参数 nmemb 表示要分配多少个元素。

参数 size 表示每个元素的大小是多少字节。

它的使用方法如下:

int *ibuf = (int *)calloc(10, sizeof(int));

char *cbuf = (char *)calloc(20, sizeof(char));

calloc() 与 malloc() 的区别就是 calloc() 在申请空间的时候会自动帮我们清理空间,不会像 malloc() 一样给到脏空间给我们。

realloc() 的函数原型如下:

void *realloc(void *ptr, size_t size);

这个函数的作用是用于重新分配之前申请的空间的大小。可以增大,也可以减小空间。如果是减小空间,则旧数据会被清理掉。使用 realloc() 更改了空间以后新空间的地址可能会改变。因此最好使用这个函数的返回值来覆盖旧地址记录。

在 Linux C程序中获取系统环境可以使用 getenv() 函数,它的原型如下:

#include <stdlib.h>

char *getenv(const char *name);

void main()
{
    char *name = "PATH";
    char *value = NULL;

    value = getenv(name);
    printf("env path:%s\n", value);  
}

有关软件版本号

1、alpha 版本

通常表示内部测试版本。这种版本表示软件功能已初步完成,但是没有经过完整的测试,仅适合在开发团队或者小范围内部交流。它通常也意味着这种版本的软件会有许多问题,不适合开放给普通用户使用。

2、beta版本

这种版本相较于 alpha 版本已有重大改进,一般可以发布给用户供其测试和体验。当然 beta 版本同样意味着会存在少量问题,甚至允许有重大问题存在。开发组织通常会收集 beta 版本的使用反馈来修改相应问题。

3、trial 版本

又称为“试用版”。这种版本通常在商业软件中会有采用。它表示某个商业软件将部分功能开放给用户体验,以预期用户在体验并满意后进一步购买正式版本。

4、unregistered

未注册版软件。这种版本号同样常见于商业软件。未注册版通常会包含软件的所有功能,但是会对用户的使用作出某些限制。其目的同样是供用户体验以期购买正式版本的软件,如注册号或许可证书等。

5、registered

注册版。这是包含完整功能且无任何限制的商业软件版本。

6、demo

演示版本。它是一种非正式软件版本。它提供了正式版本的大部分功能,但是不能通过注册来获得正式版本的权限。演示版本一般也会有限制,要么是功能上要么是使用期限上。

7、professional

专业版。这种版本通常针对开发工具。专业版软件包含供专业用户使用的所有功能。

8、enterprise

企业版。这种版本通常是软件中功能最全面的。它既能兼顾到普通用户的需求,又能满足专业用户的需求。是一个大而全的版本。

关于软件开发过程中的文档

一个软件开发过程一般需要准备以下几种文档:

1、可行性研究报告

通常是列举对应软件项目的所需要的技术、人员、资金、时间周期以及法律风险等。主要的目的就是论述这款软件是否可以被实现。

2、项目开发计划

明确开发过程中各项工作的负责人以、开发进度以及经费预算、所需的软件硬件资源等。后续的开发工作会依据这一文档来调配资源。

3、软件需求说明书

4、概要设计

主要是说明整个程序设计的框架与工作流程。概要设计描述了整个系统的处理流程、模块划分、接口设计以及出错处理等内容。概要设计通常可以决定一款软件成品的优劣。一般是由项目经理来编写。

5、详细设计

6、用户手册

7、其它文档