0

这是胡桃夹子。在 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 个符号。

我无法弄清楚连接,内存有问题吗?他们是否覆盖了一些重要的寄存器。鉴于我已经为此花了两天时间,现在非常欢迎任何意见?

4

1 回答 1

0

这里需要考虑几件事:

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)如果您发布一个更简单但可以工作/编译的代码来重现您的问题,我们可能会提供更多帮助。

于 2018-06-19T10:21:53.437 回答