娱乐城白菜论坛

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

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

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

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

收藏 人收藏
分享:

评论

相关推荐

一种基于嵌入式TCP/IP软件体系结构的优化设计和实现方案详解

随着计算机网络娱乐城白菜论坛和电子信息娱乐城白菜论坛的迅猛发展,Internet的普及,接入Internet的非PC设备....
发表于 02-16 11:24 ? 23次 阅读
一种基于嵌入式TCP/IP软件体系结构的优化设计和实现方案详解

嵌入式一体化的智能化产品在智能交通领域内的应用获得广泛认同

随着世界经济和我国经济的不断发展,交通运输越来越成为国民经济生活中的一个极其重要、不可缺少的因素,现....
发表于 02-16 11:12 ? 44次 阅读
嵌入式一体化的智能化产品在智能交通领域内的应用获得广泛认同

Python登上“最强王者”中国程序猿是“全场MVP”

国内基于 Python 创业成功的案例不在少数,豆瓣,知乎,果壳,全栈都是 Python,大家对 P....
发表于 02-16 10:23 ? 105次 阅读
Python登上“最强王者”中国程序猿是“全场MVP”

32位单片机与嵌入式操作系统的测试复习题和答案资料免费下载

本文档的主要内容详细介绍的是32位单片机与嵌入式操作系统的测试复习题资料免费下载。
发表于 02-15 17:19 ? 39次 阅读
32位单片机与嵌入式操作系统的测试复习题和答案资料免费下载

基于ARM11平台的智能火灾监测报警系统研究

随着我国城镇化建设进程的加快,城镇的火灾隐患越来越大,每年我国都因为火灾而造成巨大的经济损失。尽管目....
发表于 02-15 15:45 ? 47次 阅读
基于ARM11平台的智能火灾监测报警系统研究

随着成本的逐步降低 中国的智能家居最终将走向嵌入式

后PC时代的到来完全依赖于嵌入式娱乐城白菜论坛的诞生与发展,传统的IT设备逐渐转变为嵌入式设备,这是一个大趋势....
发表于 02-15 15:38 ? 86次 阅读
随着成本的逐步降低 中国的智能家居最终将走向嵌入式

单片机与嵌入式的详细资料总结免费下载

本文档的主要内容详细介绍的是单片机与嵌入式的详细资料总结包括了:1.嵌入式系统概述,2.常用嵌入式平....
发表于 02-15 10:28 ? 31次 阅读
单片机与嵌入式的详细资料总结免费下载

位运算让嵌入式系统更快更稳定

本方法可以让C语言指令进一步接近汇编指令的执行效率,提高单片机、嵌入式系统的速度和稳定性,但编程时应....
的头像 嵌入式资讯精选 发表于 02-15 08:56 ? 102次 阅读
位运算让嵌入式系统更快更稳定

嵌入式产品的研发流程详解

当一个项目做完的时候,如果客户突然又增加需求,增加功能,将导致你的项目周期严重拖延,成本剧烈上升,并....
的头像 玩转单片机 发表于 02-14 15:42 ? 212次 阅读
嵌入式产品的研发流程详解

EFM8BB1 8位微控制器的数据手册免费下载

EFM8BB1 是 Busy Bee 系列的 MCU,是一款小封装且功能全面的多用途 8-位微控制器....
发表于 02-14 08:00 ? 19次 阅读
EFM8BB1 8位微控制器的数据手册免费下载

设计嵌入式系统硬件电路时需要考虑哪些问题

设计以MCU为核心的嵌入式系统硬件电路需要根据需求分析进行综合考虑,需要考虑的问题较多,这里给出几个....
的头像 玩转单片机 发表于 02-13 16:32 ? 190次 阅读
设计嵌入式系统硬件电路时需要考虑哪些问题

几种架构中代码压缩娱乐城白菜论坛的实现进行比较分析

对于嵌入式软件而言,代码尺寸是越小越好。压缩代码以适应受到成本或空间限制的存储子系统已经成为嵌入式系....
的头像 玩转单片机 发表于 02-13 16:28 ? 210次 阅读
几种架构中代码压缩娱乐城白菜论坛的实现进行比较分析

新型嵌入式开发套件可最大限度地缩短开发时间 提高人员的工作效率

虽然FPGA的传统用户是硬件设计者,但是赛灵思的新型嵌入式设计平台,使得软件开发人员也能够在熟悉的环....
发表于 02-13 16:07 ? 81次 阅读
新型嵌入式开发套件可最大限度地缩短开发时间 提高人员的工作效率

iVMS-4200监控软件的使用说明免费下载

软件iVMS-4200是为嵌入式网络监控设备开发的软件应用程序,适用于嵌入式网络硬盘录像机、混合型网....
发表于 02-13 08:00 ? 21次 阅读
iVMS-4200监控软件的使用说明免费下载

光学相位编码测距的多普勒校正和检测方法及系统

相位编码激光雷达的多普勒校正包括一个表示相位编码信号的相位序列的编码,以及确定信号的第一傅立叶变换。....
发表于 02-12 08:00 ? 27次 阅读
光学相位编码测距的多普勒校正和检测方法及系统

盘点嵌入式娱乐城白菜论坛在物联网中的应用

随着IT娱乐城白菜论坛飞速发展,互联网已经进入了“物联网”时代。
的头像 嵌入式ARM 发表于 02-11 16:57 ? 504次 阅读
盘点嵌入式娱乐城白菜论坛在物联网中的应用

进行编码、测试和调试三个阶段时如何减少bug

这十年来我做过小的嵌入式系统,大的电信系统以及基于web的系统。使用过C ++,Ruby,Java和....
的头像 嵌入式ARM 发表于 02-11 16:52 ? 190次 阅读
进行编码、测试和调试三个阶段时如何减少bug

官方定义:根据IEEE(国际电气和电子工程师协会)的定义,嵌入式系统是“控制、监控或者辅助设备、机器和车间运行的装置”。...
发表于 02-11 10:07 ? 361次 阅读

      本人是某211大学嵌入式方面的研一学生,我教研室偏向于实用性学习,基本都是写完程序直接拿硬件实际操...
发表于 02-08 19:48 ? 341次 阅读

RTCC芯片的选择与在嵌入式系统的设计应用

许多嵌入式应用需要知道时间,以便在特定的时间和日期,或针对时间戳事件,或同时依据两者执行特定的任务。....
的头像 电子设计 发表于 02-06 09:45 ? 420次 阅读
RTCC芯片的选择与在嵌入式系统的设计应用

闪存娱乐城白菜论坛如何解决操作系统性能下降的问题

本文介绍了嵌入式操作系统的作用,以及为何将操作系统和应用程序代码同时放在物联网节点中的 microS....
的头像 电子设计 发表于 02-06 09:41 ? 273次 阅读
闪存娱乐城白菜论坛如何解决操作系统性能下降的问题

嵌入式硬件通信接口协议中的串行通信接口-SPI

本节继续讲嵌入式硬件通信接口协议中的另外一个串行通信接口-SPI。相比于UART串口协议,SPI又有....
发表于 02-05 11:35 ? 99次 阅读
嵌入式硬件通信接口协议中的串行通信接口-SPI

如何正确的设计嵌入式软件架构应该这么做

近公司新招了一个做嵌入式软件开发的同事,该同事是从上海的某一个上市公司出来的,因为我们这边人手不够,....
的头像 嵌入式ARM 发表于 01-29 15:45 ? 487次 阅读
如何正确的设计嵌入式软件架构应该这么做

浅谈嵌入式Linux下的C语言编程知识要点

Linux和C语言有着很深的渊源,因为Linux本身就是用C语言编写的。同时,在Linux操作系统中....
的头像 玩转单片机 发表于 01-28 11:32 ? 654次 阅读
浅谈嵌入式Linux下的C语言编程知识要点

  嵌入式现在可以说是很热门的IT娱乐城白菜论坛之一了,据调查,每个公司就有2-3个嵌入式工程师,当然这是小公司,大公司可想而知,不止...
发表于 01-28 11:07 ? 468次 阅读

如何选择合适的MCU和电源让你的嵌入式电路设计更高效

1、MCU的选择选择 MCU 时要考虑 MCU 所能够完成的功能、MCU 的价格、功耗、供电电压、I....
的头像 玩转单片机 发表于 01-27 11:40 ? 952次 阅读
如何选择合适的MCU和电源让你的嵌入式电路设计更高效

首颗国产40纳米工业级嵌入式存储芯片开始小批量生产 并打入十多家厂商

政府性基金引路,社会资本跟进,江苏南通新一代信息娱乐城白菜论坛产业链“芯片设计”的“缺环”有望加快补齐。两个月....
发表于 01-27 11:10 ? 266次 阅读
首颗国产40纳米工业级嵌入式存储芯片开始小批量生产 并打入十多家厂商

eFPGA是什么?几个关于eFPGA的常见迷思

eFPGA,全称为嵌入式FPGA(Embedded FPGA),顾名思义是将类似于FPGA的可编程逻....
的头像 TechSugar 发表于 01-27 10:40 ? 673次 阅读
eFPGA是什么?几个关于eFPGA的常见迷思

过程分析1.添加新词需要确定无缓存文件,否则无法使用成功,因为词典会优先加载缓存文件2.再确认缓存文件不在时,打开本地词典按...
发表于 01-27 10:20 ? 508次 阅读

嵌入式系统的发展将实现计算机的无处不在

以嵌入式计算机为核心的嵌入式系统(Embedded System)是继IT网络娱乐城白菜论坛之后,又一个新的技....
的头像 嵌入式ARM 发表于 01-25 11:17 ? 1089次 阅读
嵌入式系统的发展将实现计算机的无处不在

基于ARM处理器的嵌入式防火墙总体架构设计

进一步的工作包括继续优化其通信性能,或者在其基础之上扩展相关安全应用,包括身份认证系统、入侵检测系统....
的头像 嵌入式ARM 发表于 01-25 10:35 ? 780次 阅读
基于ARM处理器的嵌入式防火墙总体架构设计

MRAM的嵌入式和独立式存储器会开始分流

几乎所有的新兴存储器出道时都宣称与CMOS工艺兼容,意思是可以做逻辑工艺的嵌入式存储器。
的头像 DIGITIMES 发表于 01-25 10:06 ? 884次 阅读
MRAM的嵌入式和独立式存储器会开始分流

传闻中的英特尔新CEO们来一次大盘点

从苹果官网和一些网络资料来看,斯鲁吉拥有以色列理工学院的计算机科学学士和硕士学位。担任过以色列IBM....
的头像 TechSugar 发表于 01-23 17:00 ? 1253次 阅读
传闻中的英特尔新CEO们来一次大盘点

嵌入式PROFIBUS现场总线通信接口设计

接口板与用户模板采用串口连接,使用波特率选择开关可选择指定 的7种波特率(9600、19.2K、 3....
发表于 01-23 15:18 ? 127次 阅读
嵌入式PROFIBUS现场总线通信接口设计

引言 早在20世纪60年代,就已经有人开始研究和开发嵌入式操作系统。但直到最近,它才在国内被越来越多的提及,在通信、电子、自...
发表于 01-23 14:42 ? 249次 阅读

莱迪思半导体推出的嵌入式视觉开发套件是一个模块化的平台

莱迪思半导体公司(NASDAQ: LSCC),客制化智能互连解决方案市场的领先供应商,宣布推出全新的....
发表于 01-23 14:41 ? 374次 阅读
莱迪思半导体推出的嵌入式视觉开发套件是一个模块化的平台

衡宇科技完成新一轮融资 潜心发展嵌入式NAND Flash控制芯片等

据悉,衡宇科技于2012年2月创立,可为用户提供应用于通讯、消费电子及数据处理行业的闪存主控芯片产品....
发表于 01-22 15:51 ? 245次 阅读
衡宇科技完成新一轮融资 潜心发展嵌入式NAND Flash控制芯片等

Cheap_Flash_FS(普通版)--嵌入式FAT文件系统免费源码,请下载 本代码兼容FAT16/FAT32文件系统共计两种格式,兼容...
发表于 01-22 09:19 ? 259次 阅读

这篇文章中的经验教训旨在帮助减少编码,测试和调试三个阶段的bug。 1.事件顺序。在处理事件时,提出下列问题会很有成效:事件...
发表于 01-21 23:00 ? 249次 阅读

适合STM32的五大嵌入式操作系统

基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-....
的头像 玩转单片机 发表于 01-21 17:38 ? 842次 阅读
适合STM32的五大嵌入式操作系统

解答ARM嵌入式初学者常见疑问

ARM7比起ARM9,更适合初学者学习。和ARM7相比,应该说ARM9在性能方面有很大提高,但ARM....
的头像 嵌入式ARM 发表于 01-21 16:48 ? 672次 阅读
解答ARM嵌入式初学者常见疑问

作者:Younix脏羊 ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标: (1)掌握主流嵌入式微处理器...
发表于 01-21 16:09 ? 289次 阅读

华为22年,49岁,他一直在编码

“阮师傅,你准备啥时候退休啊?”这是很多同事见面常问我的一句话。也有不少人问我,为什么能在一个领域的....
的头像 单片机精讲吴鉴鹰 发表于 01-21 15:27 ? 583次 阅读
华为22年,49岁,他一直在编码

     嵌入式计算机在应用数量上远远超过了各种通用计算机,一台通用计算机的外部设备中就包含了5-10个嵌入式...
发表于 01-21 10:18 ? 151次 阅读

请教各位:有人做个蓝牙U盘吗?就是在u盘中嵌入蓝牙模块,实现U盘之间通过蓝牙进行数据传输,而避免U盘对PC机的依赖! 这是...
发表于 01-21 05:28 ? 77次 阅读

物联网满足嵌入式系统需求

即使坐在在互联网上最小的设备是黑客试图窃取信息,潜在的目标伪造数据,或者损坏或禁用该设备本身。在人们....
发表于 01-20 09:47 ? 503次 阅读
物联网满足嵌入式系统需求

如何去做嵌入式_还需要具备这6点知识

我们知道要入门嵌入式,进行嵌入式的学习,尤其是未来想要从事嵌入式硬件相关的工作,但是做嵌入式并不是只....
发表于 01-19 15:57 ? 912次 阅读
如何去做嵌入式_还需要具备这6点知识

嵌入式硬件电路设计中的六大要点

嵌入式设计是个庞大的工程,硬件电路设计方面这几个要点需要格外注意。嵌入式的硬件构架中CPU是系统的灵....
的头像 嵌入式ARM 发表于 01-18 14:33 ? 571次 阅读
嵌入式硬件电路设计中的六大要点

业界广为流传的嵌入式软件测试十大秘诀

在嵌入式软件开发过程中,一般来说,花在测试和花在编码的时间比为3:1(实际上可能更多)。这个比例随着....
的头像 嵌入式ARM 发表于 01-18 14:29 ? 562次 阅读
业界广为流传的嵌入式软件测试十大秘诀

嵌入式Linux下的C编程知识要点汇总

Linux和C语言有着很深的渊源,因为Linux本身就是用C语言编写的。同时,在Linux操作系统中....
的头像 嵌入式ARM 发表于 01-18 14:27 ? 625次 阅读
嵌入式Linux下的C编程知识要点汇总

看门狗功能在MCU中的设计应用

由于多线程、实时和多任务嵌入式系统的情况纷繁复杂,使我们越来越难以预料微处理器会在什么时候出现问题。....
的头像 电子设计 发表于 01-18 09:04 ? 342次 阅读
看门狗功能在MCU中的设计应用

基于硬件的MCU解决安全漏洞问题

越来越多的记录在案的安全漏洞使用物联网(IoT)作为切入点,提高了物联网连接设备的设计社区的安全意识....
的头像 电子设计 发表于 01-18 09:02 ? 734次 阅读
基于硬件的MCU解决安全漏洞问题

如何吧Mysql数据库移植到嵌入式Linux的详细资料说明

本文档的主要内容详细介绍的是如何吧Mysql数据库移植到嵌入式Linux的详细资料说明。
发表于 01-18 08:00 ? 49次 阅读
如何吧Mysql数据库移植到嵌入式Linux的详细资料说明

如何吧SQLite移植到嵌入式Linux系统的详细资料说明

本文档的主要内容详细介绍的是如何吧SQLite移植到嵌入式Linux系统的详细资料说明。
发表于 01-18 08:00 ? 38次 阅读
如何吧SQLite移植到嵌入式Linux系统的详细资料说明

如何吧tcpdump网络抓包工具移植到嵌入式linux系统

本文档的主要内容详细介绍的是如何吧tcpdump网络抓包工具移植到嵌入式linux系统详细资料合集免....
发表于 01-18 08:00 ? 62次 阅读
如何吧tcpdump网络抓包工具移植到嵌入式linux系统

嵌入式硬件的七项娱乐城白菜论坛创新及其应用预测

机器人出租车绝对将会在2019年内推出上路。有许多投资方和合资企业都致力于推出这些自动驾驶的车辆,诸....
的头像 嵌入式资讯精选 发表于 01-17 16:56 ? 794次 阅读
嵌入式硬件的七项娱乐城白菜论坛创新及其应用预测

IMU为嵌入式应用提供更精细的定位分辨率

全球导航卫星系统 (GNSS) 非常有用,能够定位全球任意位置已正确启用此功能的系统,但仅仅使用 G....
的头像 电子设计 发表于 01-17 08:40 ? 436次 阅读
IMU为嵌入式应用提供更精细的定位分辨率

2018年的联络中心:嵌入式支持B2B应用程序

Jamison将机器人比作交互式语音应答(IVR)系统。"我们已经使用IVR 30年或更长时间了,我....
的头像 CTI论坛 发表于 01-16 17:25 ? 810次 阅读
2018年的联络中心:嵌入式支持B2B应用程序

嵌入式工程师到底有没有前途应该如何规划就业之路

嵌入式一直冠以高门槛的名号,相较于软件开发逊色的起步薪资也被网友调侃“饿肚子”。热情投入嵌入式的人比....
发表于 01-16 16:53 ? 130次 阅读
嵌入式工程师到底有没有前途应该如何规划就业之路

商汤科技推出SenseDLC嵌入式人像识别SDK软件 安防边缘的“小巨人”

据麦姆斯咨询介绍,随着这些年将人工智能娱乐城白菜论坛赋能行业的不断深入,商汤科技对智慧城市建设有着更深的理解。....
发表于 01-16 13:50 ? 528次 阅读
商汤科技推出SenseDLC嵌入式人像识别SDK软件 安防边缘的“小巨人”