嵌入式系统是指以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积和功耗严格要求的专门计算机系统。嵌入式技术并不是一个独立的学科,它是伴随着微电子技术和计算机技术的发展,微控制芯片功能越来越强大,而嵌入微控制芯片的设备和系统越来越多而发展起来的。嵌入式系统几乎包括了生活中所有的电器设备,如:mp3、手机、数字电视、汽车、微波炉、数码相机、电梯、空调、自动售货机、工业自动化仪表与医疗仪器等。

尽管C语言是嵌入式软件开发的主要工具,然而C语言并非是专门为嵌入式系统设计的,一是因为标准C语言编写的软件缺乏安全性;二是因为标准C语言太庞大了,很难操作。因此,需要制订针对嵌入式系统软件的编码格式要求。

标准是在理解标准C语言的基础上,结合嵌入式软件的开发实践以及嵌入式软件开发中常见的危险编码方式制订的,着重于软件的安全性、可读性。既可作为嵌入式软件开发中的编码要求,也可作为软件交付时验收方的验证要求。

在要求条款中,“应”标示的要求是必须符合的,“宜”标示的要求是可选择符合的。

 


入式软件  C语言编码规范

1 范围

本标准规定了使用C语言编写嵌入式软件的编码格式要求。本标准也提及了软件设计人员应该注意的与编码相关的事项。

本标准适用于嵌入式软件生存周期的编码阶段,主要供具有C语言编程能力的软件编码人员使用。

 

2 规范性引用文件

下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅所注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。

GB/T 15272 程序设计语言 C

 

3 术语和定义

GB/T 15272中界定的以及下列术语和定义适用于本文件。

3.1  

单边作用 side effect

指在表达式执行后对程序运行环境可能会造成影响。赋值语句、自增等操作都是典型的具有单边作用的操作。

 

4 编码格式要求

4.1 总体要求

4.1.1 编程前应阅读硬件电路和芯片资料――熟悉芯片的各种内存、寄存器地址、中断服务、定时器、通讯接口等功能,必要时将相关信息加入程序注释中。

4.1.2 编程中应注意程序的存储空间――如指令空间大小、数据空间大小、堆栈空间大小等是否超出系统有关限制。

 

4.1.3 使用联合体时,应明确该编译器联合体存储的细节――如联合体的末尾有多少个填充单位、联合体的各个成员如何对齐、多字节的数据类型高低字节如何排放顺序等。

4.1.4 宜注意硬件系统复位和软件复位的方法和区别――在程序中宜使用芯片提供的看门狗功能实现硬件系统复位。

4.1.5 宜注意CPU对各种存储器的访问速度――在程序中宜利用各种硬件设备自身的特点来提高程序效率。

4.1.6 应注意所使用的编译器的位数,支持的C语言标准,调试程序所占用的内存,兼容性等特点。

4.1.7 应注意编译器处理不同数据类型的原则及有关细节――如static局部变量将在内存数据区中生成,而非static局部变量将在堆栈中生成。

4.1.8 应注意程序开发调试环境和实际应用环境的区别。

4.1.9 应用程序宜使用操作系统驱动程序来调用硬件端口。

 

4.2 内存空间管理类

4.2.1 在使用malloc等其它函数获取内存时,应判断申请内存是否成功。

4.2.2 动态内存的申请与释放应配对,防止内存泄漏。

应用场景主要包括:

a)   过程/函数中分配的内存,在过程/函数退出之前要释放;

b)   过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前要关闭。

错误用法示例:

int example_fun( BYTE gt_len, BYTE *gt_code )

{

   BYTE *gt_buf;

   gt_buf = (BYTE *) malloc (MAX_GT_LENGTH);

   ...

 

   /* global title length error */

   if (gt_len > MAX_GT_LENGTH)

   {

       return GT_LENGTH_ERROR; //退出之前没有释放gt_buf

   }

   

   ...  // other program code

}

正确用法示例:

int example_fun( BYTE gt_len, BYTE *gt_code )

{

   BYTE *gt_buf;

   gt_buf = (BYTE * ) malloc ( MAX_GT_LENGTH );

   ...

   

   /* global title length error */

   if (gt_len > MAX_GT_LENGTH)

   {

       free( gt_buf  ); // 退出之前释放gt_buf

       return GT_LENGTH_ERROR;  

   }

   

   ...  // other program code

}

 

4.2.3 不应引用已经释放的内存空间。

4.2.4 应防止内存操作越界。

应防止越界操作数组、指针、内存地址等内存空间。

4.2.5 字符串连接宜使用strncat库函数代替strcat库函数,字符串拷贝宜使用strncpy库函数代替strcpy库函数,避免长度不够引起的数组越界。

4.2.6 使用sprintf库函数时,应注意字符长度,避免长度不够引起的数组越界。

4.2.7 对于内存受限的系统,宜少用动态内存分配,尽量选用数组。

4.2.8 对于内存受限的系统,在分配内存时,应考虑内存碎片的问题。

 

4.3 中断处理类

4.3.1 中断服务程序不应有返回值。

4.3.2 中断服务程序中不应使用printf()函数。

4.3.3 对于中断中使用到的非局部变量,在中断处理函数中应对其进行入栈保护。

4.3.4 中断处理程序中的变量,如果会被其他函数执行读操作或者写操作,那么在其他函数读写这个变量前,应先关中断,读写完,再开中断。

4.3.5 对于开关中断,要注意成对匹配。

对于默认开启的中断,如果在某个函数中进行了关闭,在函数退出时需进行相应的开启。

对于默认关闭的中断,如果在某个函数中进行了开启,在函数退出时需进行相应的关闭。

4.3.6 宜避免在中断服务程序中进行浮点数运算。

 

4.4 系统接口类

4.4.1 不应随意更改其它模块或系统的有关设置和配置。

4.4.2 不应随意改变与其它模块的接口。

4.4.3 应充分了解系统的接口之后,再使用系统提供的功能。

 

4.5 硬件系统初始化类

4.5.1 系统运行之初,应初始化有关变量及运行环境。

4.5.2 系统运行之初,应对加载到系统中的数据进行一致性检查。

4.5.3 在硬件系统初始化之前,宜判断工作电压是否已经稳定。

 

4.6 软件模块初始化类

4.6.1 所有变量在使用之前应被初始化。

错误用法示例:

unsigned int x;

 unsigned int y;

 y=x;        /*  x 没有初始值  */

 

4.6.2 对局部声明不应用 extern 初始化。

错误用法示例:

int fn(void)

{

     extern int x = 0;

     return(x);

}

 

4.6.3 数组、结构和联合的初始化列表应显式描述。

数组、结构和联合的初始化列表应使用大括号,并使用附加的大括号来指示嵌套的结构;程序员应显式地考虑和描述复杂数据类型的所有元素,不应忽略某个元素的初始化。

错误用法示例:

int16_t y[3][2] = { 1, 2, 3, 4, 5, 6 };

int16_t y[3][2] = { {1, 2} };

 

正确用法示例:

int16_t y[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

 

4.6.4 枚举元素的初始化应完整。

枚举元素的初始化只有两种形式是安全的,一是初始化所有元素,二是只初始化第一个元素。

错误用法示例:

enum E_type{num1, num2 = 2, num3};

 

4.7 版面书写类

4.7.1 文件注释应采用统一格式。

文件注释示例:

   /*

   *  Copyright (c) 2007,  公司名称 

   *  All rights reserved.

   *  文件名称: filename.c

   *  要: 简要描述本文件的内容 

   *  当前版本: x.x,  编写者/修改者,修改时间,修改内容

   *  历史版本: x.x,  编写者/修改者,修改时间,修改内容

   */

 

4.7.2 函数注释应采用统一格式。

函数注释示例:

   /*

   *  函数介绍:

   *  参数:

   *  返回值:

   *  备注:

   */

 

4.7.3 不应使用嵌套的注释。

4.7.4 应保证注释与代码的一致性,无用的注释应删除。

4.7.5 对单条语句代码的注释应放在其上方或右方相邻位置。

4.7.6 对于有物理含义的变量、常量、数据结构(包括数组、结构、类和枚举等),如果其命名不是充分自注释的,在声明时应加以注释,说明其物理含义。

4.7.7 控制语句应用大括号括起来。

错误用法示例:

  if (a == 1)

       x = y;

 

  while ((c = getchar( )) != EOF)

       putchar(c);

 

   for ( ; ; )

       timetest(n);

 

正确用法示例:

  if (a == 1)

  {

    x = y;

  }

 

  while ((c = getchar( )) != EOF)

  {

    putchar(c);

  }

 

  for ( ; ; )

{

    timetest(n);

}

 

4.7.8 注释与其上面的代码应用空行隔开。

4.7.9 宏定义应大写。

正确用法示例:

#define  MAX  100

  #define  PI   3.14159

 

4.7.10 函数风格的宏应用括号“()”括起来。

错误用法示例:

 #define  ADD(a, b)   a + b

 

正确用法示例:

#define  ADD(a, b)   ((a) + (b))

 

4.7.11 代码中的一行中只应有一个声明或者一条语句。

错误用法示例:

  int i;  int j;   /*多个声明*/

  j = i;  i++;   /*多条语句*/

 

4.7.12 超过120个字符的长语句,应分成多行书写。

4.7.13 一个文件中的程序总行不宜超过2000行。

4.7.14 一个函数中的程序总行不宜超过200行。

4.7.15 宜用括号()明确表达式的操作顺序,避免使用默认优先级。

4.7.16 宜避免使用逗号操作符。

 

4.8 声明定义类

4.8.1 头文件中不应有对象或函数的定义。

头文件中只存放“声明”而不存放“定义”。

4.8.2 不应单独使用小写字母“l”或大写字母“O”作为变量名。

小写字母“l”很容易与数字“1”混淆,大写字母“O”很容易与数字“0”混淆。

4.8.3 函数参数不应只有类型名没有标识符。

4.8.4 使用八进制数应加以注释。

八进制数是以0开始,易与十进制数混淆。

4.8.5 局部变量不应与全局变量重名。

4.8.6 不应使用未知大小的数组。

当声明一个数组时,其大小应该显式声明或者通过初始化进行隐式定义。

4.8.7 不应重新定义使用C的关键字。

4.8.8 non-void类型函数的所有出口路径都应该有一个明确的return语句表达式,而不应该只有return

错误用法示例:

int func(void)

{

     

     return;

}

 

4.8.9 在函数参数中不应使用static存储类标识符。

错误用法示例:

int func(static int x);

 

4.8.10 类函数宏调用时不应没有它的参数,并且参数不应多于或少于宏定义时的参数。

错误用法示例:

# define  ABC(x)   ( (x) + 3 )

b = ABC;

 

#define  MAX(a, b)   ((a) > (b) ? (a) : (b))

long maxnum = MAX(intnum);

 

4.8.11 字符型变量应明确定义是有符号的还是无符号的。

4.8.12 在同一嵌入式软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突。

例如:可规定接口部分的变量与常量之前加上模块标识等。

4.8.13 在文件范围内声明和定义的所有对象或函数应具有内部链接,除非是在需要外部链接的情况下。

如果一个变量只是被同一文件中的函数所使用,那么就用static。类似地,如果一个函数只是在同一文件中的其他地方调用,那么就用static。使用static存储类标识符将确保标识符只是在声明它的文件中是可见的,并且避免了和其他文件或库中的相同标识符发生混淆的可能性。

4.8.14 typedef自定义的类型不应被重新定义。

改变用户自定义的类型会引起混淆甚至能导致错误,因此用typedef自定义的类型不应被重新定义。

4.8.15 预处理语句“#if”和“#endif”不应分散在不同的文件之中。

4.8.16 被包含文件中的“#else”、“#elseif”、“#endif”不应与父文件中的“#if”匹配。

4.8.17 #if”表达式中使用的宏应该已经被定义,并且“#if”表达式只能包含整型常量。

错误用法示例:

#define BIGINT 32767

#define BIGREAL 1e38

#if (BIGREAL > BIGINT)     /* BIGREAL是浮点型常数 */

...

#endif

 

4.8.18 应避免一个头文件的内容被包含两次。

4.8.19 宏如果需要被重定义,应该先用“#undef”解除前面的定义。

4.8.20 除了编译开关/头文件等特殊应用,不应使用“_EXAMPLE_TEST_”之类以下划线开始和结尾的定义。

4.8.21 限定符static不应用于定义标记。

错误用法示例:

static struct ST1 { int a; int b };

 

4.8.22 地址操作符“&”不应用于一个声明为“register”类型的对象。

错误用法示例:

static void foo (void)

{

register int a;

int *pa;

pa = &a;    /* &”不应用于一个声明为“register”类型的对象 */

}

register int array[10];

int * ptr = &array[0];     /* &”不应用于一个声明为“register”类型的对象*/

 

4.8.23 structunion类型中至少应有一个成员。

4.8.24 structunion成员不应使用存储类指示符。

错误用法示例:

struct record

{

   extern int field;

};

 

4.8.25 structunion类型的成员不应是void类型、函数类型、未知大小的数组和含有未知内容的structunion

 

4.8.26 宜使用“typedef”在头文件中对基本类型定义。

正确用法示例:

  typedef   char            char_t;

  typedef   signed char     int8_t;

  typedef   signed short    int16_t;

  typedef   signed int      int32_t;

  typedef   signed long    int64_t;

  typedef   unsigned char    uint8_t;

  typedef   unsigned short   uint16_t;

  typedef   unsigned int     uint32_t;

  typedef   unsigned long    uint64_t;

  typedef   float           float32_t;

  typedef   double         float64_t;

  typedef   long double     float128_t;

 

4.8.27 对只设置一次的变量,宜使用“const”限定词进行声明。

4.8.28 宜优先考虑使用函数而非函数式宏定义,在宏参数中不宜包含自增、自减或赋值等带有单边作用的操作符,宏参数中也不宜包含函数调用。

4.8.29 函数中不宜使用过多的参数,建议不超过20个。

4.8.30 不宜在一个函数块中单独使用“#define”或“#undef”。

4.8.31 应谨慎使用“#pragma”。

 

4.9 控制语句类

4.9.1 条件判别成立时相应分支不应无执行语句。

4.9.2 ifelse if语句中应使用else分支。

4.9.3 switch语句中应有default语句。

4.9.4 不应使用空switch语句。

4.9.5 switch语句中不应只包含default语句。

4.9.6 所有非空的switch case子句都应以break 语句结束。

4.9.7 switch控制表达式不应是一个常量或逻辑表达式。

逻辑表达式只有真和假两种情况,当需要对逻辑表达式判别时,应使用if …… else语句而不是switch语句。

4.9.8 每一个switch语句都应至少有一个case子句。

switchcasedefault之前不应存在声明和语句。

4.9.9 case表达式的类型应与switch控制表达式的类型一致。

4.9.10 switch的子句不应位于一个嵌套的代码块中。

错误用法示例:

int foo(int i, int p)

{

    int ret = p;

 

    switch (i)

    {

    case 0:

        if (ret > 2)

        {

            ret++;

        break;

    case 1:

        ret = 2;

        break;

    case 2:

        ret = 3;

        break;

        }

    default:

        ret = 4;

        break;

}

}

 

4.9.11 case表达式的大小不应超过switch控制表达式的大小。

4.9.12 循环控制变量的类型应为整型。

浮点数不应用作循环控制变量,在循环执行时会得到不可预料的结果。

错误用法示例:

   

  for (ft = 0.0F; ft < 10.0F; ft = ft + 2.0F)

 ++loop; 

   

 

4.9.13 循环控制变量应为局部变量。

循环变量应在在最小的范围内定义,以免变量被外部修改导致循环不可控制,即循环变量的作用域应最小。

4.9.14 for循环控制语句中的3 个表达式只应和循环控制相关。

第一个表达式只能为循环变量赋初值,第二个表达式只能进行循环条件的判断,第三个表达式只能进行循环变量增() 值这样可以增强程序的可理解性。

错误用法示例:

for (i == 0; i < 10; i++)   /*第一个表达式不是赋值表达式*/

{

……

}

 

4.9.15 for 循环中,循环变量只应在for循环控制语句的第三个表达式中修改,不应在循环体中修改。

4.9.16 不应直接从函数中跳出。

直接从函数中跳出破坏了程序的结构化。

错误用法示例:

#include <setjmp.h>

 

void foo(jmp_buf mark, unsigned int val)

{

longjmp(mark, val);

}

4.9.17 不应使用 goto 语句及标号。

4.9.18 不宜在循环中使用break语句。

4.9.19 for循环不宜只执行一次。

 

4.10 类型转换类

4.10.1 应减少没有必要的数据类型默认转换与强制转换。

对编译系统默认的数据类型转换,应有充分的认识,默认的数据类型转换有可能损失数据的精度,可能改变数据的符号属性。表达式如果是函数的参数或函数的返回表达式,不能出现默认数据类型转换。当进行数据类型强制转换时,其数据的意义、转换后的取值等都有可能发生变化,而这些细节若考虑不周,就很有可能留下隐患。常数被默认转换为无符号数时,应充分考虑到无符号变量的空间大小。

4.10.2 应禁止 signed 类型与 unsigned 类型之间的隐式转化。

从有符号类型转换为无符号类型会导致符号的丢失。无符号数转换为有符号数,可能得到一个负值。

4.10.3 应禁止 int 类型与 float 类型的隐式转化。

浮点类型与整型之间的相互转换为会导致精度的丢失。

错误用法示例:

  double d64_a; 

  float f32_a; 

  signed int i16_a; 

  ... 

  d64_a = i16_a;         /* 整型数转换为浮点数 */ 

  si16_a = f32_a;         /* 浮点数转换为整型数 */ 

  ... 

 

4.10.4 不应对指针变量使用强制类型转换赋值。

错误用法示例:

void foovoid

{

unsigned short s = 0;

unsigned int *p1_ptr;

p1_prt = (unsigned int*)s;

}

 

4.11 指针、数组使用类

4.11.1 不应把自动类型的局部变量的地址赋值给外部指针。

局部变量的地址赋值给外部或者范围更大的指针,如果局部变量不是静态的,那么这种用法是不安全的。

错误用法示例:

  extern int* pi;

 

  void f(void)

  {

      int a;

      pi = &a;

}

 

4.11.2 指针的指针不应超过两级。

4.11.3 指向不同数据类型的指针之间不应相互转换。

不同的数据类型分配的字节空间可能不同,将指向多字节空间的指针转换为指向少字节空间的指针不会有问题,反之有可能出现错误

4.11.4 指针转换过程中不应丢失指针的constvolatile属性。

示例:

int x;

int *pi;                   /* 指向整形的指针 */

int *const pci1 = &x;      /* const指针 */

const int *pci2;           /* 指向const整形的指针 */

volatile int *pci3;        /* 指向volatile整形的指针 */

...

pi = pci1;                 /* 符合本条要求 */

pi = (int *)pci2;          /* 不符合本条要求 */

pi = (int *)pci3;          /* 不符合本条要求 */

 

4.11.5 只有指向数组的指针才允许进行算术运算。

注:此处的算术运算仅仅限定于指针加减某个整数,比如ppoint = point -5, ppoint++等。

错误用法示例:

  int *px;

  int i;

  px = &i;

  px = px + 2;

  ++px;

 

正确用法示例:

int *px;

int a[10];

px = a;

px = px + 2;

++px;

 

4.11.6 只有指向同一数组的两个指针才允许相减。

注:此处两个指针可以指向同一数组的不同成员。

错误用法示例:

int  a[10];

int  b[10];

int x, *p1, *p2;

x = p1 – p2;

 

4.11.7 只有指向同一数组的两个指针才允许用>>=<<=等关系运算符进行比较。

注:此处两个指针可以指向同一数组的不同成员。

错误用法示例:

char a[10];

char b[10];

int x;

x = a < b;

 

正确用法示例:

char a[10];

char *p1, *p2;

int x;

p1 = a;

p2 = a+2;

x = p1 < p2;

 

4.11.8 指针的索引值不应为负。

错误用法示例:

void foo(int *p, int n)

{

    int r;

    if (n < -5)

    {

        r = p[n];        /* 指针的索引值为负 */

        ...

        r = *(p + n);    /* 指针的索引值为负 */

    }

}

 

4.11.9 不应对指针值可能为NULL的指针进行算术运算。

错误用法示例:

extern int buf[10];

void foo( int n)

{

    int *p = NULL;

    for (i = 1; i <= n; ++i)

    {

        ...

        p = &buf[i];

        ...

    }

    ++p;        /* 对指针值可能为NULL的指针进行算术运算 */

}

4.11.10 对传递到函数的指针参数应进行是否为空判断。

4.11.11 调用返回类型为指针的函数后,应进行是否为空的判断。

4.11.12 除常量字符串外,其他字符数组应指定长度。

4.11.13 局部变量的地址不应在本对象消亡后传给另外一个对象。

本条要求分为以下几种情况:

a)   将动态分配的局部变量的地址赋值给一个带链接的或更宽范围的指针是危险的,一旦局部变量的内存空间被释放,这个指针会成为无效的指针(见示例1);

b)   函数参数不应返回动态数据的地址(见示例2);

c)   函数参数不应返回本地静态数据的地址(见示例3)。

错误用法示例:

示例1: 

extern int* pi;

 

void f(void)

{

    int a;

    pi = &a;

}

 

示例2: 

void foo(int *appi)

{

    int  bi = 1;

    ...

    *appi = &bi;

    return;

}

 

示例3: 

3

void foo(int *appi)

{

    static int bi = 1;

    ...

    *appi = &bi;

    return;

}

 

4.11.14 一个未知大小的对象的指针不应成为加法或者减法操作的左操作数。

错误用法示例:

typedef struct TAG T;

 

static int foo(int n, void *pv)

{

   T *v1 = 0;

 

   v1 = v1 + n;     /* 不符合本条要求 */

   pv = pv + n;     /* 不符合本条要求 */

   v1 = v1 - n;    /* 不符合本条要求*/

   pv = pv - n;    /* 不符合本条要求 */

}

 

4.11.15 数组的索引值不应越界。

4.11.16 宜减少指针的使用。

4.11.17 多线程应用中被几个任务共享的变量宜使用“volatile”。

 

4.12 运算处理类

4.12.1 不应对有符号数进行位运算。

4.12.2 无格式的字符型不应与负数常量和零比较。

注:无格式的字符型指既没有定义为unsigned也没有定义为signedchar类型。不同的编译器对其处理是不一样的,有的定义其可正可负,有的定义其只能为正。

错误用法示例:

void f(char c1)

{

if (c1 < -3)     /* 和负数常量比较 */

{

        c1++;

}

if (c1 < 0)      /* 和零比较 */

{

        c1++;

     }

}

 

4.12.3 无符号值不应与负数常量比较。

4.12.4 对变量进行移位操作应保证不会产生溢出和数据截短。

4.12.5 不应在布尔表达式中使用赋值操作符。

4.12.6 不应对布尔表达式进行算术或者位运算。

4.12.7 表达式的值在任何求值顺序下应保持一致。

注:防止同一个表达式在不同的编译器中得到的结果不一样。

错误用法示例:

x = b[i] + i++;    /*不同的编译器给出的结果不一样,b[i]不一定先执行*/

x = 2;

y = 3;

x = y * x++;     /*求值顺序无法确定*/

 

4.12.8 应避免除数可能为0的情况出现。

4.12.9 赋值运算符的左操作数不应进行转换操作,并且应该是一个可更改的对象。

错误用法示例:

int   c = 0;

float ff = 20.0F;

float gg = 5.0F;

const float f1 = 0.0F;   /* 不符合本条要求 */

(char)c = ff * gg;      /* 不符合本条要求 */

 

4.12.10 sizeof操作符不应用在有单边作用的表达式上。

错误用法示例:

int i;

int j;

j = sizeof( i = 1234 );    /* “i = 1234”没有执行 */

 

4.12.11 逻辑运算符“&&”或者“||”右边不应包含单边作用。

注:如果“&&”的左边已经为0或者“||”的左边已经为1,则右边不会执行。

错误用法示例:

if(ishight) && (x == i++))   /* 如果ishight0,那么i++不会执行 */

4.12.12 逻辑运算符(&&|| !) 的操作数宜为一个有效的布尔值,布尔值表达式不宜进行逻辑运算以外的操作。

4.12.13 不应对无符号性的表达式进行一元减运算。

4.12.14 不宜在同一个表达式中混合使用“+ +” 和“- -”运算符。

 

4.13 函数使用类

4.13.1 传递给一个函数的参数应与声明的参数匹配。

4.13.2 函数原型中的指针参数如果不是用于修改就应声明为指向 const的指针。

正确用法示例:

void myfunc ( int16_t *param1,  const int16_t *param2,  const int16_t *param3 ) 

 /*  param1 : 指针指向的对象被修改了 不需要 const 限定

     param2 : 指针指向的对象没有被修改 需要 const 限定

     param3 : 指针指向的对象没有被修改 需要const 限定  */

  {  

      *param1 = *param2 + *param3; 

       return; 

  } 

 

4.13.3 不应把 auto 类型的局部变量地址作为函数的返回值或者通过指针参数返回。

注:return 语句不可返回指向“栈内存”的“指针”或者“引用”。auto 类型的局部变量在退出函数后会被自动销毁,内存变为没有意义。

错误用法示例:

void foo(int **appi)

{

 int  bi = 1;

 ...

 *appi = &bi;           /* 不符合本条要求 */

 ...

 return;

}

int8_t * foobar (void)

{

int8_t  local_auto;

return  (&local_auto);   /* 不符合本条要求 */

  }

 

4.13.4 在函数的调用中,函数标识符之后应该有“()”。

注:在函数的调用中,如果函数名后面不加(),表示函数的指针,而不是函数的调用。

4.13.5 宜避免在函数中使用 static 局部变量。

注:尽量避免函数带有“记忆”功能,相同的输入应当产生相同的输出。带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种“记忆状态”。这样的函数既不易理解又不利于测试和维护。

4.13.6 宜避免函数参数在调用中未被使用。

4.13.7 宜谨慎使用abortexit等函数。

注:这些函数会导致程序终止执行,有可能导致嵌入式系统无法正常运行。

4.13.8 不宜使用函数的递归调用。

注:递归调用特别是函数间的递归调用(如A->B->C->A),影响程序的可理解性;递归调用一般都占用较多的系统资源(如栈空间);递归调用对程序的测试有一定影响。故除非为某些算法或功能的实现方便,应减少没必要的递归调用。

 

4.14 数据冗余类

4.14.1 不应存在执行不到的代码。

4.14.2 表达式语句上层不应包括多余的操作符和转换。

错误用法示例:

a == b++;   /* 该表达式包含的操作符“==”没有被用到 */

(int)(a += 1);

 

4.15 程序效率类

4.15.1 应保证循环体内工作量最小化。

应仔细考虑循环体内的语句是否可以放在循环体之外使循环体内工作量最小从而提高程序的时间效率。如下代码效率不高

for (ind = 0; ind < MAX_ADD_NUMBER; ind++)

{

      sum += ind;

      back_sum = sum; /* backup sum */

}

语句back_sum = sum完全可以放在for语句之后,如下:

for (ind = 0; ind < MAX_ADD_NUMBER; ind++)

{

      sum += ind;

  }

back_sum = sum; /* backup sum */

 

4.15.2 在多重循环中,应将循环次数多的循环放在内层。

将循环次数多的循环放在内存,可以减少CPU切入循环层的次数。

如下代码效率不高

for (row = 0; row < 100; row++)

{

      for (col = 0; col < 5; col++)

      {

          sum += a[row][col];

      }

}

可以改为如下方式,以提高效率:

for (col = 0; col < 5; col++)

{

      for (row = 0; row < 100; row++)

      {

          sum += a[row][col];

      }

}

 

4.15.3 应尽量避免循环体内含判断语句。

目的是减少判断次数。循环体中的判断语句是否可以移到循环体外,要视程序的具体情况而言,一般情况,与循环变量无关的判断语句可以移到循环体外。

 

4.15.4 应注意switch-case语句的使用。

为了提高程序效率,应把switch-case 语句中的每一种具体情况按照它们发生的相对频率排序。即把最可能发生的情况放在第一,最不可能发生的情况放在最后。

 

4.15.5 应避免使用标准库函数。

很多大的库例程设法处理所有可能的情况,占用了庞大的内存空间,因此嵌入式系统编程应尽可能地减少使用标准库函数。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 阿里云Redis开发规范

    一、键值设计1. key名设计(1)【建议】: 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:idugc:video:1(2)【建议】:简洁性 保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视,例如:user:{uid}:friends:messages:…...

    2024/4/18 17:01:35
  2. windows10上使用apache部署python flask项目

    由于需要在学校机房部署,所以必须选择windows系统。 本人电脑win10需要清楚的事情:生产环境所使用的python的版本,从cmd中进入python后,版本信息将打印在cmd中。本人使用的为32位的py3.5 on win32下载Apache下载链接 选择apache版本。我选择的版本为Apache 2.4.29 Win32。…...

    2024/4/18 10:06:28
  3. 使用AxureRP7.0制作经典小游戏"大家来找茬"

    本案例是《网站蓝图AxureRP7.0从入门到精通视频教程》中的最后一节,适用于对Axure基础知识掌握比较熟练的同学;教程由axure原型库网站录制,转载请注明出处!相信很多刚接触Axure或者学习了一段时间但并没有深入的同学们,看到这个案例一定很惊讶,使用Axure竟然能做出如此逼…...

    2024/5/4 18:27:08
  4. API拦截技术总结

    自接触计算机技术以来,就听到和了解了API Hook的相关知识,但是总是浅尝辄止,深感惭愧。今日痛定思痛,决意走技术流派,努力学习,不求问答于诸侯,但求能养家糊口,聊以自慰。It is never to late to learn.API拦截技术,顾名思义,其实就是拦截对某API的调用,拦截后改变程…...

    2024/4/18 9:52:43
  5. 微信公众号开发文档,微信小程序开发文档,微信扫码支付文档,微信委托代扣模式开发文档

    微信公众号开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432微信小程序API开发文档:https://developers.weixin.qq.com/miniprogram/dev/api/network/download/wx.downloadFile.html微信小程序支付接口文档:https://pay.weixin.qq.com/wiki/d…...

    2024/4/26 12:53:30
  6. 学习java必会知识

    简单梳理Java知识时,整理的笔记,分享一下,如有错误,还请指正,谢谢🙏编译过程编译由 Java 源码编译器(javac)来完成。过程:源代码---【词法分析器】---Token 流---【语法分析器】---语法树---【语义分析器】---注解抽象语法树---【字节码生成器】---JVM 字节码三个过程解…...

    2024/4/18 9:54:25
  7. Python3.6 使用 Docker 快速部署 Django2.0 项目到阿里云服务器上

    一、前言之前 nginx + uwsgi3 + python3 + django2 部署 Django 项目, 略显复杂,容易出错,不易维护: centos7 下将 Django2.0 项目部署到 阿里云 上(uwsgi3 +Nginx ) 近来在 DaoCloud 上发现了一个热门的 Django 的 docker 镜像 部署了一下项目,相当简单,挺不错,分…...

    2024/4/18 10:11:34
  8. 国外知名网站

    一,知识类 1、维基百科-自由的百科全书:点击打开链接 2、Coursera-致力于普及全世界最好的教育:点击打开链接 3、IMDB- 互联网电影资料库:点击打开链接http://www. 4、Stackoverflow-最牛逼的IT技术问答网站:点击打开链接 5、GitHub-Build software better ,together:点击打…...

    2024/5/4 15:15:22
  9. 为什么C语言不会过时?

    评价任何一门编程语言,都是招人骂的。 永远是这样。就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:“傻逼!”这个在心理学上有个专业的名字:叫做“二逼”现象! 海风教育在线辅导0元一对一试听课等你来领取,领取课程方法: 1、…...

    2024/4/20 1:09:41
  10. CSDN问答频道4月声望排行榜出炉,既5月奖品预告

    CSDN问答频道月度排行榜,是CSDN问答频道从3月开始举办的活动,旨在鼓励更多用户参与提问和解答,创造一个良好的互帮互助氛围,使参与者在问和答的过程中得到技术水平的提升,也希望大家能在技术交流中结交到志同道合的朋友。已经是注册用户的直接点击传送门:http://ask.csdn…...

    2024/3/31 17:09:35
  11. python面试简历该怎么写?(附简历)

    本篇是python面试爬虫简历,限于简历信息的私密性,word简历文件未做上传,如想获取本人word简历,请加作者微信并备注csdn,我会发给大家,相关资料都已经传于Python社区网站,网站搜索即可获取面试简历获取:点击下方面试简历在论坛获取:>> 面试简历 链接:http://w…...

    2024/4/12 1:44:00
  12. 微信小程序开发(一)微信开发者工具以及小程序框架介绍

    相关文章微信小程序开发(二)开发之日历打卡小程序发现页微信小程序开发(三)入门之创建打卡活动微信小程序开发(四)入门之打卡功能开发前言一直不温不火的微信小程序2018年迎来了第二春,在我的记忆中随着跳一跳小游戏的出现,一时间数千万的微信小程序如雨后春笋般出现在…...

    2024/4/18 10:23:04
  13. 使用PyCharm新建一个项目并创建Python脚本模板

    创建项目运行PyCharm,点击“File”——选择“New Project”选择“Pure Python”,设置项目所在目录,其他的默认没配置即可,点击“Create”在项目中创建目录,右击新建的项目ggyy——点击“New”——选择“Directory”设置目录名称为day1,点击“OK”穿件Python文件,右击新建…...

    2024/4/23 16:22:57
  14. 28个MongoDB NoSQL数据库的面试问答

    MongoDB是目前最好的面向文档的免费开源NoSQL数据库。如果你正准备参加MongoDB NoSQL数据库的技术面试,你最好看看下面的MongoDB NoSQL面试问答。这些MongoDB NoSQL面试问答涵盖了NoSQL数据库基本的概念,复制(Replication),分片(Sharding),事务和锁,跟踪分析工具(Profiler…...

    2024/4/18 9:57:46
  15. Repeater:重复器

    repeater 重复列表 五大模板:HeaderTemplate - 标题定义模板ItemTemplate - 数据项模板,指定显示的数据项FooterTemplate -页脚定义模板 AlternatingItemTemplate -数据项交替模板,设定相邻数据项的显示 separatortemplate-分割符模板 数据绑定: Repeater1.DataSource=指向…...

    2024/4/18 10:05:45
  16. C语言嵌入式系统编程修炼.txt

    不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力。无疑,汇编语言具备这样的特质。但是,由于汇编语言开发的复杂性,它并不是嵌入式系统开发的一般选择。而与之相比,C语言--一种"高级的低级"语言,…...

    2024/4/20 11:15:05
  17. VS CODE设置自动编码

    新拿到一个项目中的文件编码格式不同,有UTF-8的,也有GB2312的,选择一种编码模式的话有的文件会显示乱码,而且部分函数定义是找不到的,于是使用了自动设置编码格式的配置解决了这个问题。一、Ctrl+p,输入settings.json,然后回车。 二、删除原来的编码格式,如下图,把第三…...

    2024/4/20 7:50:00
  18. 微信小程序从0到实现发送订阅消息完整版——带你脱坑

    废话不多比比,在开发微信小程序进行消息推送时遇到了麻烦 耽搁了一下午 ,所以把这些麻烦都记录一下 希望对你也有用根据微信小程序官方文档的提示我们的模板消息在2020 年 1 月 10 号全面下架,所以要实现功能我们就要开通订阅消息 踩坑一设置服务类目 在我第一次进入订阅消息…...

    2024/4/20 11:56:36
  19. 华为SDC相机开发(7.模型转换工具合集与 pytorch2caffe)

    文章目录模型转换工具pytorch2caffe尝试一(失败)尝试二(失败)尝试三(成功) 模型转换工具 github地址: https://github.com/ysh329/deep-learning-model-convertor 模型转换的部分截图如下:海思自己的在线转换工具应该是使用了微软的MMdnn(https://github.com/Microsoft…...

    2024/4/18 10:14:19
  20. C语言程序设计课程设计 - (物业管理系统 - 纯C)

    本套代码分享了我大一C语言实训时最后的 C语言课程设计,第一次接触编程能力还很弱,欢迎拍砖提议。。额。。。2019.7.7更,最近好多人都在问我代码的问题,大多是大一的,可能C语言语法还不是太熟悉,代码很难复现出来。(看来又到实训期了。。。)现在做下补充:1、开发环境:…...

    2024/4/24 6:31:50

最新文章

  1. Redis发布-订阅模式之Channel的发布订阅

    文章目录 一、简介二、通过频道&#xff08;Channel&#xff09;实现三、代码示例&#xff08;1&#xff09;发布者发送消息&#xff08;2&#xff09;订阅者订阅频道 一、简介 Redis 发布订阅&#xff08;Pus/Sub&#xff09;是一种消息通信模式&#xff1a;发送者通过 publi…...

    2024/5/4 23:19:05
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. WPS二次开发专题:如何获取应用签名SHA256值

    作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 在申请WPS SDK授权版时候需要开发者提供应用包名和签…...

    2024/5/3 15:18:01
  4. 蓝桥杯加训

    1.两只塔姆沃斯牛&#xff08;模拟&#xff09; 思路&#xff1a;人和牛都记录三个数据&#xff0c;当前坐标和走的方向&#xff0c;如果人和牛的坐标和方向走重复了&#xff0c;那就说明一直在绕圈圈&#xff0c;无解 #include<iostream> using namespace std; const i…...

    2024/5/3 9:22:44
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/3 23:10:03
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/4 18:20:48
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/4 2:59:34
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57