c语言定阅,C语言实现订阅者/发布者模式-用例

static bool rz_mq_magic_test_init(rz_mq_magic_test_t *t)

{

rz_mq_magic_t *prz_mq_magic = rz_mq_magic_obj_get();

char name[60];

t->mq_tid = RT_NULL;

t->pub_mq_magic = rt_malloc(sizeof(mq_magic_t));

if (RT_NULL == t->pub_mq_magic) {

rt_kprintf("%s(),line %d, malloc failed\r\n", __FUNCTION__, __LINE__);

return false;

}

memset(name, 0, 20);

sprintf(name, "mq_magic_pub_%x", t->pub_mq_magic);

if (!mq_magic_user_create(t->pub_mq_magic, name, RT_IPC_FLAG_FIFO)) {

rt_kprintf("%s():mq_magic_user_create %s failed.\r\n", __FUNCTION__, name);

rt_free(t->pub_mq_magic);

return false;

}

if (RT_NULL != t->pub_mq_magic) {

if (!prz_mq_magic->publisher_register(prz_mq_magic, t->pub_mq_magic, t->pub_topic)) {

rt_kprintf("%s():publisher_register %s failed.\r\n", __FUNCTION__, name);

rt_free(t->pub_mq_magic);

return false;

}

}

t->sub_mq_magic = rt_malloc(sizeof(mq_magic_t));

if (RT_NULL == t->sub_mq_magic) {

rt_kprintf("%s(),line %d, malloc failed\r\n", __FUNCTION__, __LINE__);

rt_free(t->pub_mq_magic);

return false;

}

memset(name, 0, 20);

sprintf(name, "mq_magic_sub_%x", t->pub_mq_magic);

if (!mq_magic_user_create(t->sub_mq_magic, name, RT_IPC_FLAG_FIFO)) {

rt_kprintf("%s():mq_magic_user_create %s failed.\r\n", __FUNCTION__, name);

rt_free(t->pub_mq_magic);

rt_free(t->sub_mq_magic);

return false;

}

if (RT_NULL != t->sub_mq_magic) {

if (!prz_mq_magic->subscriber_register(prz_mq_magic, t->sub_mq_magic, t->sub_topic)) {

rt_kprintf("%s():publisher_register %s failed.\r\n", __FUNCTION__, name);

rt_free(t->pub_mq_magic);

rt_free(t->sub_mq_magic);

return false;

}

}

return true;

}

static void mq_thread_A_entry(void *parameter)

{

rz_mq_magic_test_t *t = (rz_mq_magic_test_t *)parameter;

mq_magic_frame_t buff;

buff.head = 0x0A050A05;

int count = 0;

while(1)

{

count++;

if (RT_EOK == rz_mq_magic_recv((mq_magic_t *)t->sub_mq_magic, &buff, RT_WAITING_NO)) {

rt_kprintf("%s(): rz_mq_magic_recv success.value = %d\r\n", __FUNCTION__, buff.value);

}

if (count > 10) {

continue;

}

buff.value = count;

if (RT_EOK == rz_mq_magic_send((mq_magic_t *)t->pub_mq_magic, &buff)) {

rt_kprintf("%s(): rz_mq_magic_send success.value = %d\r\n", __FUNCTION__, buff.value);

}

rt_thread_delay(100);

}

}

static void mq_thread_B_entry(void *parameter)

{

rz_mq_magic_test_t *t = (rz_mq_magic_test_t *)parameter;

mq_magic_frame_t buff;

buff.head = 0x55AA55AA;

int count = 0;

while(1)

{

if (RT_EOK == rz_mq_magic_recv((mq_magic_t *)t->sub_mq_magic, &buff, RT_WAITING_NO)) {

rt_kprintf("%s(): rz_mq_magic_recv success.value = %d\r\n", __FUNCTION__, buff.value);

count++;

if (count == 6) {

buff.value = 100 + count;

if (RT_EOK == rz_mq_magic_send((mq_magic_t *)t->pub_mq_magic, &buff)) {

rt_kprintf("%s(): rz_mq_magic_send success.value = %d\r\n", __FUNCTION__, buff.value);

}

}

}

}

}

static void mq_thread_C_entry(void *parameter)

{

rz_mq_magic_test_t *t = (rz_mq_magic_test_t *)parameter;

mq_magic_frame_t buff;

buff.head = 0x0A050A05;

while(1)

{

if (RT_EOK == rz_mq_magic_recv((mq_magic_t *)t->sub_mq_magic, &buff, RT_WAITING_NO)) {

rt_kprintf("%s(): rz_mq_magic_recv success.value = %d\r\n", __FUNCTION__, buff.value);

}

}

}

int mq_magic_test(void)

{

#define RTHREAD_PRIORITY_MQ_MAGIC_TEST 31

#define THREAD_STACK_SIZE_MQ_MAGIC_TEST 1024

#define THREAD_TIMESLICE_MQ_MAGIC_TEST 5

/* mq_magic init */

rz_mq_magic_init();

rz_mq_magic_test_t *prz_mq_magic_A = (rz_mq_magic_test_t *)rt_malloc(sizeof(*prz_mq_magic_A));

if (RT_NULL != prz_mq_magic_A) {

prz_mq_magic_A->init = rz_mq_magic_test_init;

prz_mq_magic_A->pub_topic = 12;

prz_mq_magic_A->sub_topic = 13;

prz_mq_magic_A->init(prz_mq_magic_A);

} else {

rt_kprintf("%s(),line %d, malloc failed\r\n", __FUNCTION__, __LINE__);

return 0;

}

/* thread A */

prz_mq_magic_A->mq_tid =

rt_thread_create("mq_thread_A",

mq_thread_A_entry, prz_mq_magic_A,

THREAD_STACK_SIZE_MQ_MAGIC_TEST,

RTHREAD_PRIORITY_MQ_MAGIC_TEST,

THREAD_TIMESLICE_MQ_MAGIC_TEST);

if (RT_NULL != prz_mq_magic_A->mq_tid) {

rt_thread_startup(prz_mq_magic_A->mq_tid);

}

/* thread B */

rz_mq_magic_test_t *prz_mq_magic_B = (rz_mq_magic_test_t *)rt_malloc(sizeof(*prz_mq_magic_B));

if (RT_NULL != prz_mq_magic_B) {

prz_mq_magic_B->init = rz_mq_magic_test_init;

prz_mq_magic_B->pub_topic = 13;

prz_mq_magic_B->sub_topic = 12;

prz_mq_magic_B->init(prz_mq_magic_B);

} else {

rt_kprintf("%s(),line %d, malloc failed\r\n", __FUNCTION__, __LINE__);

return 0;

}

prz_mq_magic_B->mq_tid =

rt_thread_create("mq_thread_B",

mq_thread_B_entry, prz_mq_magic_B,

THREAD_STACK_SIZE_MQ_MAGIC_TEST,

RTHREAD_PRIORITY_MQ_MAGIC_TEST,

THREAD_TIMESLICE_MQ_MAGIC_TEST);

if (RT_NULL != prz_mq_magic_B->mq_tid) {

rt_thread_startup(prz_mq_magic_B->mq_tid);

}

/* thread C */

rz_mq_magic_test_t *prz_mq_magic_C = (rz_mq_magic_test_t *)rt_malloc(sizeof(*prz_mq_magic_C));

if (RT_NULL != prz_mq_magic_C) {

prz_mq_magic_C->init = rz_mq_magic_test_init;

prz_mq_magic_C->pub_topic = 14;

prz_mq_magic_C->sub_topic = 13;

prz_mq_magic_C->init(prz_mq_magic_C);

} else {

rt_kprintf("%s(),line %d, malloc failed\r\n", __FUNCTION__, __LINE__);

return 0;

}

prz_mq_magic_C->mq_tid =

rt_thread_create("mq_thread_C",

mq_thread_C_entry, prz_mq_magic_C,

THREAD_STACK_SIZE_MQ_MAGIC_TEST,

RTHREAD_PRIORITY_MQ_MAGIC_TEST,

THREAD_TIMESLICE_MQ_MAGIC_TEST);

if (RT_NULL != prz_mq_magic_C->mq_tid) {

rt_thread_startup(prz_mq_magic_C->mq_tid);

}

return 0;

}

MSH_CMD_EXPORT(mq_magic_test, RT-Thread first led sample);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值