嵌入式c语言编程知识总结

上传人:郭** 文档编号:117137670 上传时间:2019-11-18 格式:DOC 页数:9 大小:125.63KB
返回 下载 相关 举报
嵌入式c语言编程知识总结_第1页
第1页 / 共9页
嵌入式c语言编程知识总结_第2页
第2页 / 共9页
嵌入式c语言编程知识总结_第3页
第3页 / 共9页
嵌入式c语言编程知识总结_第4页
第4页 / 共9页
嵌入式c语言编程知识总结_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《嵌入式c语言编程知识总结》由会员分享,可在线阅读,更多相关《嵌入式c语言编程知识总结(9页珍藏版)》请在金锄头文库上搜索。

1、嵌入式C语言编程知识总结 嵌入式C语言是作为嵌入式Linux开发的基础语言也是学习嵌入式的必备语言下面是小编分享的嵌入式C语言编程知识总结一起来看一下吧 1.流水线被指令填满时才能发挥最大效能即每时钟周期完成一条指令的执行(仅指单周期指令)如果程序发生跳转流水线会被清空这将需要几个时钟才能使流水线再次填满因此尽量少的使用跳转指令可以提高程序执行效率解决发案就是尽量使用指令的“条件执行”功能 2.在LPC2200系列中: 可以通过过下面的程序延迟10毫秒: for(i=0;i200;i+) for(j=0;j8; /IP数据报总长度低字节 IpHeadUint811=IpHead.eip.Crc

2、0x00ff; 4.在对全部数组元素赋初值时可以不指定数组长度 eg;inta=1,2,3,4,5; 但如果当输出第a5以上的元素时系统回输出随机数值所以使用此方法时不能使用超过初始值元素以上的元素 5.由于ADS先天性的对printf不支持;因此不便于我们调试可以利用串口输出来代替printf来调试 6.用或运算可使某位置为1其它位不变 eg:PINSEL0|=0x00000005;/设置串口引脚 使第0位和第二位置一其他位不变 7.函数指针 1C语言中函数名直接对应于函数生成的指令代码在内存中的地址因此函数名可以直接赋给指向函数的指针 2调用函数实际上等同于“调用指令+参数传递处理+回归位

3、置入栈”本质上最核心的操作是将函数生成的目标代码的首地址赋给CPU的PC寄存器 3因为函数调用的本质是跳转到某一个地址单元的code去执行所以可以“调用一个根本就不存在在函数实体 4int(*p)();定义p是一个指向函数的指针变量次函数返回带回整型的返回值*P两侧的括号不能省略表示p先于*结合是指针变量然后再与后面的()结合表示此指针指向函数 区别:int*p()表示这个函数的返回值是指向整型变量的指针 说明: (1)指向函数的指针变量的一般定义形式为: 数据类型(*指针变量名)(); 1此处的“数据类型”是指函数返回值的类型 (2)返回指针值的函数: 类型名*函数名(参数表) eg:int

4、*func(intx,inty) func是函数名调用它以后能返回一个指向整型数据的指针x,y是func的形参 区别方法: a.从右往左找第一个括号括号里面的是函数的形参 b.括号外面的第一个标识符是函数的名字函数前面的表示函数的返回数值 8.数组指针 1int(*p)4 表示*p有4个元素每个元素为整型也就是p所指的对象有4个整型元素的数组既P是行指针 2指针数组 一个数组其元素均为指针类型数据称为指针数组;即指针数组中的每一个元素都相当于一个指针变量 一维指针数组的定义形式为: 类型名*数组名数组长度 eg:int*p4: 作用:它用于指向若干个字符串使字符串处理更加方便灵活适用于一个二维

5、字符串数组其中每一行的字符数组的长度各不相同 eg:char*name=“Followme”,”BASIC”,”GreatWall”; 9.结构体 1可以用结构体变量做实参但是用结构体变量作实参时采取的是“值传递”的方式将结构体变量所占的内存单元的内容全部顺序递给形参形参也必须是同类型的结构体变量 eg:pint(su);/注在此处su为结构体 注:这种传递方式在空间和时间上开销较大如果结构体的规模较大时开销是很可观的 2用直向结构体变量(或数组)的指针作实参将结构体变量(或数组)的地址传给形参 eg:print(su);/注在此处su为结构体 10.共用体 1共用体把几种不同数据类型的变量存

6、放在同一块内存里公用体中的变量共享同一块内存 2定义公用体类型变量的一般形式为: union共用体名 成员列表; 变量列表; 3在共用体中同一块内存可以用来存放几种不同类型的数据但在某一时刻只能在其中存放一个成员变量共用体变量中起作用的成员是最后一次存入的数据 eg:uniondata inti; charc; doubled; ; uniondataa; 共用体变量a中的成员i,c,d三个变量在内存中从同一个地址开始存储如进行如下赋值: a.i=100; a.c=A; 那么此时共用体变量a中的成员i已经没有值了因为存储该值的内存现在已经被用来存储成员c的值了 3共用体变量的长度取决于其成员的

7、最大长度: 说明: 结构体变量所占内存的长度是各个成员的总和每个成员分别占有自己的存储空间共用体变量所占内存的长度是其最长成员的长度当然编译器出于提高访问效率的目的在编译分配存储空间时往往要进行对齐操作 对齐操作以最大基本类型为准即以最大基本类型为基本单元若按实际算下的长度不是基本单元的整数倍则其实际长度应该是基本单元的整数倍 (在TurboC中不进行对齐在Linux中进行对齐) 11.CPU字长与存储器位宽不一致处理 例如:使用共用体来解决这一冲突: unionsendtemp uint16words; uint8bytes2; sendbuff; eg:sendbuff.bytes0=a;

8、/此处a是8位 sendbuff.bytes1=b;/此处b是8位; 此时就将8位字拼成了16位字存储了 发送时send(sendbuff.words)就可以每次发送一个16位的数据了 12.C语言符号优先级: 1复合赋值运算符号: a+=3*5; 等价于a=a+(3*5); 13.一个常见的调试策略是把一些printf函数的调用散布于程序中确定错误出现的具体位置但是这些函数调用的输出结果被写入到缓冲区中并不立即显示于屏幕上事实上如果程序失败缓冲输去可能不会被实际写入因此得到的错误位置就是错误的解决的方法是在每个用于调试的printf函数之后立即调用fflush函数即可得到 printf(“s

9、omethingorother”); fflush(stdout); 14.关键字volatile的用法 volatile变量可能用于如下几种情况: 1设备的硬件寄存器(如:状态寄存器) 2一个中断服务子程序中会访问到的全局变量 3多线程应用中被几个任务共享的变量 15.关键字register的用法: 当对一个变量频繁被读写时需要反复访问内存从而花费大量的存取时间为此C语言提供了一种变量即寄存器变量这种变量存放在CPU的寄存器中使用时不需要访问内存而直接从寄存器中读写从而提高效率寄存器变量的说明符是register对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量而循环

10、计数是应用寄存器变量的最好候选者 (1)只有局部自动变量和形参才可以定义为寄存器变量因为寄存器变量属于动态存储方式凡需要采用静态存储方式的量都不能定义为寄存器变量包括:模块间全局变量、模块内全局变量、局部static变量; (2)register是一个建议型关键字意指程序建议该变量放在寄存器中但最终该变量可能因为条件不满足并未成为寄存器变量而是被放在了存储器中但编译器中并不报错(在C+语言中有另一个建议型关键字:inline) 16.对于程序代码已经被烧录在FLASH或ROM中我们可以让CPU直接从其中读取代码执行但通常这不是一个好办法我们最好在系统启动后将FLASH或ROM中的目标代码拷贝入RAM中后再执行以提高取指令速度; CPU对各种存储器的访问速度基本上是: CPU内部RAM外部同步RAM外部异步RAMFLASH/ROM 17.宏定义 在C语言中宏是产生内嵌代码的唯一方法对于嵌入式系统而言为了能达到性能要求宏是一种很好的代替函数的方法 1宏定义“像”函数; 2宏定义不是函数因而需要括上所有“参数”; 3宏定义可能产生副作用因而不要给宏定义传入有副作用的参数

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作范文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号