Почему эта маленькая C-программа падает на ESP32? - PullRequest
0 голосов
/ 11 декабря 2018

Я работаю с Esspresif ESP32 WROOM.Я пытался проанализировать ошибку, полученную с помощью GDB Hardware Debugger, но я получаю только строку, где происходит ошибка, без описания ошибки.

Вот моя маленькая программа:

typedef unsigned char u08;

void app_main() {
  static char *mac_str = "00:00:00:00:00:00";
  static u08 mac_addr[6] = {0x1a, 0x11, 0xaf, 0xa0, 0x47, 0x11};
  net_dump_mac(mac_addr);
}

void net_dump_mac(const u08 *in) {
    int pos = 0;
    for (int i=0; i<6; i++) {
        byte_to_hex(in[i], (u08 *)(mac_str+pos));
        pos += 3;
    }
    uart_send(mac_str);
}

void byte_to_hex(u08 in, u08 *out) {
    out[0] = nibble_to_hex(in >> 4);       // <= crash occurs here !
    out[1] = nibble_to_hex(in & 0xf);
}

u08 nibble_to_hex(u08 in) {
    if (in < 10)
        return '0' + in;
    else
        return 'A' + in - 10;
}

НекоторыеПонятие, что я здесь не так делаю?

1 Ответ

0 голосов
/ 11 декабря 2018

char *mac_str = "00:00:00:00:00:00"; назначает буквенную строку для mac_str.Литерал доступен только для чтения на многих архитектурах.Попытка изменить его приведет к тому, что диспетчер памяти не разрешит его, что часто приводит к возникновению ошибки или другого исключения.

Вместо этого выполните:

char mac_str[] = "00:00:00:00:00:00";

Это создаст инициализированный массивс литералом справа, который копируется в ваш массив.Массив будет размером буквенной строки, включая нулевой терминатор.Эта переменная массива является изменяемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...