rt-thread 的mailbox与messageQueen

maibox

mailbox传递一堆数据时需要传递的是“指针变量“的”地址”,即指针的指针 (类型定义 **p),messageQueen 确实直接的变量值赋值。所以在rt-thread应用文档里做了比较详细的说明。对比着看才看得明白了一些,说明c语言不使用复杂环境还是不敢说完全掌握啊。身边Linux玩的好的人c语言功底一般很好,那是c语言描述的最复杂的事物了吧。

struct msg
{
rt_uint8_t *data_ptr;
rt_uint32_t data_size;
};

这是应用手册中推荐了一种用邮箱传递大量数据的方法,额外的构造一个结构体类型。

struct msg* msg_ptr;
msg_ptr = (struct msg*)rt_malloc(sizeof(struct msg));
msg_ptr->data_ptr = ...; /* 指向相应的数据块地址*/
msg_ptr->data_size = len; /* 数据块的长度*/
/* 发送这个消息指针给mb 邮箱*/
rt_mb_send(mb, (rt_uint32_t)msg_ptr);

把需要传递的结构体变量的地址发送到邮箱。

struct msg* msg_ptr;
if (rt_mb_recv(mb, (rt_uint32_t*)&msg_ptr) == RT_EOK)
{
/* 在接收线程处理完毕后, 需要释放相应的内存块*/
rt_free(msg_ptr);
}

而在接收线程中,因为收取过来的是指针,而msg_ptr 是一个新分配出来的内存块,所以在接收线程处理完毕后,需要释放相应的内存块

这个地方需要对这个结构体指针变量取地址操作

if (rt_mb_recv(mb, (rt_uint32_t*)&msg_ptr) == RT_EOK)

让结构体指针变量存储邮箱中的结构体地址,因为对指针变量理解不深刻,这个地方总感觉有点怪怪的。所谓指针变量其实也是个变量而已,指针变量也需要在内存中占用4个字节,所以指针变量也有地址。当传递参数时也需要对指针变量进行取地址,才能改变指针变量中存储的值。和需要改变数据变量的原理是一样的。

messageQueen

手册中说到但消息队列也只有4个字节可以使用时,可以参考mailBox

struct msg
{
rt_uint8_t *data_ptr; /* 数据块首地址*/
rt_uint32_t data_size; /* 数据块大小*/
};

void send_op(void *data, rt_size_t length)
{
struct msg msg_ptr;
msg_ptr.data_ptr = data; /* 指向相应的数据块地址*/
msg_ptr.data_size = length; /* 数据块的长度*/
/* 发送这个消息指针给mq 消息队列*/
rt_mq_send(mq, (void*)&msg_ptr, sizeof(struct msg));
}


void message_handler()
{
struct msg msg_ptr; /* 用于放置消息的局部变量*/
/* 从消息队列中接收消息到msg_ptr 中*/
if (rt_mq_recv(mq, (void*)&msg_ptr, sizeof(struct msg)) == RT_EOK)
  {
  /* 成功接收到消息, 进行相应的数据处理*/
  }
}

rt_mq_recv函数中使用的是传结构地址,所以在 rt_mq_recv函数中使用的是逐个复制结构体中的变量值,如下

/**
 * This function will receive a message from message queue object, if there is
 * no message in message queue object, the thread shall wait for a specified
 * time.
 *
 * @param mq the message queue object
 * @param buffer the received message will be saved in
 * @param size the size of buffer
 * @param timeout the waiting time
 *
 * @return the error code
 */
rt_err_t rt_mq_recv(rt_mq_t    mq,
                    void      *buffer,
                    rt_size_t  size,
                    rt_int32_t timeout)
    /* copy message */
rt_memcpy(buffer, msg + 1, size > mq->msg_size ? mq->msg_size : size);

估计采用邮箱传递是不是快点。
原来都是裸机写程序多,把复杂点的程序自己合理的使用c语言面向对象封装下,使用全局变量传递下函数也没有大问题。现在os下写程序是个趋势了,活到老学到老啊。还好是硬件编程技术发展没有web编程技术快,其实还是稍微轻松点。
想想为什么线程间的传递参数搞得好像这么复杂,好像就是为了避开全局变量在线程间传递变量进行通信。做到线程的独立性,线程间的解耦。一个线程操作异常,不会影响其他线程,容错性加强,鲁棒性也提高了吧。没有良好书写习惯,全局变量乱放的程序看得会让人吐血。自从互联网连接的代码资源越来越多,看程序,移植程序的时间会比写程序的时间多。原来的老工程师都是拿起要求就写,现在就不一样了,没有时间的积累,自己写的程序还没有别人的好用,美观,简洁。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容