2014-09-03 3 views
0

Я пытался преобразовать буфер типа char в структуру, определенную мной, чтобы проанализировать буфер по TLV. Но я снова и снова вскакивал.arm cortex m0 nf51822 c программирование жесткой ошибки, действительно озадачен

коды следующие: немного длинный.

#define BigtoLittle32(A) ((((uint32_t)(A) & 0xff000000) >> 24) | \ 
            (((uint32_t)(A) & 0x00ff0000) >> 8) | \ 
            (((uint32_t)(A) & 0x0000ff00) << 8) | \ 
            (((uint32_t)(A) & 0x000000ff) << 24)) 

enum { 
    DISH = 0 
} CB_DISH_TLV_TYPES; 

typedef struct cb_tlv_node_s 
{ 
    uint32_t type; 
    uint32_t length; 
    char value[0]; 
} cb_tlv_node_t; 


typedef struct cb_ble_buffer_s { 
    uint16_t total_length; 
    uint16_t current_length; 
    int8_t current_data_id; 
    int8_t expect_package_id; 
    char buffer[500]; 
} cb_ble_buffer_t; 

static cb_ble_buffer_t     current_buffer; 

cb_tlv_node_t * 
cb_tlv_read(char *buffer) 
{ 
    uint32_t a,b,c,d; 
    cb_tlv_node_t * tlv_p; 
    tlv_p = (cb_tlv_node_t *)buffer; 
/* tlv_p->length = BigtoLittle32(tlv_p->length);*/ //this code also cause hard fault 
/* tlv_p->type = BigtoLittle32(tlv_p->type);*/ //didn't test this one ,but high risk causing hard fault 

    return tlv_p; 
} 

//ble packages are reorgnized and call this function. it excutes in the ble recieve interupt 
int 
cb_dish_data_processer(char * data, int length) 
{ 
    assert(data != NULL); 
    assert(length > 0); 


    cb_tlv_node_t *tlv_p = cb_tlv_read(data); 

    //test 
    int a = sizeof(CB_DISH_TLV_TYPES); 

    //if ((char)tlv_p->type != DISH) { //this code is fine and steady 
    if (tlv_p->type != DISH) {   //this leads to hard fault 
     return CB_PC_CODE_UNRECOGNIZE; 
    } 

    cb_dish_tlv_read(tlv_p->value, tlv_p->length); 
    return CB_PC_CODE_PROCESSED; 
} 

Кулак Я уверен, что указатели не теряются, так что не должно быть любого типа, если незаконный адрес используется; Во-вторых, я предполагаю, что мой процесс слишком длинный, чтобы быть в прерывании, поэтому я переместил свои коды из стороны и возбуждал в основном цикле, но все же бесполезен;

Так что я застрял здесь, я не могу найти причин, вызывающих это. Если вам нужно больше информации, оставьте сообщение, я буду ждать в Интернете. ps: аппаратная плата - скандинавская nf51822 с RAM 8kB, флэш-память 256kB

BTW: Правда ли, что функции calloc и другие функции распределения запрещены в таких типах плат? , потому что, когда я пытаюсь динамически выделять новое пространство, плата выходит из строя и сама перезагружается.

Большое спасибо

+1

ли доступны функции распределения динамической памяти или не, зависит от ваших инструментов компиляции. 8kB - очень небольшой объем памяти, и, возможно, нет пула памяти, зарезервированного для функций распределения. Проверьте настройки компилятора/компоновщика. – user694733

+0

@ user694733 keil c 4.0 - это компилятор, который я использую, я не знал точно параметров, используемых для компиляции, я использовал Keil uVersion IDE в Windows. и использовать проект шаблонов Nordic для разработки правления. Надеюсь, что эта информация полезна –

+2

Подозреваемо, что вы конвертируете буфер 'char *' в (cb_tlv_node_t *) и пытаетесь его использовать. ARM требует, чтобы 32-битные целые числа были правильно выровнены с 4-байтными границами при их присоединении. Вероятно, буфер, обозначенный «char * buffer», выровнен с 1-байтовыми границами. – user694733

ответ

0

Одна вещь, которая выглядит подозрительным является то, что вы преобразовать символ * буфера (cb_tlv_node_t *) и попытаться использовать его. ARM требует, чтобы 32-битные целые числа были правильно выровнены с 4-байтными границами при их присоединении. Вероятно, буфер, отмеченный буфером char *, выровнен с 1-байтовыми границами. по user694733

так я изменил эту

typedef struct cb_ble_buffer_s { 
    uint16_t total_length; 
    uint16_t current_length; 
    int8_t current_data_id; 
    int8_t expect_package_id; 
    char buffer[500]; 
} cb_ble_buffer_t; 

в этом

typedef struct cb_ble_buffer_s { 
    uint16_t total_length; 
    uint16_t current_length; 
    int16_t current_data_id; 
    int16_t expect_package_id; 
    char buffer[500]; 
} cb_ble_buffer_t; 

и он просто отлично работает и устойчивый большое спасибо @ user694733

Смежные вопросы