This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TMS320F28062:在 Interrut 例程中使用对象会产生奇怪的行为

Guru**** 2583985 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/649514/compiler-tms320f28062-using-objects-in-interrut-routines-behave-strange

器件型号:TMS320F28062

工具/软件: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"。

有人知道为什么会这样?

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好

    DataTime 是否易失?

    此致
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对象不是易失性的、但在"elapsedMicros"类中保存当前微秒的变量是易失性的
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果可能、将对象设置为易失性、或者至少尝试创建自己的全局变量、该变量仅为32位易失性 int。 它似乎被多个访问破坏了。

    此致
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使对象变得易变,但它不起作用:/我稍后将尝试它,如果我有解决方案,我将在这里发布它,此时我在例程中设置一个标志,即发生中断并在主函数中处理 DataTime
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、很遗憾听到这个消息、但如果您找到了解决方案、一定要告诉我们!

    此致
    Chris