【发布时间】:2015-03-10 16:54:08
【问题描述】:
我正在使用 Texas Intruments 的 LCDK C6748 与 Code Composer Studio 和 TMDSEMU100V2U-14T - XDS100v2 USB JTAG Emulator。
LCDK 带有一堆支持函数,包括一个初始化板的函数并定义每个中断调用哪些回调函数。
我刚刚实现了回调函数,所以每当新样本来自 ADC 时,它都会执行一些操作。
我尝试在中断内设置断点,但在运行时程序“流程”没有到达那里。
此外,我做了一些更简单的事情:
volatile int flag = 0;
interrupt void interrupt4(void) // interrupt service routine
{
flag = 1;
return;
}
int main(){
// board initializing function, defining sampling rate etc.
L138_initialise_intr(FS_48000_HZ,ADC_GAIN_0DB,DAC_ATTEN_0DB);
while(1){
if (flag == 1){
printf("interrupt entered");
flag = 0;
}
}
}
但由于某种原因,while循环只输入了一次。
这让我很惊讶,因为如果我不设置断点,就会连续输入中断- 我试图将样本传递到扬声器线路,而不做任何其他事情,然后我听到了音乐。
我觉得我错过了一些关于中断的基本知识,我对这个主题很陌生。
有人可以向我解释一下[或将我链接到解释该机制如何在 DSP 中工作的好资源]:
1) 为什么我们不能在中断中设置断点?
2) 为什么即使我在 main 中设置断点,似乎中断也没有发生,如果我不这样做。
3) 在 CCS 中,我必须通过哪些方式在运行时访问变量?
谢谢
【问题讨论】:
-
对我来说显而易见的是,在程序执行期间,鉴于
flag == 1为真,您应该进入while 循环。那么我的问题是你确定volatile int flag的范围确实是全球性的吗?您是否验证过执行流程总是从L138_initialise_intr返回? -
回调实现和 main 都在同一个 .c 文件中,并且声明了标志: volatile int flag=0;在它的头上
-
您可以发布回调的相关部分吗? (如果不是太大,则全部)在设置
flag = 0;之前可能会返回错误条件。这就是为什么你永远不会在main()中输入while(...)的原因。 -
ISR 中的断点 - 请参阅上一个问题 stackoverflow.com/questions/325718/…
-
你清除中断源了吗?不在你的例子中。根据中断是电平触发还是边沿触发,这将影响它是连续调用还是一次调用。
标签: c embedded interrupt texas-instruments code-composer