您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

17条嵌入式C语言编程小知识,需要知道

时间:2020-07-09 10:38:29  来源:  作者:

1. 流水线被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅指单周期指令)。如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线再次填满。因此,尽量少的使用跳转指令可以提高程序执行效率,解决方案就是尽量使用指令的“条件执行”功能。

2. 在LPC2200系列中:

可以通过过下面的程序延迟10毫秒:

17条嵌入式C语言编程小知识,需要知道

 

3. 通过下面语句将一个16位的变量放在两个8位的变量中。

//IP数据报总长度高字节

IpHeadUint8[10]=(IpHead.e_ip.Crc&0xff00)>>8;

//IP数据报总长度低字节

IpHeadUint8[11]=IpHead.e_ip.Crc&0x00ff;

4. 在对全部数组元素赋值时,可以不指定数组长度。

eg;inta={1,2,3,4,5};

但如果当输出第a[5]以上的元素时,系统会输出随机数值,所以使用此方法时,不能使用超过初始值元素以上的元素。

5. 由ADS先天性的对printf不支持;因此不便于我们调试,可以利用串口输出来代替printf来调试。

6. 用或运算,可使某位置为1,其它位不变

eg: PINSEL0 |= 0x00000005; //设置串口引脚

使第0位和第二位置一,其他位不变。

7. 函数指针

1> C语言中函数名直接对应于函数生成的指令代码在内存中的地址,因此函数名可以直接赋给指向函数的指针。

2> 调用函数实际上等同于“调用指令+参数传递处理+回归位置入栈”,本质上最核心的操作是将函数生成的目标代码的首地址赋给CPU的PC寄存器。

3> 因为函数调用的本质是跳转到某一个地址单元的code去执行,所以可以“调用一个根本就不存在在函数实体。

4> int (*p);定义p是一个指向函数的指针变量,次函数返回带回整型的返回值。*P两侧的括号不能省略,表示p先于*结合,是指针变量,然后再与后面的结合,表示此指针指向函数。

区别:int *p表示这个函数的返回值是指向整型变量的指针。

说明:

(1) 指向函数的指针变量的一般定义形式为:

数据类型 (*指针变量名);

1> 此处的“数据类型”是指函数返回值的类型

(2) 返回指针值的函数:

类型名 *函数名(参数表)

eg: int * func(int x,int y)

func是函数名,调用它以后能返回一个指向整型数据的指针。x,y是func的形参。

区别方法:

a.从右往左找第一个括号,括号里面的是函数的形参。

b.括号外面的第一个标识符是函数的名字,函数前面的表示函数的返回数值。

8. 数组指针

1>int (*p)[4]

表示*p有4个元素,每个元素为整型。也就是p所指的对象有4个整型元素的数组,既P是行指针。

2> 指针数组

Ø 一个数组,其元素均为指针类型数据,称为指针数组;即指针数组中的每一个元素都相当于一个指针变量。

Ø 一维指针数组的定义形式为:

类型名 *数组名[数组长度]

eg:int *p[4]:

作用:它用于指向若干个字符串,使字符串处理更加方便灵活。适用于一个二维字符串数组,其中每一行的字符数组的长度各不相同

eg:char * name={“Follow me”,”BASIC”,”GreatWall”};

9. 结构体

1> 可以用结构体变量做实参。但是用结构体变量作实参时,采取的是“值传递”的方式,将结构体变量所占的内存单元的内容全部顺序递给形参。形参也必须是同类型的结构体变量。

eg:pint(su);//注在此处su为结构体

注:这种传递方式在空间和时间上开销较大,如果结构体的规模较大时,开销是很可观的。

2> 用直向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参

eg:print(&su);//注在此处su为结构体

10. 共用体

1> 共用体把几种不同数据类型的变量存放在同一块内存里。公用体中的变量共享同一块内存。

2> 定义公用体类型变量的一般形式为:

union 共用体名

{

成员列表;

}变量列表;

3>在共用体中同一块内存可以用来存放几种不同类型的数据,但在某一时刻只能在其中存放一个成员变量。共用体变量中起作用的成员是最后一次存入的数据。

17条嵌入式C语言编程小知识,需要知道

 

共用体变量a中的成员i,c,d三个变量在内存中从同一个地址开始存储。如进行如下赋值:

a.i = 100;

a.c = ‘A’;

那么此时共用体变量a中的成员i已经没有值了,因为存储该值的内存现在已经被用来存储成员c的值了。

3> 共用体变量的长度取决于其成员的最大长度:

说明:

结构体变量所占内存的长度是各个成员的总和,每个成员分别占有自己的存储空间。共用体变量所占内存的长度是其最长成员的长度。当然,编译器出于提高访问效率的目的,在编译分配存储空间时往往要进行对齐操作。

对齐操作以最大基本类型为准。即以最大基本类型为基本单元。若按实际算下的长度不是基本单元的整数倍,则其实际长度应该是基本单元的整数倍。

(在TurboC中不进行对齐,在linux中进行对齐)

11. CPU字长与存储器位宽不一致处理

例如:使用共用体来解决这一冲突:

union send_temp{

uint16 words;

uint8 bytes[2];

}send_buff;

eg:send_buff.bytes[0]=a;//此处a 是8位

send_buff.bytes[1]=b;//此处 b 是8位;

此时就将8位字拼成了16位字存储了。

发送时send(send_buff.words)就可以每次发送一个16位的数据了。

12. C语言符号优先级:

1>复合赋值运算符号:

a+=3*5;

等价于a=a+(3*5);

13.一个常见的调试策略是把一些printf函数的调用散布于程序中,确定错误出现的具体位置。但是,这些函数调用的输出结果被写入到缓冲区中,并不立即显示于屏幕上。事实上,如果程序失败,缓冲输出可能不会被实际写入,因此得到的错误位置就是错误的。解决的方法是在每个用于调试的printf函数之后立即调用fflush函数即可得到。

17条嵌入式C语言编程小知识,需要知道

 

14.关键字volatile的用法

volatile变量可能用于如下几种情况:

1>设备的硬件寄存器(如:状态寄存器)

2>一个中断服务子程序中会访问到的全局变量

3>多线程应用中被几个任务共享的变量。

15.关键字register的用法:

当对一个变量频繁被读写时,需要反复访问内存,从而花费大量的存取时间。为此,C语言提供了一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量,而循环计数是应用寄存器变量的最好候选者。

(1) 只有局部自动变量和形参才可以定义为寄存器变量。因为寄存器变量属于动态存储方式,凡需要采用静态存储方式的量都不能定义为寄存器变量,包括:模块间全局变量、模块内全局变量、局部static变量;

(2) register是一个"建议"型关键字,意指程序建议该变量放在寄存器中,但最终该变量可能因为条件不满足并未成为寄存器变量,而是被放在了存储器中,但编译器中并不报错(在C++语言中有另一个"建议"型关键字:inline)。

16.对于程序代码,已经被烧录在FLASH或ROM中,我们可以让CPU直接从其中读取代码执行,但通常这不是一个好办法,我们最好在系统启动后将FLASH或ROM中的目标代码拷贝入RAM中后再执行以提高取指令速度。

CPU对各种存储器的访问速度,基本上是:

CPU内部RAM > 外部同步RAM > 外部异步RAM > FLASH/ROM

17. 宏定义

在C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。

1>宏定义“像”函数;

2>宏定义不是函数,因而需要括上所有“参数”;

3>宏定义可能产生副作用。因而不要给宏定义传入有副作用的"参数"。



Tags:C语言   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在go语言中使用viper之类的库很方便的处理yaml配置文件,但是在c语言中就比较麻烦,经过一番思索和借助强大的github,发现了一个libyaml c库,但是网上的例子都比较麻烦,而且比较繁...【详细内容】
2022-07-07  Tags: C语言  点击:(19)  评论:(0)  加入收藏
今天给大家分享一篇C语言编码规范,可以从源头上规避掉很多bug,希望能对大家有所帮助。 01 最重要的规则编写代码时最重要的一条规则是:检查周围的代码并尝试模仿它。 作为维护...【详细内容】
2022-07-04  Tags: C语言  点击:(22)  评论:(0)  加入收藏
什么编程语言最好?这是个能让各路程序员吵翻天的话题,每种语言都有自己的拥趸,全球现在找出三五十种编程语言都不是问题,热门的至少也有20种,先不说这些语言好用与否,它们的性能也...【详细内容】
2022-07-01  Tags: C语言  点击:(29)  评论:(0)  加入收藏
C语言中没有参数默认值的概念,但其实可以利用宏来模拟参数的默认值;我们之前介绍过可变参数宏与逗号运算符,将两者相结合的话可以定义出以下形式的宏:#define func(...) __fun...【详细内容】
2022-06-04  Tags: C语言  点击:(66)  评论:(0)  加入收藏
请大家看下面的题目,应该选择哪个答案呢?选择题 1首先,此类题目每年的考试都会出现,也就是说,标识符这个知识点非常重要。此类题目一般都是送分题 ,只要掌握了标识符的命名规则,这...【详细内容】
2022-05-20  Tags: C语言  点击:(74)  评论:(0)  加入收藏
C语言是在B语言的基础上发展起来的。 C的根源是ALGOL 60,1960年ALGOL 60是一种面向问题的高级语言,离硬件比较远,1963年的时候推出了CPL语言,CPL在ALGOL 60的基础上更接近硬件一...【详细内容】
2022-05-16  Tags: C语言  点击:(62)  评论:(0)  加入收藏
因为个人爱好,平时在家学习单片机开发,没事写写程序,不知道怎么地,突然就想用C模仿C++写程序,于是乎,弄了几个宏定义。。。首先,为了在样子上长得像,需要这样一个宏定义,如下: 光这样...【详细内容】
2022-05-12  Tags: C语言  点击:(60)  评论:(0)  加入收藏
冒泡排序是所有排序算法中最简单、最易实现的算法,有时也称为起泡排序算法。使用冒泡排序算法对 n 个数据进行排序,实现思路是:从待排序序列中找出一个最大值或最小值,这样的操...【详细内容】
2022-05-06  Tags: C语言  点击:(112)  评论:(0)  加入收藏
前言内存四区,分别是全局区(静态区),代码区,栈区,堆区.从内存分配来看,可以分为静态分配和动态分配.静态分配内存分配完成之后,不会释放,直到程序结束 静态区,分配之后,不会释...【详细内容】
2022-03-30  Tags: C语言  点击:(84)  评论:(0)  加入收藏
c语言必背专业英语词汇大全要想学好c语言,对于c语言方面的专业英语词汇的学习非常重要,那么现在就一起来学习一些必背的`c语言专业英语词汇吧,希望能够帮到大家!c语言专业英语...【详细内容】
2022-03-24  Tags: C语言  点击:(104)  评论:(0)  加入收藏
▌简易百科推荐
在go语言中使用viper之类的库很方便的处理yaml配置文件,但是在c语言中就比较麻烦,经过一番思索和借助强大的github,发现了一个libyaml c库,但是网上的例子都比较麻烦,而且比较繁...【详细内容】
2022-07-07  全栈搬砖家    Tags:yaml   点击:(19)  评论:(0)  加入收藏
目前数据的种类非常多,每种数据都支持sql语句,但是大家发现没有每种数据的SQL都有自己的语法特性,都是SQL语句都没有一个特定的语法标准,导致开发人员在开发的过程中无法任意选...【详细内容】
2022-07-05  海椰人    Tags:SQL语句   点击:(21)  评论:(0)  加入收藏
今天给大家分享一篇C语言编码规范,可以从源头上规避掉很多bug,希望能对大家有所帮助。 01 最重要的规则编写代码时最重要的一条规则是:检查周围的代码并尝试模仿它。 作为维护...【详细内容】
2022-07-04  嵌入式Linux    Tags:C语言   点击:(22)  评论:(0)  加入收藏
什么编程语言最好?这是个能让各路程序员吵翻天的话题,每种语言都有自己的拥趸,全球现在找出三五十种编程语言都不是问题,热门的至少也有20种,先不说这些语言好用与否,它们的性能也...【详细内容】
2022-07-01  HAIFEIX    Tags:编程语言   点击:(29)  评论:(0)  加入收藏
描述使用C#.Net开发的Windows远程控制管理系统SiMay,底层基于IOCP的异步通信模型,实时监控海量客户端,目前功能已实现:逐行扫描远程桌面协助、经典的文件管理、实时远程语音、实...【详细内容】
2022-06-30  IT微部落    Tags:C#   点击:(36)  评论:(0)  加入收藏
1.如何远程调试服务器的windows 服务-远程调试 远程服务调试前提:要确保你的代码和服务在同一个域下才可以 1)首先要在你vs的根目录下找到 Remote Debugger 文件夹,复制到带有...【详细内容】
2022-06-16  中年农码工    Tags:C#   点击:(57)  评论:(0)  加入收藏
描述一款高性能敏感词(非法词/脏字)检测过滤组件,附带繁体简体互换,支持全角半角互换,汉字转拼音,模糊搜索等功能。同时支持多种语言,C#、golang、java、javascript、python参数...【详细内容】
2022-06-14  IT微部落    Tags:C#   点击:(51)  评论:(0)  加入收藏
讲故事前几天看公司一个新项目使用了FluentValidation,大家都知道FluentValidation是一个非常强大的用于构建强类型验证规则的 .NET 框架,帮程序员解决了繁琐的校验问题,用起来...【详细内容】
2022-06-08  黑哥聊dotNet    Tags:FluentValidation   点击:(53)  评论:(0)  加入收藏
C语言中没有参数默认值的概念,但其实可以利用宏来模拟参数的默认值;我们之前介绍过可变参数宏与逗号运算符,将两者相结合的话可以定义出以下形式的宏:#define func(...) __fun...【详细内容】
2022-06-04  嵌入式ICU    Tags:C语言   点击:(66)  评论:(0)  加入收藏
请大家看下面的题目,应该选择哪个答案呢?选择题 1首先,此类题目每年的考试都会出现,也就是说,标识符这个知识点非常重要。此类题目一般都是送分题 ,只要掌握了标识符的命名规则,这...【详细内容】
2022-05-20  正直的苏离    Tags:标识符   点击:(74)  评论:(0)  加入收藏
站内最新
站内热门
站内头条