工具/软件:TI C/C++编译器
您好、再说一次、
在中断例程中使用对象时遇到问题、希望可以理解这个问题。
首先要做的事情。 我编写了2个计时器 ISR。 定时器1每 µs μ s 中断一次、并递增计数器、以便我可以监控 F28062复位后经过的微秒数。 Timer2每毫秒中断一次、并增加另一个计数器、以便我可以监控复位后经过的毫秒数。 (iKNOW I 可以从 µs 计算出毫秒、但计算需要很长时间)。
接下来、我有2个函数。 第一个是"micros()"和"millis()"。 正如您可以想象的那样、它们返回计数器的当前值、该值每 µs μ s 或 ms 递增一次。 两个变量无符号长整型。
那么、现在我使用一个实现2个类的仅标头库。 此库为"Microsoft <a href="">">github.com/.../elapsedMillis""> swies/github.com/pfeerick/elapsedMillis"。 它使用一些运算符过载并创建一个使用 millis()或 micros()来自动获取/递增的对象。
那么、这是正在工作的版本
unsigned char trigger = 0;
elapsedMicros DataTime = 0;
void main (void)
{
。
。
。
while (1)
{
if (触发)
{
触发=0;
DataTime = 0;
}
if (DataTime > 5000000)
{
//doSmomething
}
}
__interrupt void PIN_ISR (void)
{
触发= 1;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}
只要我 反复按下按钮来触发 PIN_ISR 并且//doSomething 分支将不会触发。 因为 DataTime 在主循环中被重置、所以它正在工作。但是当我在 ISR 中重置 DataTime 时、它将不起作用。
这是不起作用的代码。
elapsedMicros DataTime = 0;
void main (void)
{
.
。
。
while (1)
{
if (DataTime > 5000000)
{
//doSmomething
}
}
__interrupt void PIN_ISR (void)
{
DataTime = 0;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}
即使5秒内n`t 了 μ s、由于 DataTime 的值将n`t 为0、但数值非常高、因此非 wokring 代码将立即触发"//doSomething if branch"。
有人知道为什么会这样?
谢谢