【发布时间】:2018-04-04 05:16:50
【问题描述】:
我目前正在尝试通过 UART 接收中断协议解析从 PIC32MZ2048EFG100 微控制器上的 GPS 模块通过 UART 接收的字符串。我正在为我的 IDE 和编译器使用 MPLAB X IDE v4.10 和 XC32 v2.05。
当我启用 UART4 接收中断时,!= 运算符停止正常运行。我的 main 函数中有一段代码永远不应该被执行,但它确实是。
我已将其范围缩小到启用中断是问题所在。如果我在 ISR 中注释掉所有工作代码,我仍然会面临 myCounter 被递增的问题。
这是我的 main 函数中的代码。
int myCounter = 0;
void main ( void ){
hal_sys_init();
hal_uart4_init();
gps_init();
//Setup interrupt
asm volatile("di"); //Disable all interrupts
asm volatile("ehb"); //Disable all interrupts
INTCON = 0; //Clear interrupt control register
IEC0 = 0;
IEC1 = 0;
IEC2 = 0;
IEC3 = 0;
IEC4 = 0;
IEC5 = 0;
IEC6 = 0;
INTCONbits.MVEC = 1; //Enable multi-vectored interrupts
IFS5bits.U4RXIF = 0; //Clear interrupt flag
IPC42bits.U4RXIP = 1; //Set priority level to 7
IPC42bits.U4RXIS = 0; //Set sub-priority to 0
IEC5bits.U4RXIE = 1; //Enable interrupt
asm volatile("ei"); //Enable all interrupts
while(1){
int x = 0;
if(x != 0){
myCounter++; //Should never be executed
}
}
}
在启用中断的情况下在我的 PIC 上运行此代码时,myCounter 会递增。
这是我的中断服务程序的代码。
void __ISR(_UART4_RX_VECTOR, ipl7SRS) UART4_Interrupt(void) {
while (U4STAbits.URXDA) {
char c = U4RXREG;
if (c == '\n') {
currentLine[--lineIndex] = 0; //Overwrite /r as null terminator for string
parseStringFlag = 1;
lineIndex = 0;
if (currentLine == buff_1) {
currentLine = buff_2;
previousLine = buff_1;
} else {
currentLine = buff_1;
previousLine = buff_2;
}
} else if (lineIndex < MAX_LINE_LENGTH) {
currentLine[lineIndex++] = c;
} else {
currentLine[--lineIndex] = c;
}
}
IFS5bits.U4RXIF = 0; //Clear interrupt flag
return;
}
这是仍然使 myCounter 递增的基本 ISR 代码。
void __ISR(_UART4_RX_VECTOR, ipl7SRS) UART4_Interrupt(void) {
while (U4STAbits.URXDA) {
char c = U4RXREG;
}
IFS5bits.U4RXIF = 0; //Clear interrupt flag
return;
}
什么可能导致不应该执行的代码执行?如果我在禁用中断的情况下在 main 中运行中断代码,则代码可以工作,并且永远不应该执行的代码不会被执行。
【问题讨论】:
-
main 中的代码看起来确实不应该增加 x。恐怕你正在看一些邪恶的东西,stackoverflow,野指针,UB,......祝你好运(无意讽刺)。
-
您可能希望将您的代码报价升级为minimal reproducible example。我缺少
lineIndex和currentLine的声明和定义;没有这个currentLine[--lineIndex] = 0;看起来很可疑。 -
请在您方便的时候拨打tour。
-
看起来很可疑,因为损坏的
lineIndex低于 0,这可能会向 xcurrentLine[--lineIndex] = c;写入除 0 以外的其他内容。 -
@Yunnosch :不需要像这样“损坏” - 如果收到的第一个字符是
\n,它将从零开始递减。
标签: c embedded uart mplab pic32