我是新手编程一个ARM Cortex M MCU。在使用SysTick功能时,我遇到了这个功能来检查计时。然而,我没有得到第5行的代码。关于24位差的那个。为什么他们要在那一行上做一个按位运算?它应该做什么呢?
unsigned long Last; // 24-bit time at previous call (12.5ns)
unsigned long Elapsed; // 24-bit time between calls (12.5ns)
void Action(void){ // function under test
Now = NVIC_ST_CURRENT_R; // what time is it now?
Elapsed = (Last-Now)&0x00FFFFFF; // 24-bit difference
Last = Now; // set up for next...
}发布于 2020-07-17 23:17:31
计数器是24位的,但是当你读取它时,你会得到32位,因为C没有24位的变量(至少这个编译器没有)。
他们正在进行24位减法,通过32位减法,然后将额外的8位设置为0。
将额外的位设置为0很重要,因为在16777215 (所有位都设置为1)之后,计数器将重置为0(所有位都设置为0)。如果你只是减去它们,你会看到1 - 16777215是-16777214 (有符号的)或4278190082 (无符号的),但正确的答案是2个刻度发生在刻度16777215和刻度1之间。
发布于 2020-07-17 22:34:43
因为Last & Elapsed有24位(3字节)有意义的数据,但它们是32位(4字节),所以您需要将最高有效的8位置零。
... & 0x00ffffff可以做到这一点。
您还可以
typedef struct
{
uint32_t cnt:24;
}SYSTICK_cnt_t;
uint32_t GetElapsed(uint32_t Now, uint32_t Start)
{
SYSTICK_cnt_t t = {Now - Start};
return t.cnt;
}https://stackoverflow.com/questions/62956028
复制相似问题