gpt4 book ai didi

c - arm cortex m0 nf51822 c编程硬故障,真的很困惑

转载 作者:行者123 更新时间:2023-11-30 17:29:26 33 4
gpt4 key购买 nike

我试图将 char 类型缓冲区转换为我定义的结构,以便通过 TLV 分析缓冲区。但我一次又一次陷入硬故障。

代码是这样的:有点长。

#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:硬件板为Nordic nf51822,带8kB RAM,256kB flash ROM

顺便说一句:这种主板上真的禁止calloc和其他alloc函数吗?因为当我尝试动态分配新空间时,主板会出错并自行重置。

非常感谢

最佳答案

看起来可疑的一件事是您将 char* 缓冲区转换为 (cb_tlv_node_t *) 并尝试使用它。 ARM 要求在访问 32 位整数时与 4 字节边界正确对齐。 char *buffer 指向的缓冲区很可能与 1 字节边界对齐。由用户694733提供

所以我改变了这个

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

关于c - arm cortex m0 nf51822 c编程硬故障,真的很困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25637614/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com