这是个胡桃夹子。在ubuntu 16.04上交叉编译恩智浦imx.6,使用gcc-arm-none eabi-5_2-2015q4进行编译。使用jlink base进行调试。代码编译和运行时没有错误,但输出是错误的。
代码:
file: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 = 0for循环中发生了一些事情,扰乱了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并始终在此之后;设置myarray[111][1] = 0后,sprintf永远不会正常工作
如果我删除myarray[111][1] = 0,myarray[111][2] = 0会生成sprintf write str=1234\06789,这里只写了前4个符号。
我找不到连接,是不是内存有问题?它们是否覆盖了一些重要的寄存器。鉴于我已经在这上面花了两天时间,现在有什么建议是非常受欢迎的吗?
发布于 2018-06-19 18:21:53
这里需要考虑的几件事:
1)您可以使用memset更轻松/更快速地初始化矩阵:
memset(myarray, 0, sizeof(myarray[0][0]) * m * n);2)使用snprintf而不是sprintf可以更好地控制指定字符串的最大长度。
3) charwrt的定义在哪里?
4)在for循环之后,您想要做什么?您一次又一次地重写"str“:
char_written= sprintf(str, "0123456789"); //str=\023456789\0
...
myarray[i][0] = 0;
char_written= sprintf(str, "0123456789");
myarray[i][1] = 0;
char_written= sprintf(str, "0123456789");5)迭代循环后,"i“值始终为512
6)也许如果你发布一个更简单但可以工作/编译的代码来重现你的问题,我们可以提供更多帮助。
https://stackoverflow.com/questions/50925655
复制相似问题