mbed: ошибка HardFault при доступе к SD-карте после создания сетевого подключения - PullRequest
0 голосов
/ 22 ноября 2018

Я хочу совместить HTTP-клиент и SD-Card-Reader.Моя цель - загрузить файл с сервера и сохранить этот файл на SD-карте.К сожалению, я застрял в пути из-за жесткого сбоя 0x80FF013D.

Я не разбил код и в итоге узнал:

  • Сетевое взаимодействие (команда GET) работает отлично соло
  • Доступ к SD-карте (чтение и запись) работает отлично в одиночку
  • Доступ к SD-карте работает нормально до создания сетевого подключения
  • При возникновении сбоя возникает жесткий сбойSD-карта после создания сетевого подключения

Core-Infos:

  • ОС: MBED OS5
  • IDE: MBED CLI v1.8.2
  • MC: NUCLEO-F746ZG
  • Устройство чтения SD-карт: Адаптер CATALEX для карт MicroSD с Transcend 2 ГБ microSD (в формате FAT)

Библиотеки:

Последовательный выход с HardFault:

[NWKH] Подключение к сети...
[NWKH] Подключено к сети
[NWKH] IP-адрес: 192.168.188.29
Проверка SD-карты

++ MbedOS Fault Handler ++

Тип ошибки: HardFault

Контекст:
R0: 20000400
R1: BFF39B82
R2: 08025B6A
R3: 00000003
R4: 00000000
R5: 2000FA34
R6: 84551677
R7: 7FFFFC00
R8: 00000003
R9: 08025B6A
R10: 2000FA34
R11: 00000000
R12: 08013E6D
SP: 2000F9F8
LR: 0801A8E7
ПК: A0000000
xPSR: 210B0000
PSP: 2000F990
MSP: 2004FFC0
CPUID: 410FC271
HFSR: 40000000
MMFSR: 00000001
BFSR: 00000000
UFSR: 00000000
DFSR: 0000000B
AFSR: 00000000
Режим: Thread
Priv: Privileged
Стек: PSP

- Обработчик ошибок MbedOS -

++ Информация об ошибках MbedOS ++
Состояние ошибки: 0x80FF013D Код: 317 Модуль: 255
Сообщение об ошибке: Исключение ошибки
Расположение: 0x8012A7B
Значение ошибки: 0xA0000000
Текущий поток: Id: 0x2000DA34 Запись: 0x8012BEB StackSize: 0x2000 StackMem: 0x2000DA78 SP: 0x2004FF58
Для получения дополнительной информации, посетите: https://armmbed.github.io/mbedos-error/?error=0x80FF013D
- Информация об ошибке MbedOS -

Я начал с http-примера из mbed https://os.mbed.com/teams/sandbox/code/http-example/file/2efadc4d8784/source/main-http-socket-reuse.cpp/shortlog/

идобавил некоторые вещи из примера файловой системы SD Card https://os.mbed.com/cookbook/SD-Card-File-System

main-http.cpp

#include "select-demo.h"

#if DEMO == DEMO_HTTP

#include "mbed.h"
#include "http_request.h"
#include "network-helper.h"
#include "mbed_mem_trace.h"
#include "SDBlockDevice.h"
#include "FATFileSystem.h"
#include "DebouncedIn.h"

#define SD_MOUNT_PATH           "sd"
#define FULL_UPDATE_FILE_PATH   "/" SD_MOUNT_PATH "/" MBED_CONF_APP_UPDATE_FILE

SDBlockDevice sd(MBED_CONF_APP_SD_CARD_MOSI, MBED_CONF_APP_SD_CARD_MISO,
                 MBED_CONF_APP_SD_CARD_SCK, MBED_CONF_APP_SD_CARD_CS);
FATFileSystem fs(SD_MOUNT_PATH);

NetworkInterface* network;
DebouncedIn btn(USER_BUTTON);

FILE* file;

int main() 
{
/*------Init SD-Card-----------*/
    int r;
    //Init
    if ((r = sd.init()) != 0) {
        printf("Could not initialize SD driver (%d)\n", r);
        return 1;
    }

    //Mount
    if ((r = fs.mount(&sd)) != 0) {
        printf("Could not mount filesystem, is the SD card formatted as FAT? (%d)\n", r);
        return 1;
    }

 /*------Init Network-----------*/  
    network = connect_to_default_network_interface();
    if (!network) 
    {
        printf("Cannot connect to the network, see serial output\n");
        return 1;
    }

    //Write
    printf("Test SD-Card\n");
    char testbuffer2[] = { 'a' , 'b' , 'c' };
    file = fopen("/sd/test.bin", "wb");
    fwrite("abc",1,3,file);
    //fwrite(testbuffer2,1,sizeof(testbuffer2),file);
    fclose(file);

//Hauptschleife 
    while(1)
    {
        //Buttondruck
        if (btn.rising())
        {
            printf("Update wird gesucht, bitte warten\n");
        }
    }
}

#endif

mbed_app.json

{
    "config": {
        "main-stack-size": {
            "value": 8192
        },

        "update_file": {
            "help": "Path to the application update binary on the SD card",
            "value": "\"update.bin\""
        },

        "sd_card_mosi": {
            "help": "MCU pin connected to the SD card's SPI MOSI pin",
            "value": "D11"
        },
        "sd_card_miso": {
            "help": "MCU pin connected to the SD card's SPI MISO pin",
            "value": "D12"
        },
        "sd_card_sck": {
            "help": "MCU pin connected to the SD card's SPI SCK pin",
            "value": "D13"
        },
        "sd_card_cs": {
            "help": "MCU pin connected to the SD card's SPI CS pin",
            "value": "D10"
        }
    },
    "macros": [
        "MBEDTLS_MPI_MAX_SIZE=1024",
        "MBEDTLS_MPI_WINDOW_SIZE=1",
        "MBEDTLS_USER_CONFIG_FILE=\"mbedtls_entropy_config.h\"",
        "MBEDTLS_TEST_NULL_ENTROPY",
        "MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES",
        "MBED_HEAP_STATS_ENABLED=1"
    ],
    "target_overrides": {
        "*": {
            "platform.stdio-baud-rate": 115200,
            "platform.stdio-convert-newlines": true,
            "mbed-mesh-api.6lowpan-nd-channel-page": 0,
            "mbed-mesh-api.6lowpan-nd-channel": 12,
            "mbed-trace.enable": 1,
            "platform.error-hist-enabled": 1,
            "mbed-http.http-buffer-size": 2048,
            "nsapi.default-wifi-security": "WPA_WPA2",
            "nsapi.default-wifi-ssid": "\"SSID\"",
            "nsapi.default-wifi-password": "\"Password\""
        }
    }
}

Я уже прочиталУчебное пособие по «Анализу аварийного дампа Mbed OS» -> https://os.mbed.com/docs/v5.8/tutorials/analyzing-mbed-os-crash-dump.html,
, но я до сих пор не представляю, что я могу сделать, чтобы найти причину неисправности.

  • Состояние ошибки: «0x80FF013D "означает" исключение жесткого сбоя "
  • HFSR: 40000000 означает" принудительное сбой жесткого диска "
  • MMFSR: 00000001 означает" Процессор попытался получить инструкцию из местоположения, которое не разрешает выполнение ".
  • UFSR: 00000000 означает «все хорошо»
  • BFSR: 00000000 означает «все хорошо»

Буду признателен за помощь.Заранее спасибо.

1 Ответ

0 голосов
/ 26 января 2019

Эта доска имеет конфликтный вывод D11.Он используется Ethernet и как ваш SPI.Вам нужно использовать другие контакты SPI или следовать направляющей с сайта mbed для исправления платы:

Если вы используете и SPI, и Ethernet Вы должны пропатчитьПлата NUCLEO на задней стороне:

  1. Снять SB121 и закрыть паяные перемычки SB122.Это соединит PB_5 с D11 вместо PA_7.
  2. Перезапишите конфигурацию d11_ с помощью файла mbed_app.json и используйте PB_5 (вместо значения по умолчанию PA_7).
...