OSAL里时间片计数值(从ll_McuPrecisionCount()返回的那个)以中断方式自加还是硬件加?
期待大神提供具体信息,或参考资料,谢谢。
image,
OSAL的timer用的是从ll_McuPrecisionCount() 返回的那个,硬件上用的是timer2.
是不是timer2每625us中断一次,在ISR中自增变量的值(经由ll_McuPrecisionCount()返回的那个),还是别的什么方式?
嗨Yan,我有个问题就是,如果ll_McuPrecisionCount函数返回的值是赋值给tmp,然后ticks625us = tmp - previousLLTimerTick;计算这次调用和上次调用之间流逝了多少个625us的节拍;这里我有个问题是:previousLLTimerTick保存的是上次调用ll_McuPrecisionCount函数的节拍数,因为previousLLTimerTick是uint16的,有没有这样一种溢出的可能,previousLLTimerTick = 65534,下一次调用后,ticks625us = tmp - previousLLTimerTick;这个语句,你要为正数,那必须tmp > previousLLTimerTick; 因为uint16位的限制。tmp在怎么也不能比65535大的了,那么tmp可能跳转tmp = 200或者250;那么ticks625us就为负数了。这明显和实际不符啊,不能说时间停滞了吧!所以有这样一种一问题。
我不知道我这种理解是否正确,因为这样溢出是可能的。
谢谢Yan大神回答。 CQ_JIMI
TI封装了Timer2的部分,具体怎么实现不清楚,OSAL里面用的是查询的方法
首先回复下自己上面问的那个问题,是我对无符号整数的理解不彻底导致的,所以昨天我彻查了相关知识写成了一篇博文以飨读者。45338061,现在能理解了对两个正数之间的差其实求得是她们相隔的距离。所以比如三个无符号16整形,A =200 B=65535,那么C = A-B = 201;不知道这样理解对不对。Yan大神。
但是今天有新问题啦。就是在这段代码中
while ( ticks625us > MAXCALCTICKS ) //主要为了数据过大转换为ms是溢出了。MAXCALCTICKS >13105就会溢出从0开始 { ticks625us -= MAXCALCTICKS; elapsedMSec += MAXCALCTICKS * 5 / 8; //MAXCALCTICKS =13105个节拍转换为ms是8190ms remUsTicks += MAXCALCTICKS * 5 % 8; //余数为5,时间0.625ms } // update converted number with remaining ticks from loop and the // accumulated remainder from loop 把余数加进去,组合成剩余的滴答数*5 tmp = (ticks625us * 5) + remUsTicks;//这里限制了必须使得((ticks625us *5) + 7 < = 65535)
其中MAXCALCTICKS的定义是这样的
// (MAXCALCTICKS * 5) + (max remainder) must be <= (uint16 max), // so: (13105 * 5) + 7 <= 65535 #define MAXCALCTICKS ((uint16)(13105))
7他说是可能的最大余数,但是你没看到上面while循环吗,如果while循环执行两次那么remUsTicks就>10了,因为他还存有上次留下来的余数。
嗨咯, Yan大美女啊。。回复下撒。。By JQ_JIMI