cplusplus/queue.h文件BUG

发布于 2019-09-29 15:22:42
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2016/10/1 Bernard The first version
*/

#pragma once

#include
#include

#include

namespace rtthread {

/**
* The Queue class allow to control, send, receive, or wait for messages.
* A message can be a integer or pointer value to a certain type T that is send
* to a thread or interrupt service routine.
* @param T data type of a single message element.
* @param queue_sz maximum number of messages in queue.
*/
template
class Queue
{
public:
/** Create and initialise a message Queue. */
Queue()
{
rt_mq_init(&mID, "mq", mPool, sizeof(T), sizeof(mPool), RT_IPC_FLAG_FIFO);
};

~Queue()
{
rt_mq_detach(&mID);
};

/** Put a message in a Queue.
@param data message pointer.
@param millisec timeout value or 0 in case of no time-out. (default: 0)
@return status code that indicates the execution status of the function.
*/
rt_err_t put(T& data, int32_t millisec = 0)
{
return rt_mq_send(&mID, &data, sizeof(data));
}

/** Get a message or Wait for a message from a Queue.
@param millisec timeout value or 0 in case of no time-out. (default: osWaitForever).
@return bool .
*/
bool get(T& data, int32_t millisec = WAIT_FOREVER)
{
rt_int32_t tick;

if (millisec < 0)
tick = -1;
else
tick = rt_tick_from_millisecond(millisec);

return rt_mq_recv(&mID, &data, sizeof(data), tick) == RT_EOK;
}

private:
struct rt_messagequeue mID;

char mPool[(sizeof(struct rt_messagequeue) + sizeof(T)) * queue_sz];
};

}
以上是原文件。最后一句mPool的尺寸计算明显有问题,导致实际尺寸很大,严重浪费RAM(100个消息需要7KB左右),改成下面就好了:
char mPool[(sizeof(T)+4) * queue_sz];
另外我感觉软件定时器使用独立线程可能有BUG,因为我关闭这一个选项我的程序正常,开启就跑飞,调试显示的英文意思好像是线程混乱什么的。


查看更多

关注者
0
被浏览
623
2 个回答
tyustli
tyustli 2019-09-30
Queue.h 里面确实是个 bug ,楼主会使用 git 吗,大显身手的时候到了
DIOJ_8427
DIOJ_8427 2019-10-09
tyustli 发表于 2019-9-30 14:37
Queue.h 里面确实是个 bug ,楼主会使用 git 吗,大显身手的时候到了


不会,没有在github上提交过代码。

撰写答案

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

发布
问题

分享
好友