第七章 位运算与嵌入式编程
移位操作,置位,清零操作等
统计1出现的次数,可参照下面文章。
http://blog.csdn.net/fengzhizizhizizhizi/article/details/21404383
例子1:
列举并解释C++中四种运算符转化,说明他们的不同点
1、const_cast 操作符:即可以在特殊情况下,解除const成员函数的限制。
2、dynamic_cast操作符:用于判断运行时所指向对象的确切类型,可以将一个姐累的指针指向不同的子类(派生类),然后将被转型作为基础类的对象还原成原来的类,不过仅限于对象指针的类型转换。
3、reinterpret_cast操作符:将一个指针转换成其他类型的指针,可以是毫不相干,void* 到char *,int* 到float *。
4、static_cast操作符:在相关的对象和指针类型之间转换。有关类必须是通过继承构造函数或者是转换函数联系的,他能将数域较大的类型转换为较小类型。
/****************************理解不深,后面补上******************************/
例子2:如何访问特定位置内存。
int*ptr;
ptr=(int*)0x6719;
*ptr=0xaa55;
也可以:
*(int*)0x6719=0xaa55;
例子3:
__interruptdouble compute_area(double radius)
{
double area=PI*radius*radius;
printf("area =%f",area);
return area;
}
第一,不能有返回值;
第二,不能传递参数;
第三,很多编译器或处理器,浮点数是不可重入的,有些处理器或编译器需要使用额外的存储器入栈,有些编译器或处理器不允许在ISR中做浮点运算。此外,ISR应该是短而且有效率的,在ISR中做浮点数不好。
第四,printf()经常出现重复和性能上的问题。
volatile型变量,用时会重新读取该变量,而不是保存在寄存器中的备份。使用场景:
1、并行设备的硬件寄存器(如状态寄存器);
2、一个中断子程序中会访问到的非自动变量;
3、多线程应用中被几个任务共享的变量。
判断big endian littleendian
int checkCPU()
{
union w
{
int a;
char b;
}c;
c.a=1;
return(c.b==1);
}