C++ 在for循环中初始化的变量包含一个值,won';t增量

C++ 在for循环中初始化的变量包含一个值,won';t增量,c++,embedded,microcontroller,stm32f4,stm32cubeide,C++,Embedded,Microcontroller,Stm32f4,Stm32cubeide,我正在为STM32微控制器开发一个函数,该函数通过uart端口发送给定长度的字符串。为了处理uart通信,我创建了一个串行类,它有一个传输和接收缓冲区,在中断处理程序中弹出并传输。我目前正在处理的函数实际上是我之前编写的一个可以正常工作的函数的重载。以下是工作功能: void Serial::sendString(char* str) { // Writes a string to txBuffer. If Transmit interrupts are enabled, and // the

我正在为STM32微控制器开发一个函数,该函数通过uart端口发送给定长度的字符串。为了处理uart通信,我创建了一个串行类,它有一个传输和接收缓冲区,在中断处理程序中弹出并传输。我目前正在处理的函数实际上是我之前编写的一个可以正常工作的函数的重载。以下是工作功能:

void Serial::sendString(char* str) {
// Writes a string to txBuffer. If Transmit interrupts are enabled, and
// the Data register is empty, the txBuffer will be popped into the DR to
// prime the interrupts.

__HAL_UART_DISABLE_IT(uart, UART_IT_TXE); // Keeps our spaghetti straightened out...

while (*str != '\0') { // While char is not a null terminator...
    txBuffer->push(*str); // Push first char into queue as we know it is valid
    str++; // Pointer goes to next char in string
}

 uint32_t isrflags   = READ_REG(uart->Instance->SR); // Reads the flags and control register
 //uint32_t cr1its     = READ_REG(uart->Instance->CR1); // Into variables

 // If the DR is empty and Transmission interrupts are disabled...
 if ((isrflags & USART_SR_TXE) != RESET) {
    uart->Instance->DR = txBuffer->pop(); // Reenable interrupts and prime the DR
    }

 __HAL_UART_ENABLE_IT(uart, UART_IT_TXE); // Alright, time to cook the pasta
}

重载是我遇到问题的函数。出于某种原因,调试器显示变量“i”以值“14”初始化,并且在使用调试器时不会递增。事实上,调试器根本不允许我进入for循环。这里是过载:

void Serial::sendString(char* str, unsigned int len) {
// Writes a string to txBuffer. If Transmit interrupts are enabled, and
// the Data register is empty, the txBuffer will be popped into the DR to
// prime the interrupts.
// Rather than being terminated by a null character, this method instead
// sends each char in an array of a specified length. Note that this overload
// MUST be used in any situation that a null terminator might appear in a char
// array!

__HAL_UART_DISABLE_IT(uart, UART_IT_TXE); // Keeps our spaghetti straightened out...

for (unsigned int i = 0; i < len; i++) { // While char is not a null terminator...
    txBuffer->push(str[i]); // Push first char into queue as we know it is valid
    //str++; // Pointer goes to next char in string
}

 uint32_t isrflags   = READ_REG(uart->Instance->SR); // Reads the flags and control register
// uint32_t cr1its     = READ_REG(uart->Instance->CR1); // Into variables

 // If the DR is empty...
 if ((isrflags & USART_SR_TXE) != RESET) {
    uart->Instance->DR = txBuffer->pop();
    }
 __HAL_UART_ENABLE_IT(uart, UART_IT_TXE); // Alright, time to cook the pasta
void Serial::sendString(char*str,unsigned int len){
//将字符串写入txBuffer。如果启用了传输中断,并且
//数据寄存器为空,txBuffer将弹出到DR中以
//为中断注入能量。
//此方法不是由空字符终止,而是
//发送指定长度数组中的每个字符。请注意,此重载
//必须在字符中可能出现空终止符的任何情况下使用
//阵列!
__HAL_UART_DISABLE_IT(UART,UART_IT_TXE);//让我们的意大利面变直。。。
for(unsigned int i=0;ipush(str[i]);//将第一个字符推入队列,因为我们知道它是有效的
//str++;//指针指向字符串中的下一个字符
}
uint32\u t isrflags=READ\u REG(uart->Instance->SR);//读取标志和控制寄存器
//uint32\u t cr1its=READ\u REG(uart->Instance->CR1);//到变量中
//如果DR为空。。。
如果((isrflags和USART\U SR\U TXE)!=重置){
uart->Instance->DR=txBuffer->pop();
}
__HAL_UART_ENABLE_IT(UART,UART_IT_TXE);//好了,该做意大利面了
}

这些函数在终端while loop in main中调用。调试时,问题立即发生;我一点也跑不过去。我的代码似乎正好在这个位置停了下来


我以前已经能够成功地运行过载。当我试图解决函数中的另一个bug时,这个bug才出现,其中字符串中的第一个字符只有一半的时间被传输。我设置了一个断点并开始调试,但现在它根本不起作用了……

听起来编译器优化了您的循环控制变量

如果启用了高级优化,则可以展开循环,或者如果从定义该函数的同一文件调用该函数,则可以将其内联,从而消除循环控制变量

实际上,您还没有描述要调试的问题是什么。与其期望调试体验完美,不如尝试解决您遇到的问题,尽管我总是14岁

只要看看你发布的代码,我看不出有什么大问题。当然,代码中可能有一个bug,您没有显示

我强烈不同意这种毫无帮助的评论,即这种代码根本就是垃圾。打开和关闭中断以访问共享数据是过时的、低效的,但也很简单,可能足以满足您的需要


在这个函数中,将第一个字节写入UART确实可以节省一次中断的成本,但是如果您正在写入一个20字节的字符串,您真的在乎是需要20个还是19个中断来完成吗?一个好的设计原则是,只有当代码获得了您不希望缺少的东西时,才应该使代码变得更复杂。

更新:我重新启动了IDE,将主板换成另一块,刷新了代码,然后它神奇地开始工作。我对固件工程比较新,有人能解释一下是什么导致了这些奇怪的bug吗?它们看起来很小,而且是一个硬件问题……顺便说一句,你的代码没有什么意义。中断处理必须看起来完全不同。它“工作”是偶然的,当你写更多的代码时它就会停止工作。你能详细说明一下吗?我正在使用的电路板有一个中断,当数据寄存器在传输后清空时触发。在我的ISR中,我将txBuffer中的内容弹出到DR中,以便传输字节。您只需使用错误的方法即可。查看任何STM32和它的UART代码并找出差异。解释这个注释太多了。嘿,我查了一些STM32中断传输代码。在发送方法中将数据放入DR是否不正确?感谢您的反馈调试器没有优化代码。至于编译器,它不会优化包含对硬件外围寄存器的读/写的代码。如果发生了这种情况,那只能是因为整个寄存器定义代码都是乱七八糟的,听起来很牵强。只是一个输入错误…更正了。谢谢你的反馈!我试图解决的问题是变量被卡住的问题,我正在将Dynamixel的协议2.0实现到一个更大的项目中,这时我的代码神奇地停止了工作。我不确定优化是否有错,因为我在调试和发布版本中遇到了问题。。。当我换出另一块板并重新连接我的ST链接时,问题消失了。。。到目前为止,我还没有真正能够复制错误,但我会更新这个线程,如果我再次遇到这个问题…你能接受答案吗?谢谢