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.
大家好!
我的客户遇到了 CLA 问题。 首先、CLA 正常运行。 在 CLA 任务中更改一段代码后、从
for (I=0;I<1;I++); //案例1
至
for (I=0;I<2;I++);//案例2
CLA 不再进入任务。 这只是一个空循环。 实际上、 程序 永远不会 到达这个循环、因为这个循环有"if"条件、而且这个条件总是为 false。 似乎这里唯一的区别是 代码稍大。
此外、如果编译优化被关闭、CLA 在这两种情况下都不会进入任务。
在第2种情况中、我可以看到 MIFR 位和 MIOVF 位在不断切换、但任务中具有增量运算符的变量没有增加。
CLA 任务由 ADC 以55kHz 的频率触发。 在第1种情况中、CLA 需要8us 才能完成任务。
有任何想法、可能是什么原因造成的?
谢谢。
挂起、
挂起、
我看不出更改 for 循环中变量的上限会如何阻止任务运行。 如果任务在情况1和情况2中配置相同、则应从 ADC 触发器开始。
这只是一个空循环。 实际上, 程序 永远不会 到达这个循环,因为有"if"条件包含这个循环,条件总是为 false。
您是说编译器优化了循环吗? 如果编译器确定外部"if"始终为 false、则可能会消除内部"for"、因为永远不会执行。
您如何确定任务未运行? 请尝试在任务中放置一个调试断点、然后查看任务是否暂停。
您好,Lori,ć
我确定任务没有基于以下几点运行:
1. 使用 MDEBUGSTOP 将断点添加到任务中。 在第1种情况中、CLA 在断点处停止。 在第2种情况中、CLA 不会停止。
2.在任务的第一行有一个递增变量,如"cnt++",每次任务执行时这个变量应增加1。 在第1种情况下、该值会增加、而在第2种情况下则不会增加。
您是否认为编译器优化了循环? I [/报价]这种情况不太可能发生。 将优化从0关闭后、即使在第1种情况下、任务也不会运行。 此外,我在案例1和案例2中检查了 CLA 程序的大小(进行了优化),案例2的代码大小比案例1略大数十个字节。 此空循环应保留在编译的代码中、以形成这两个差异。
基于上述两个事实、我认为在情况2中任务不会运行、但另一个事实是 MIFR 位和 MIOVF 位正在切换。 我的解释 是 CLA 已进入"任务"、但它实际上会跳 转到其他某个地址。 但当我 检查 MVECT 寄存器时、它们与第1种情况相同。
此致、
挂起。
您好、Lori:
我的客户找到了解决方案。 其 CLA 程序空间覆盖 RAMLS1-6和 RAMLS7的一部分、数据空间覆盖 LS7的其余部分。 在将程序空间限制为仅 RAMLS1-6后、CLA 会在第2种情况下正常进入任务。
谢谢。
挂起。