如果程序跳转,装配线将被清空,需要几个小时才能再次填充装配线。因此,尽可能少地使用跳转指令可以提高程序执行的效率,解决案件是使用指令的条件执行功能。
以下程序可延迟10毫秒:
for(i=0;i<200;i )
{
for(j=0;j<200;j );
}
//IP高字节数据报总长度
IpHeadUint8[10]=(IpHead.e_ip.Crc&0xff00)>>8;
//IP低字节的总长度
IpHeadUint8[11]=IpHead.e_ip.Crc&0x00ff;
eg;inta={1,2,3,4,5};
但如果是输出第a[5]当上述元素时,系统会回输出随机值,因此在使用此方法时,不能使用超过初始值的元素。
eg: PINSEL0 |= 0x00000005; //设置串口引脚
使第0位和第二位一,其他位置保持不变。
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.括号外的第一个标识符是函数的名称,函数前的表示函数的返回值。
1>int (*p)[4]
表示*p有四个元素,每个元素都是整形的。也就是说,P指的对象有四个整形元素的数组,即P指针。
2> 指针数组
? 指针数组中的每一个元素都相当于指针变量。
? 一维指针数组的定义形式如下:
类型名 *数组名[数组长度]
eg:int *p[4]:
功能:用于指向多个字符串,使字符串处理更加方便灵活。适用于二维字符串数组,每行字符串长度不同
eg:char * name={“Follow me”,”BASIC”,”GreatWall”};
1> 可以用结构体变量做实参。但是用结构体变量作实参时,采取的是“值传递”的方式,将结构体变量所占的内存单元的内容全部顺序递给形参。形参也必须是同类型的结构体变量。
eg:pint(su);//注在这里su为结构体
注:这种传输方式在空间和时间上花费较多,如果结构体规模较大,则花费相当大。
2> 将结构体变量(或数组)的地址传递给形参
eg:print(&su);//注在这里su为结构体
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中间对齐)
例如:用共用体来解决冲突:
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位数据。
1>复合赋值运算符号:
a =3*5;
等价于a=a (3*5);
然而,这些函数调用的输出结果被写入缓冲区,并没有立即显示在屏幕上。事实上,如果程序失败,缓冲输出可能不会被实际写入,所以错误的位置是错误的。解决方案是每个用于调试的方法printf立即调用函数fflush可以获得函数。
printf(“something or other”);
fflush(stdout);
volatile变量可用于以下情况:
1>设备的硬件寄存器(如状态寄存器)
2>在中断服务子程序中访问的全球变量
3>多线程应用中多个任务共享的变量。
经常读写变量时,需要反复访问内存,从而花费大量的访问时间。为此,C语言提供了寄存器变量的变量。存储这种变量CPU在寄存器中,不需要访问内存,而是直接从寄存器中读写,以提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量,而循环计数是应用寄存器变量的最好候选者。
(1) 只有局部自动变量和形状参数才能定义为寄存器变量。由于寄存器变量是一种动态存储模式,所有需要静态存储模式的数量都不能定义为寄存器变量,包括:模块之间的全局变量、模块中的全局变量和局部变量static变量;
(2) register是一个"建议"类型关键字是指程序建议将变量放在寄存器中,但由于条件不满足,最终变量可能不会成为寄存器变量,而是放在存储器中,但编译器没有报告错误(在C 另一种语言"建议"型关键字:inline)。
CPU对各种存储器的访问速度,基本上是:
CPU内部RAM > 外部同步RAM > 外部异步RAM > FLASH/ROM
在C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。
1>宏定义“像”函数;
2>宏定义不是函数,因而需要括上所有“参数”;
3>宏定义可能产生副作用。因而不要给宏定义传入有副作用的"参数"。
﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
免责声明:内容整理自网络,仅供学习交流,如涉及作品版权问题,请及时与我们联系,谢谢!
关于TVS二极管,你不能不知道的三大特性(干货)
盘点当今市面主流单片机,总有一款适合你!
很完整的LLC原理讲解,电源工程师收藏有用!
看完这篇文章,终于搞懂了ADC的原理及分类!
单片机实用工具大全,超级赞,工程师必备!

更多精彩添加发烧友小助手
加入“”交流,
THE END
1、加 为好友,进入
嵌入式软件|可编程逻辑|C语言|linux|单片机|LabVIEW|微机原理|RF/无线|PCB设计|IC设计|电源设计|模拟技术|机器人|测试测量|Java|AR/VR|前端开发|大数据|python|LabVIEW|STM32|FPGA|四轴算法|BLDC|PCB设计
2、加为好友,进入
深圳39591|北京26276|上海24794|广州15554|西安11854|成都10678|杭州10600|苏州10141|南京9735|武汉9204|东莞7960|天津6610|重庆6319|合肥5096|长沙4832|青岛4427|郑州4425|佛山4176|宁波3774|无锡3617|厦门3569|惠州2893