嵌入式C语言编程小知识
1.流水线被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅指单周期指令)。如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线再次填满。因此,尽量少的使用跳转指令可以提高程序执行效率,解决发案就是尽量使用指令的“条件执行”功能。
2.在LPC2200系列中:
可以通过过下面的程序延迟10毫秒:
for(i=0;i<200;i++)
{
for(j=0;j<200;j++);
}
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>在共用体中同一块内存可以用来存放几种不同类型的数据,但在某一时刻只能在其中存放一个成员变量。共用体变量中起作用的成员是最后一次存入的数据。
eg: union data
{
int i;
char c;
double d;
};
union data a;
共用体变量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[0]=b;//此处 b 是8位;
此时就将8位字拼成了16位字存储了。
发送时send(send_buff.words)就可以每次发送一个16位的数据了。
12. C语言符号优先级:
1>复合赋值运算符号:
a+=3*5;
等价于a=a+(3*5);
分享到:
相关推荐
1. 程序和编程语言 2. 自然语言和形式语言 3. 程序的调试 4. 第一个程序 2. 常量、变量和表达式 1. 继续Hello World 2. 常量 3. 变量 4. 赋值 5. 表达式 6. 字符类型与字符编码 3. 简单函数 1. 数学函数 2. 自定义...
这份思维导图文档涵盖了Linux嵌入式开发、C语言、Makefile、网络编程、驱动开发和系统移植等多个领域的知识,可以说是一个非常完整的学习框架。 这份文档将是一份非常有用的参考。其中,Linux嵌入式开发部分介绍了...
2.1.3 嵌入式linux c语言编程环境 34 2.2 嵌入式linux编辑器vi的使用 35 2.2.1 vi的基本模式 35 2.2.2 vi的基本操作 36 2.2.3 vi的使用实例分析 40 2.3 嵌入式linux编译器gcc的使用 41 2.3.1 gcc...
C语言是一种强大的编程语言,被广泛应用于系统软件开发、嵌入式系统编程、游戏开发等领域。本教程旨在提供对C语言基础知识的清晰理解,
嵌入式系统总结嵌入式系统基础知识,编程语言,高效工具等内容。主要内容技术文档与学习记录:嵌入式系统基础:机器学习:编程语言:环境搭建及工具:理论基础:本仓库将会长期更新嵌入式领域相关的知识,一部分内容...
C++几乎可以创建任何类型的程序:游戏、设备驱动程序、HPC、云、桌面、嵌入式和移动应用等。 甚至用于其他编程语言的库和编译器也使用C++编写。 C++拥有计算机运行的实用性特征,同时还致力于提高大规模程序的编程...
C语言应用的还有Windows方向,这个没什么好说的,C语言在Windows系统下,只能做 一些小东西,重要系统的核心还是在UNIX,这一点无不容置疑。 学习建议 当然选择C了。 在1995年之前,大部分程序员是做C的,30年过去了,...
作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...
知识要求: 竞赛对参赛者最基础的知识要求包括:电路、模拟电子技术、数字电子技术、微机原理 与接口技术、C语言编程(面向硬件)。 当然,仅仅由这些知识支撑还是不够的,竞赛还需要参赛者有较扎实的专业背景知识...
…………………………………………… 7 4.2汇编语言程序 ………………………………………… 12 第五章 总结与体会 ………………………………… 26 第六章 参考文献 …………………………………… 27 单片机——步进...