娱乐城白菜论坛

嵌入式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】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

注:已经报名的学员请添加班级群669626886————————————————————————————————————
发表于 07-31 00:00 ? 7648次 阅读

一种以增强型单片机为控制核心的嵌入式报警系统设计浅析

为了实现对家居环境安全状况实时的监控以及在发生警情时能自动拨号进行语音提示或发送报警短信, 设计了一....
发表于 04-23 15:59 ? 20次 阅读
一种以增强型单片机为控制核心的嵌入式报警系统设计浅析

一种最新改进嵌入Linux实时性的新型方案

RTAI是基于普通Linux内核,相对于嵌入式应用其内核过于庞大;而uClinux本身并没有更多地关....
发表于 04-23 15:23 ? 10次 阅读
一种最新改进嵌入Linux实时性的新型方案

基于嵌入式Linux的智能手机系统设计

以MotorolaMX1作为中央处理器、Wavecom公司的Q2403A作为无线收发模块、嵌入式Li....
发表于 04-23 15:20 ? 9次 阅读
基于嵌入式Linux的智能手机系统设计

你知道嵌入式linux系统下简单守护进程(daemon)的编写?

嵌入式linux设备中创建一个守护进程,用于保护系统中的主进程,防止某些不可预期的意外导致主进程异常....
发表于 04-23 15:16 ? 8次 阅读
你知道嵌入式linux系统下简单守护进程(daemon)的编写?

基于嵌入式Linux的PMP系统设计与实现

便 携式多媒体播放器(PMP),也就是通常人们所说的MP4,已成为继MP3以后消费类产品的一个新热点....
发表于 04-23 15:13 ? 5次 阅读
基于嵌入式Linux的PMP系统设计与实现

最新的嵌入式系统及系统级可编程产品

随着计算与通信的融合、计算的无处不在和多媒体信息随手可得的世界信息化发展大趋势的日益明朗,嵌入式系统....
发表于 04-23 15:12 ? 4次 阅读
最新的嵌入式系统及系统级可编程产品

你需要了解的嵌入式Linux平台的多协议路由器的设计

多协议路由器作为骨干网的一个节点,运行一定的Ad Hoc网络路由协议,实现骨干网络由寻址的功能。
发表于 04-23 15:08 ? 7次 阅读
你需要了解的嵌入式Linux平台的多协议路由器的设计

AMD正式发布锐龙R1000系列嵌入式处理器

近日,AMD正式发布了锐龙R1000系列嵌入式处理器,和此前推出的锐龙V1000系列一样,都是基于Z....
发表于 04-23 15:00 ? 28次 阅读
AMD正式发布锐龙R1000系列嵌入式处理器

嵌入式Linux在Blackfin处理器上的应用

BF533包括一个UART口、一个SPI口、两个串行口(SPORTs)、四个通用定时器(其中三个具有....
发表于 04-23 14:51 ? 7次 阅读
嵌入式Linux在Blackfin处理器上的应用

应该要知道如何选择嵌入式处理器及其电源管理的解决方案

在任何嵌入式控制应用中,所有数据处理的核心部件是微控制器、微处理器或FPGA。
发表于 04-23 14:27 ? 9次 阅读
应该要知道如何选择嵌入式处理器及其电源管理的解决方案

高质量嵌入式系统开发的集成测试娱乐城白菜论坛

软件故障是指程序中的错误指令或计算,软件故障的执行将导致软件状态出错。当错误传到输出,并作为一个异常....
发表于 04-23 13:52 ? 13次 阅读
高质量嵌入式系统开发的集成测试娱乐城白菜论坛

中断的代码片段: [C] 纯文本查看 复制代码 GPIO_ResetBits(KEYBOARD_ROW_PORT, KEYBOARD_RO...
发表于 04-23 06:36 ? 8次 阅读

小弟最近在移植完了ucGUI,出现一个奇怪的问题,求大神解答啊! void ColorTest() { GUI_SetBkColor(GUI_BLU...
发表于 04-23 04:17 ? 7次 阅读

我在UCGUI中创建了一个下拉链表,我怎么能得到我选中链表中的值了?我要把选中的这个值发送到父窗口了??谢谢各位大侠...
发表于 04-23 03:56 ? 7次 阅读

面是我移植原子《扩展实验24 ATK-7' TFTLCD电容触摸屏模块测试实验》这个工程的ucgui,现在UCGUI可以显示,但是有...
发表于 04-22 22:39 ? 8次 阅读

请问各位,批量生产嵌入式终端设备:比如烟感报警器的过程是怎么样的? 本人小白,想请教一下,量产设备需要经过哪几个过程才...
发表于 04-22 17:17 ? 123次 阅读

RFID安检系统的嵌入式Linux

实现了RFID安检系统基于嵌入式Linux下的串口通信以及数据库的应用。最后通过实验证明并确定了其在....
发表于 04-22 16:19 ? 8次 阅读
RFID安检系统的嵌入式Linux

嵌入式Linux平台的GPS数据采集

随着GPS(全球定位系统)和便携移动设备的飞速发展,各种各样以GPS为基础的便携式定位系统相继出现.....
发表于 04-22 16:17 ? 39次 阅读
嵌入式Linux平台的GPS数据采集

基于嵌入式的无线传感心电信息监测系统设计

随着当前信息娱乐城白菜论坛和医疗水平的不断发展以及人们生活水平的不断提高,越来越多的人们对个人及家庭的健康护理....
发表于 04-22 08:47 ? 89次 阅读
基于嵌入式的无线传感心电信息监测系统设计

。。。。。。。。。。。。。。上面是一个回调函数          EDIT_SetDecMode(WM_Get...
发表于 04-22 06:36 ? 14次 阅读

最近想学ucgui做界面显示,发现按照网友们的步骤一步步的移植之后,出现黑屏问题,后来发现是原子哥tftlcd例程里面的LCD_Dra...
发表于 04-22 05:43 ? 15次 阅读

我用ucGUI建的滑动条,滑动条上面有一个个的小刻线,代表格数的。但是那个小刻线都是在上面的。我怎么弄才可以让刻线在滑动条...
发表于 04-22 04:27 ? 12次 阅读

AMD推出新款锐龙嵌入式R1000片上系统 进一步壮大其嵌入式产品家族

2019年4月16日,在台湾嵌入式论坛上,AMD(纳斯达克:AMD))宣布进一步壮大其锐龙嵌入式产品....
发表于 04-19 15:31 ? 165次 阅读
AMD推出新款锐龙嵌入式R1000片上系统 进一步壮大其嵌入式产品家族

円星科技将在台积电28奈米嵌入式闪存制程娱乐城白菜论坛开发SRAM Compiler IP

台湾新竹 - 2019年4月17日 -全球精品硅智财开发商円星科技(M31 Technology,台....
发表于 04-19 15:26 ? 59次 阅读
円星科技将在台积电28奈米嵌入式闪存制程娱乐城白菜论坛开发SRAM Compiler IP

更多学习资料在群 :嵌入式物联网群:922387798 python人工智能群:399932895 ...
发表于 04-19 14:57 ? 352次 阅读

发表于 04-19 14:54 ? 278次 阅读

详解Melexis嵌入式电机驱动器IC产品系列

基于Melexis高度集成的设计理念,将无刷直流电动机和直流电动机操作所必备的功能模块全部整合到单一....
发表于 04-18 12:31 ? 115次 阅读
详解Melexis嵌入式电机驱动器IC产品系列

IT8511高度集成的嵌入式控制器的用户手册免费下载

IT8511是一款高度集成的嵌入式控制器,具有适合移动系统应用的系统功能。IT8511直接连接到LP....
发表于 04-18 08:00 ? 33次 阅读
IT8511高度集成的嵌入式控制器的用户手册免费下载

AMD锐龙嵌入式R1000 SoC为嵌入式行业带来了全新性能标杆

2019年4月16日,在台湾嵌入式论坛上,AMD(纳斯达克:AMD))宣布进一步壮大其锐龙嵌入式产品....
发表于 04-17 16:15 ? 120次 阅读
AMD锐龙嵌入式R1000 SoC为嵌入式行业带来了全新性能标杆

嵌入式卧龙荣信传动PLM项目分享

关键词:湃睿科技 , PLM 项目背景 卧龙电气集团辽宁荣信电气传动有限公司(简称卧龙荣信传动)是卧....
发表于 04-17 14:38 ? 63次 阅读
嵌入式卧龙荣信传动PLM项目分享

SPB嵌入式音频处理系统设计

FPGA(Field Programmable Gate Array)现场可编程门阵列,是在PAL,....
发表于 04-17 14:25 ? 47次 阅读
SPB嵌入式音频处理系统设计

嵌入式开发PCB过孔全介绍

过孔(via)是多层PCB的重要组成部分之一,钻孔的费用通常占PCB制板费用的30%到40%.简单的....
发表于 04-17 14:23 ? 65次 阅读
嵌入式开发PCB过孔全介绍

以太网接口的设计嵌入式系统是关键

目前,以太网(Ethernet)协议已经非常广泛地应用于各种计算机网络,如办公局域网、工业控制网络、....
发表于 04-17 14:21 ? 55次 阅读
以太网接口的设计嵌入式系统是关键

嵌入式智能家居系统的设计与实现

想象一下:在酷热的夏天或寒冷的严冬,当您工作一整天后带着疲惫的身躯在回家的路上时,空调已经开启并调节....
发表于 04-17 14:18 ? 88次 阅读
嵌入式智能家居系统的设计与实现

嵌入式税控POS系统中AT91RM9200有重要作用

据赛迪顾问统计,全国将有300~500万台的市场装机总容量及相关税务接口软硬件、配套设备、服务和培训....
发表于 04-17 14:15 ? 72次 阅读
嵌入式税控POS系统中AT91RM9200有重要作用

LPC213X通过μC/OS-II的多种移植方案

C/OS-II是可移植、适用于对安全性要求苛刻的剥夺型实时多任务嵌入式系统,简单易学,在工程应用和嵌....
发表于 04-17 14:11 ? 17次 阅读
LPC213X通过μC/OS-II的多种移植方案

将模拟组件与Arm微控制器内核进行集成解决嵌入式系统问题

高性能模拟组件(放大器,ADC,DAC,电压基准,温度传感器)的智能集成,无线收发器等)和ARM的3....
的头像 电子设计 发表于 04-17 08:26 ? 511次 阅读
将模拟组件与Arm微控制器内核进行集成解决嵌入式系统问题

嵌入式设计须知: MCU如何在扩展的SDRAM上运行程序?

在使用MCU的嵌入式系统设计中,当程序或者数据内存占用太大而无法放入片上闪存或SRAM时,开发者通常....
的头像 嵌入式资讯精选 发表于 04-16 11:14 ? 376次 阅读
嵌入式设计须知: MCU如何在扩展的SDRAM上运行程序?

基于ARM的FPGA嵌入式系统实现

嵌入式微处理器S3C44BOX内置ARM7TDMI核,集成了丰富的外围功能模块,内部8 kB Cac....
发表于 04-13 10:36 ? 122次 阅读
基于ARM的FPGA嵌入式系统实现

2019 STM32峰会:汇聚解决中国新挑战的所有AI解决方案

人工智能对于今年的STM32峰会来说具有特殊的意义
的头像 STM32单片机 发表于 04-12 17:03 ? 543次 阅读
2019 STM32峰会:汇聚解决中国新挑战的所有AI解决方案

一种基于嵌入式的USB读写器设计

随着USB娱乐城白菜论坛和闪存娱乐城白菜论坛的飞速发展,移动存储设备的速度和容量日新月异,但在工业控制的上位机和下位机之....
发表于 04-12 16:57 ? 173次 阅读
一种基于嵌入式的USB读写器设计

LTC3643稳压器实现汽车和工业应用中的数据备份

在嵌入式系统依赖持续供电的电信、工业和汽车应用中,数据丢失是引人关切的。供电的突然中断会导致现在对硬....
的头像 电子设计 发表于 04-12 08:20 ? 255次 阅读
LTC3643稳压器实现汽车和工业应用中的数据备份

嵌入式软件工程师一般都在开发什么

在嵌入式这个行业,只要工作了几年的同仁。他们通常在跳槽面试下一家企业的时候简历都写的高大上,十个里面....
的头像 工程师人生 发表于 04-10 15:22 ? 317次 阅读
嵌入式软件工程师一般都在开发什么

嵌入式软件工程师待遇怎么样 当前企业需要哪些娱乐城白菜论坛

想要了解嵌入式软件开发工程师待遇怎么样,那就先来看一下嵌入式软件工程师发展趋势怎么样,据市场分析,现....
的头像 工程师人生 发表于 04-10 14:57 ? 323次 阅读
嵌入式软件工程师待遇怎么样 当前企业需要哪些娱乐城白菜论坛

基于嵌入式的煤矿安全生产集中监控系统设计

煤炭、石油等化石能源是我国能源供应的主体,特别是煤炭在保障我国能源安全中,起着基础性作用。在我国目前....
发表于 04-10 08:44 ? 298次 阅读
基于嵌入式的煤矿安全生产集中监控系统设计

Aitech防务系统公司提供用于人工智能(AI)的小型嵌入式计算系统

Aitech防务系统公司正在与Concurrent Real-Time公司合作,将RedHawk L....
的头像 新光电 发表于 04-09 14:36 ? 395次 阅读
Aitech防务系统公司提供用于人工智能(AI)的小型嵌入式计算系统

蓝牙编码格式简介

以下当前较为常用的几种蓝牙音频传输格式和支持厂商。下面按照编码的码率由低到高列举。
的头像 发烧友学院 发表于 04-09 14:22 ? 269次 阅读
蓝牙编码格式简介

MSU公布了2018视频编码压缩报告的补充部分

在该免费版报告中并未说明使用x265的哪个速度档用作对比。此报告作为“2018MSU编码报告”的补充....
的头像 LiveVideoStack 发表于 04-08 17:21 ? 526次 阅读
MSU公布了2018视频编码压缩报告的补充部分

几种常用的经常出现于现有嵌入式应用中的内存映射I/O方法概述

Linux 暴风雨般占领了嵌入式系统市场。分析家指出,大约有1/3到1/2的32/64位新的嵌入式系....
发表于 04-08 08:52 ? 86次 阅读
几种常用的经常出现于现有嵌入式应用中的内存映射I/O方法概述

基于DSP的实时嵌入式数字处理系统设计剖析

弹载信息处理系统是一种实时嵌入式数字处理系统,用于对弹载导引系统接收信号进行分析处理,实现对目标信号....
发表于 04-08 08:44 ? 268次 阅读
基于DSP的实时嵌入式数字处理系统设计剖析

嵌入式存储市场增长 物联网安全是嵌入式存储的新挑战

今天以人工智能、3D打印、生物科技、机器人、无人驾驶、纳米科技、量子计算和物联网等为特征的第四次智能....
发表于 04-05 17:22 ? 586次 阅读
嵌入式存储市场增长 物联网安全是嵌入式存储的新挑战

几种有代表性的嵌入式Linux浅析

由于 Linux 所具备的开源、稳定、高效、易裁剪、硬件支持广泛等优点,使得它在嵌入式系统领域最近十....
发表于 04-05 14:58 ? 297次 阅读
几种有代表性的嵌入式Linux浅析

应用密码学的资料概述

本文档的主要内容详细介绍的是应用密码学的资料概述包括了:1.密码的由来,2.密码娱乐城白菜论坛发展简介,3.密....
发表于 04-04 08:00 ? 37次 阅读
应用密码学的资料概述

嵌入式C语言编程与Microchip PIC电子书免费下载

本书全面系统地介绍了C语言编程娱乐城白菜论坛及其在嵌入式微控制器中的应用,其中包括嵌入式C语言、PIC微控制器....
发表于 04-04 08:00 ? 83次 阅读
嵌入式C语言编程与Microchip PIC电子书免费下载

e络盟携带一系列智能解决方案亮相2019年慕尼黑上海电子展!

除此之外,随着AI成为未来的发展热点,e络盟还建立了AI娱乐城白菜论坛资源中心,覆盖各种话题,包括AI基本释义....
的头像 嵌入式资讯精选 发表于 04-03 13:50 ? 762次 阅读
e络盟携带一系列智能解决方案亮相2019年慕尼黑上海电子展!

关于嵌入式Linux中进程调度的内容浅析

处理机(CPU)是整个计算机系统的核心资源,在多进程的操作系统中,进程数往往多于处理机数,这将导致各....
发表于 04-03 09:02 ? 92次 阅读
关于嵌入式Linux中进程调度的内容浅析

如何提高开源嵌入式处理应用程序的性能

通常理解的“开源”定义是指任何带有源代码的项目,可供其他程序员使用。开源软件通常在软件程序员社区内协....
的头像 电子设计 发表于 04-03 08:34 ? 310次 阅读
如何提高开源嵌入式处理应用程序的性能

蓝桥杯模拟升降控制器和模拟液位检测告警系统的嵌入式程序免费下载

本文档的主要内容详细介绍的是蓝桥杯模拟升降控制器和模拟液位检测告警系统的嵌入式程序免费下载。
发表于 04-03 08:00 ? 37次 阅读
蓝桥杯模拟升降控制器和模拟液位检测告警系统的嵌入式程序免费下载

关于嵌入式Linux系统中的BSP浅析

嵌入式系统由硬件环境、嵌入式操作系统和应用程序组成,硬件环境是操作系统和应用程序运行的硬件平台,它随....
发表于 04-02 14:42 ? 117次 阅读
关于嵌入式Linux系统中的BSP浅析

linux文件系统中的虚拟文件系统设计详解

Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文....
发表于 04-02 14:37 ? 94次 阅读
linux文件系统中的虚拟文件系统设计详解