中断 C 内的断点
breakpoint inside interrupt C
我正在使用 Texas Intruments 的 LCDK C6748 和 Code Composer Studio 和 TMDSEMU100V2U-14T - XDS100v2 USB JTAG 仿真器.
LCDK 附带了一堆支持函数,包括初始化电路板和定义每个中断调用哪些回调函数的函数。
我刚刚实现了回调函数,因此每当有新样本来自 ADC 时它都会执行一些操作。
我试图在中断中设置一个断点,但在 运行 时间里程序 "flow" 没有到达那里。
此外,我做了更简单的事情:
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 循环只进入了一次。
这让我很惊讶,因为如果我不设置断点,中断就会连续进入-
我试图不做任何其他事情就将样本传递到扬声器线路,然后我听到了音乐。
我觉得我遗漏了一些关于中断的非常基本的东西,我对这个主题还很陌生。
有人可以向我解释一下 [或 link 我向解释该机制在 DSP 中如何工作的好消息来源]:
1) 为什么不能在中断内部设置断点?
2)为什么即使我在main中设置了断点,也好像没有发生中断,如果不发生中断。
3) 在 运行 时间内,在 CCS 中我必须通过哪些方式访问变量?
谢谢
我认为你的中断是定时器中断。在很多情况下jtag,当一个断点被触发时,停止了很多MPU/DSP个模块,但是定时器继续运行。这会导致定时器溢出,这意味着设置了溢出标志并且在重置标志之前不会调用中断。
我不知道你是否可以设置jtag在触发断点时也停止定时器。使用飞思卡尔 MPU、IAR IDE 和 segger jtag 我可以。
- 尝试放置断点,然后 运行。看看它是否至少命中一次。如果是这样,那么你的中断源不会自动清除[因为你没有在 ISR 中明确地这样做]。根据我的经验,在 TI 控制器中,他们希望您清除 ISR 路径以接收下一个。
如果您甚至没有收到第一次中断,请检查为 ISR 生成的程序集和编译器完成的优化。
虽然,您可能需要稍后查看时序和全局变量保护,以防发生冲突,但目前以上 2 个建议都可以。
我正在使用 Texas Intruments 的 LCDK C6748 和 Code Composer Studio 和 TMDSEMU100V2U-14T - XDS100v2 USB JTAG 仿真器.
LCDK 附带了一堆支持函数,包括初始化电路板和定义每个中断调用哪些回调函数的函数。
我刚刚实现了回调函数,因此每当有新样本来自 ADC 时它都会执行一些操作。
我试图在中断中设置一个断点,但在 运行 时间里程序 "flow" 没有到达那里。
此外,我做了更简单的事情:
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 循环只进入了一次。
这让我很惊讶,因为如果我不设置断点,中断就会连续进入- 我试图不做任何其他事情就将样本传递到扬声器线路,然后我听到了音乐。
我觉得我遗漏了一些关于中断的非常基本的东西,我对这个主题还很陌生。
有人可以向我解释一下 [或 link 我向解释该机制在 DSP 中如何工作的好消息来源]:
1) 为什么不能在中断内部设置断点?
2)为什么即使我在main中设置了断点,也好像没有发生中断,如果不发生中断。
3) 在 运行 时间内,在 CCS 中我必须通过哪些方式访问变量?
谢谢
我认为你的中断是定时器中断。在很多情况下jtag,当一个断点被触发时,停止了很多MPU/DSP个模块,但是定时器继续运行。这会导致定时器溢出,这意味着设置了溢出标志并且在重置标志之前不会调用中断。
我不知道你是否可以设置jtag在触发断点时也停止定时器。使用飞思卡尔 MPU、IAR IDE 和 segger jtag 我可以。
- 尝试放置断点,然后 运行。看看它是否至少命中一次。如果是这样,那么你的中断源不会自动清除[因为你没有在 ISR 中明确地这样做]。根据我的经验,在 TI 控制器中,他们希望您清除 ISR 路径以接收下一个。
如果您甚至没有收到第一次中断,请检查为 ISR 生成的程序集和编译器完成的优化。
虽然,您可能需要稍后查看时序和全局变量保护,以防发生冲突,但目前以上 2 个建议都可以。