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关键字声明的变量通常用在大的数据输入缓冲这样的地方。

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

    关注

    5082

    文章

    19110

    浏览量

    304841
  • 编码
    +关注

    关注

    6

    文章

    942

    浏览量

    54814

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    嵌入式编程要养成好习惯

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

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

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

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

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

    嵌入式Linux C代码规范化

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

    嵌入式实时程序设计中C/C++代码的优化

    本文简单介绍了嵌入式实时程序设计的特点和嵌入式系统设计中语言的选择,着重介绍了以下几种在嵌入式实时程序设计中优化 C/C++
    发表于 08-07 08:47 15次下载

    嵌入式C编程

    嵌入式C编程,非常有用的资料,介绍嵌入式C语言编程
    发表于 12-29 17:29 0次下载

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

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

    优化嵌入式软件时可以遵循几个通用技巧盘点

    早前的专栏中曾讨论过在许多情况下需要优化的嵌入式系统的关键特征,包括系统时序、代码大小、RAM使用率和能耗。虽然优化每个特征通常要求不同的方法和威廉希尔官方网站 ,但开发人员在优化嵌入式软件时可以遵循
    发表于 03-08 14:40 660次阅读

    嵌入式代码之编写规范

    嵌入式代码编码规范,用于规范自己的代码,增强可读性,非标准规范。最好能强制自己形成良好的编码风格,有利于开发
    的头像 发表于 04-26 15:21 5273次阅读

    嵌入式C编码需要遵循的规范有哪些?

    编写代码时最重要的一条规则是:检查周围的代码并尝试模仿它。
    的头像 发表于 06-21 15:07 1368次阅读

    嵌入式外中断c语言代码

    嵌入式外中断c语言代码(arm嵌入式开发实例)-嵌入式外中断c语言
    发表于 07-30 11:29 4次下载
    <b class='flag-5'>嵌入式</b>外中断<b class='flag-5'>c</b>语言<b class='flag-5'>代码</b>

    嵌入式软件之c语言编码规范

    嵌入式软件之c语言编码规范
    发表于 10-28 18:13 28次下载

    嵌入式C++编程

    编程特性来构建嵌入式系统您将了解如何将您的系统与外部外围设备以及使用驱动程序的有效方式集成指导您测试和优化代码以获得更好的性能并实现有用的设计模式将了解如何使用 Qt,这是用于构建嵌入式系统的流行 GUI 库。内容
    发表于 11-04 10:36 10次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>++编程

    什么是__attribute__?嵌入式C代码属性怎么定义?

    嵌入式开发,离不开 C 语言,C语言中有很多语法会直接或间接影响你代码的质量,下面就来讲讲__attribute__ 关键字的用法。
    的头像 发表于 10-13 15:55 6559次阅读
    什么是__attribute__?<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b><b class='flag-5'>代码</b>属性怎么定义?