初始化第二个消息队列时发生硬件错误

发布于 2020-11-17 11:15:23

在Main主线程初始化两个静态消息队列时,总是第一个能通过,第二个发生硬件错误。下面是初始化队列的代码:

static rt_mq_t at_rx_mq;
static rt_mq_t command_reply_mq;
char at_command_reply_data_pool[16];
char msg_pool[16];
en_result_t AT_init(void){
        rt_mq_init(command_reply_mq,
                        "mqcr",
                        &at_command_reply_data_pool[0],    
                        16,                
                        sizeof(at_command_reply_data_pool),      
                        RT_IPC_FLAG_FIFO);
    rt_mq_init(at_rx_mq,
                        "mqt",
                        &msg_pool[0],    
                        1,                
                        sizeof(msg_pool),      
                        RT_IPC_FLAG_FIFO);
}

经过测试,发现每次进入到第二个队列初始化时,在进行rt_object_init的函数里,走到

for (node  = information->object_list.next;
            node != &(information->object_list);
            node  = node->next)
    {
        struct rt_object *obj;

        obj = rt_list_entry(node, struct rt_object, list);
        RT_ASSERT(obj != object);
    }

里面的node = node->next时,node->next总是指向错误地址。从而引发hardfault。将两个队列初始化顺序调换也总是在第二个初始化时报错。整个工程文件也上传了,有人能帮忙看看吗。
example.7z

查看更多

关注者
0
被浏览
344
3 个回答
whj467467222
whj467467222 认证专家 2020-11-17

`static rt_mq_t at_rx_mq;
static rt_mq_t command_reply_mq;
char at_command_reply_data_pool[16];
char msg_pool[16];`
你这些是在线程定义的吗?
hardfault 信息发出来看看。

DJZ1992
DJZ1992 2020-11-18

你是这样定义的结构体指针:
static rt_mq_t at_rx_mq;
static rt_mq_t command_reply_mq;

你改成如下试试:
struct rt_messagequeue at_rx_mq;
struct rt_messagequeue command_reply_mq;
rt_mq_init(&command_reply_mq,。。。。。);
rt_mq_init(&at_rx_mq,。。。。。。);

根据我昨天多次使用creat和init函数时出错的经验发现,在使用动态的creat创建线程、邮箱等内容时,可以使用rt_mq_t定义的指针来获取creat的返回。
比如:
rt_mailbox_t key_mail = rt_mb_create("key_mail",10,RT_IPC_FLAG_FIFO);

但是在使用rt_mq_init时,传递该指针传入是会出错的,改成定义结构体,传入结构体地址就不会出错。

或者这样,先申明结构体,然后定义一个指针,给他赋地址,再把指针传入,就不会报错。
struct rt_messagequeue rx_mq;
rt_mq_t at_rx_mq=&rx_mq;
rt_mq_init(at_rx_mq,。。。。。);
由于我也是个菜鸟,我也不清楚为什么。也许在static rt_mq_t at_rx_mq;的时候只是创建了指针,并没有分配具体的控制块。刚刚我做了一个测试,请看下图。
123.png

可以看以下内容中的案例。
https://www.rt-thread.org/document/site/programming-manual/ipc2/ipc2/#_15

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览