这是胡桃夹子。在 ubuntu 16.04 上交叉编译 NXP imx.6 使用 gcc-arm-none-eabi-5_2-2015q4 进行编译。使用 jlink 基础进行调试。代码编译并运行没有错误,但输出错误。
编码:
文件:uart_print.c
#include "imx_uart.h"
uart_instance = HW_UART4; # defined in another file
void uartWriteString(void *str) {
uint8_t mystr;
while (*(uint8_t *)(str) != '\0') {
mystr = *(uint8_t *)str++;
uart_putchar(uart_instance, &mystr); //Write data
}
}
文件:myfile.c
#include "uart_print.h"
#include "sdk.h"
void myfunc() {
char str[40];
int i, char_written;
int myarray[512][4];
char_written = sprintf(str, "123456789"); //This works str="123456789\0"
//DEBUGGER output here: char_written = 9
for (i = 0; i < 512; i++){
myarray[i][0] = 0;
myarray[i][1] = 0; // <-- Problem starts here
myarray[i][2] = 0;
myarray[i][3] = 0;
}
char_written = sprintf(str, "0123456789");
uartWriteString(str); //uart: str=\023456789\0
//DEBUGGER output here: char_written = 0
那个 for 循环中发生了一些事情,它扰乱了 sprintf 函数。因此,我尝试在 for 循环中使用 sprintf:
...
myarray[i][0] = 0;
char_written = sprintf(str, "0123456789");
myarray[i][1] = 0;
char_written = sprintf(str, "0123456789");
myarray[i][2] = 0;
myarray[i][3] = 0;
}
调试器输出:
str = 123456789 if myarray[0 - 110][0-3] = 0 and myarray[111][0] = 0
str = \023456789 if myarray[111][1] = 0
并且总是在这之后;
设置sprintf
后将永远无法正常工作myarray[111][1] = 0
如果我删除myarray[111][1] = 0
myarray[111][2] = 0
将使sprintf write str=1234\06789
,这里只写前 4 个符号。
我无法弄清楚连接,内存有问题吗?他们是否覆盖了一些重要的寄存器。鉴于我已经为此花了两天时间,现在非常欢迎任何意见?