0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式C代码编码习惯要遵循哪些规则

电子工程师 来源:cc 2019-01-21 15:17 次阅读

Cortex-M这类微控制器编程通常采用C代码,那么编程人员如何编写代码才能让C编译器产生高质量底层代码就成为一个很重要的话题。这里所说的高质量底层代码是指既达到编程人员意图又方便编译器优化的代码。

本文将从编写利于优化的源代码,节省栈和内存空间,函数原型,整型和位取反,同时读写变量的保护,不进行初始化的变量这几个方面来讨论如何编写良好的嵌入式C代码。

编写利于优化的源代码

我们在编写源代码的时候如果能够遵循以下几点,可以让编译器更好的对代码进行优化:

1)局部变量(自动变量和参数)比静态或全局变量要更好。为什么这么说呢,因为优化器会假定任何一个函数都可能修改静态或全局变量。当局部变量的生命周期结束的时候,它所占据的内存就可以被其它变量使用,而全局变量在整个程序的生命周期内都不会释放它所占据的内存空间。

2)避免用&运算符取局部变量的地址。这里有两个原因会导致该操作的效率低下。首先,变量必须放在内存中,不能放在处理器寄存器中,这将导致更长更慢的代码效率。其次,优化器不再假设其它的函数,因此不会影响到该变量。

3)编译器的内联函数能力。为了最大限度的影响编译器的内联转换,我们最好把那些多个模块都用到的小函数写在头文件中而不是实现文件中。

节省栈和内存空间

以下的编程技术可以让我们节省内存和栈空间:

1)如果栈空间有限,那么我们就要尽量避免长的调用链和递归函数。

2)避免使用大的聚合类型(比如结构体)作为参数或者返回类型。为了节省栈空间,我们应该更多的使用指针来代替这种聚合类型。

函数原型

有两种函数的定义和声明方式可以使用。一种是原型风格,一种是Kernighan & Ritchie C风格。两种风格都是可以的,但强烈建议应用原型风格,也就是说对每一个公共函数都在相应的头文件中提供一个原型声明。

这是因为编译器对应用Kernighan & Ritchie C风格的参数不进行类型检查。应用原型风格在某些情况下将产生高效的代码,因为它不需要进行参数类型提升。为了保证所有的公共函数都在定义之前声明过,可以打开编译器选项 Project>Options>C/C++ Compiler>Language 1>Require prototypes

以下是两种风格的示例

1)原型风格:

原型风格中,必须写明每个参数的类型。

int Test(char, int); /* 声明 */

int Test(char ch, int i) /* 定义 */

{

return i - ch;

}

2)Kernighan & Ritchie风格

Kernighan & Ritchie风格中,不需要进行函数原型声明。取而代之的是一个空参数列表的函数声明。函数的定义也有些不同。

int Test(); /* 声明 */

int Test(ch, i) /* 定义 */

char ch;

int i;

{

return i - ch;

}

整型和位取反

在某些情况下,整数类型和它们的转换提升规则会导致难以理解的行为。这经常出现在赋值或者条件表达式中,这里涉及不同长度类型的数据和逻辑操作尤其是位取反操作。这里的类型也包括常数类型。例如:1个8位的字符类型,1个32位的整数类型,按照二进制补码操作。

void F1(unsigned char c1)

{

if (c1 == ~0x08);

}

这里,测试条件总是false。因为右边的0x08 = 0x00000008,~0x00000008 = 0xFFFFFFF7。左边的c1是1个8位无符号字符类型,因此它不可能比255大,也不可能是负数,这就意味着它的高24位不可能置1。所以这个测试条件总是false的。

同时读写变量的保护

在中断程序或者单独线程中用到的变量经常是异步读写的,它们必须进行适当地标记和适当的保护。编译器应用volatile关键字对这类变量进行标记。这个关键字通知编译器该对象的值无任何持久性,不要对它进行任何优化。

它迫使编译器每次需要该对象数据内容的时候都必须读该对象,而不是只读一次数据并将它放在处理器的寄存器中以便后续访问之用。

不进行初始化的变量

通常,运行时环境在应用程序启动的时候会初始化所有的静态和全局变量。编译器支持用__no_init关键字来声明不进行初始化的变量。用__no_init关键字声明的变量通常用在大的数据输入缓冲这样的地方。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4975

    文章

    18234

    浏览量

    287802
  • 编码
    +关注

    关注

    6

    文章

    834

    浏览量

    54448

原文标题:养成良好的嵌入式C代码编码习惯要遵循哪些规则?

文章出处:【微信号:FANYPCB,微信公众号:凡亿PCB】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式开发习惯嵌入式gdb调试步骤

    嵌入式linux开发过程中,出现BUG是在所难免的,这时就需要用到调试技术了,最常用、最简单的调试方法当属printf打印了。 如果ubuntu测试通过,程序下载到板子里出现BUG,串口还出现错误提示
    发表于 12-17 23:39

    嵌入式编程要养成好习惯

    都说字如其人,但作为嵌入式工程师来讲,编制程序的习惯同样能够反应出其水平,每位工程师都会有自己的程序设计风格和逻辑思路,所以想要成为一名合格的嵌入式工程师,形成良好的编程习惯是非常有必
    发表于 01-07 16:36

    诚聘嵌入式系统工程师(GNSS方向)

    产品的性能优化、稳定性提升、新特性开发。任职资格:1.3年以上开发经验,精通CC++,有丰富的嵌入式系统开发经验,有良好的开发习惯、文档规范及编码
    发表于 12-20 10:48

    诚聘嵌入式软件工程师

    、分析并解决嵌入式系统运行过程中出现各类软硬件问题。任职资格:1、电子、通信、计算机相关专业本科以上学历,三年以上开发经验;2、精通CC++,有良好的开发习惯文档规范及
    发表于 03-10 10:31

    养成良好的嵌入式C代码编码习惯要遵循哪些规则

    养成良好的嵌入式C代码编码习惯要遵循哪些规则?Cor
    发表于 04-04 17:14

    嵌入式小波编码算法的原理是什么?

    在基于小波变换的图象压缩方案中,嵌入式零树小波 EZW(Embedded Zerotree Wavelets)[1]编码很好地利用小波系数的特性使得输出的码流具有嵌入特性。近年来,在对EZW改进
    发表于 08-15 08:27

    嵌入式工程师是如何养成良好的C代码编码习惯

    方便编译器优化的代码。本文将从编写利于优化的源代码,节省栈和内存空间,函数原型,整型和位取反,同时读写变量的保护,不进行初始化的变量这几个方面来讨论如何编写良好的嵌入式C
    发表于 09-04 07:30

    嵌入式Linux C代码规范化

    本文档为作者 在嵌入式嵌入式 linux C语言的学习和工作中所总结的代码规范 ,是作者从 STM32单片机开发向 Linux C开发的时
    发表于 01-14 10:25

    在选择嵌入式操作系统时要遵循哪些原则?

    嵌入式系统的分类有哪几种?在选择嵌入式操作系统时要遵循哪些原则?
    发表于 04-25 09:05

    标准C语言与嵌入式C语言有哪些区别

    世界使用最广泛的系统编程语言。嵌入式CC的扩展,在嵌入式系统中应用于编写嵌入式软件。针对嵌入式
    发表于 12-14 06:15

    嵌入式C使用const

    更好的代码_嵌入式C使用 const 关键字静态数据的存储使用 const 关键字使用 const 前缀声明指定类型的常量const type variable = value;节省开销对于
    发表于 12-15 08:40

    如何调试嵌入式代码

    我们在进行嵌入式系统开发调试时,受限于嵌入式芯片资源和性能,一般采用远程调试。在调试嵌入式底层代码时,gdbserver 无法运行,我们该怎么调试底层
    发表于 12-17 06:32

    Caché嵌入式代码分享

    文章目录第十章 Caché 嵌入式代码嵌入式HTML`&html`标记语法嵌入式JavaScript嵌入式SQL第十章 Caché
    发表于 12-17 07:19

    嵌入式C语言进阶之道

    之间分工合作,你 要学会模块化编程、要写出更规范更安全的代码、做更合理的优化、减少更多的 bug。所有 的这些,都迫使你必须更彻底的理解嵌入式 C 的语法结构,数据细节,与硬件打交道的特 性,使得你
    发表于 04-19 10:15

    养成良好的嵌入式C代码编码习惯要遵循哪些规则

    代码。本文将从编写利于优化的源代码,节省栈和内存空间,函数原型,整型和位取反,同时读写变量的保护,不进行初始化的变量这几个方面来讨论如何编写良好的嵌入式C代码。 一、编写利于优化的源
    发表于 01-04 14:34 166次阅读