- 11
- 12月
经常要在一些芯片上实现一些随机数的算法。一般来说,有CRC模块的芯片,我们一般都使用CRC模块来产生随机数。如果没有的话,又想用一些比较简单的算法的话,就要考虑线性同余法了。
以下是一个比较简单的公式:
seed = (seed * 10807L) & 0x7fffffffL
经常要在一些芯片上实现一些随机数的算法。一般来说,有CRC模块的芯片,我们一般都使用CRC模块来产生随机数。如果没有的话,又想用一些比较简单的算法的话,就要考虑线性同余法了。
以下是一个比较简单的公式:
seed = (seed * 10807L) & 0x7fffffffL
在IAR中,编译器会根据函数情况对函数进行控制。但是有时,我们需要对某些函数进行强制内嵌或者强制不内嵌的操作。
如果需要对函数进行强制内嵌的操作,可以在函数上加上
#pragma inline=forced
来进行强制内嵌。
如果想函数不进行内嵌,则可加上
#pragma optimize=no_inline
来进行强制不内嵌。
以上程序对IAR720H有效。其它版本,需要根据相应的帮助来进行。
版本是IAR720H
使用了下面一断程序
#define YEAR_DAYS 365<br />
#define FOURYEAR_DAYS (YEAR_DAYS * 4 + 1)
猜猜FOURYEAR_DAYS值是多少?
按照Hanny最初的想法,结果应该是365 * 4 + 1 = 1461。
结果实际预处理的结果却是365 * (4 + 1) = 1825。
Hanny怀疑是宏嵌套的问题,于是又实验了
#define FOURYEAR_DAYS (365 * 4 + 1)
结果,还是1825。
看来,IAR的预处理在乘和加的优先级上,优先计算了加!
多加个括号就可以了。要注意啊!
这几天,有个同事问在GCC中,怎么给一段汇编的程序指令地址。
我就说先用.section定义一个段名,然后再在ld中进行定位。
结果,定义了一个段名后,dump出来的汇编程序中使用没有这段。
然后,才想起来,定义完段名后,还要定义段的属性。
.section test_sec, "ax"
主要就是为了告诉连接器这是一个需要分配空间的可执行的段。
特此记录,以免下一次忘记。
这几天,Hanny稍微用了一下MMA7660传感器,详细阅读了一下MMA7660的DataSheet,又借着机会与FreeScale的工程师交流了一下,在这里总结一下MMA7660传感器的使用心得。
MMA7660是一款重力传感器,主要用于检测X、Y、Z三个轴所受到的加速度大小。检测范围是-1.5g ~ 1.5g,其中,g为一个重力加速度。
由于MMA7660比较低端,因此也只有6BIT的精度,而且输出值上还会有3个刻度的误差,因此在值的输出上,必须经过一个软件的均值滤波处理。一般来说,如果传感器只是应用于方位检测的话,8个值的滤波就够了。而用于动作检测的话,一般使用32阶的均值滤波。
MMA7660有两种工作模式,一个为Auto-Sleep,即Running模式。在该模式下,传感器可以配置较高的采样率。另一个模式为Auto-Wakeup,即Sleep模式。值得注意的是,该模式并非真正的休眠模式,而只是低速采样模式。在该模式下,能够有效地降低芯片的运行功耗。
MMA7660内部还支持几种常见的中断。在这里值得一提的就是Tap中断了。由于Tap是一个短时间的脉冲,因此只有在最高采样速率下,即120Samples/S下,才能够有效地触发Tap中断。
在动作检测的过程中,尽量采用的是相对的坐标值,而不是绝对的坐标值。因为在生产过程中,并不能保证传感器的绝对水平。
MMA7660的采用IIC的接口。IIC接口这里就不详细介绍了。Hanny在这里要说的是:在读取XYZ坐标的时候,最好采用的就是Multiple Byte Read的方式,这样才能保证XYZ三个坐标是同一次采样的结果。如果分开读取,则有可能读取到不同组的采样数据。
最后,总体来说MMA7660还是一颗比较低端的芯片,如果有高端应用的话,可以考虑使用MMA8452。
附:MMA7660的datasheet