22
185
1531
助理工程师
typedef struct msg_node{ void *parm; void (*handler)(void *parm); }msg_node_t; /* 消息数据结构 */ typedef struct msg_driver{ unsigned int in; //写入的位置 unsigned int out; //读出的位置 msg_node_t *buf[MSG_DRIVER_SIZE]; }msg_driver_t;
使用特权
bool publish_msg(msg_driver_t *msg_buf, msg_node_t *msg) { if( is_msg_buf_full (msg_buf) == TRUE ) { return FALSE; } msg_buf->buf[msg_buf->in] = msg; msg_buf->in = (++msg_buf->in) % MSG_DRIVER_SIZE; //防止越界 return TRUE; }
static msg_node_t *get_messge(msg_driver_t *msg_buf) { msg_node_t *msg = NULL; if( is_msg_buf_empty(msg_buf) ) { return NULL; } msg = msg_buf->buf[msg_buf->out]; msg_buf->out = (++msg_buf->out) % MSG_DRIVER_SIZE; //防止越界 return msg; }
从队列循环取出消息处理:
由于每次发布消息都是送的处理函数指针,所以处理函数都不用修改。
void message_driver_handle(msg_driver_t *msg_buf) { msg_node_t *msg; while( (msg = get_messge(msg_buf)) != NULL ) { if (msg->handler != NULL) msg->handler(msg->parm); } }
msg_driver_t msg_driver; static void msg1_handle(void *parm) { printf("gets msg1\r\n"); } static void msg2_handle(void *parm) { printf("get msg2\r\n"); } static void msg3_handle(void *parm) { printf("do msg3\r\n"); } msg_node_t msg1 = { .parm = "I love u", .handler = msg1_handle }; msg_node_t msg2 = { .parm = "I hate u", .handler = msg2_handle }; msg_node_t msg3 = { .parm = NULL, .handler = msg3_handle }; publish_msg(&msg_driver, &msg1); publish_msg(&msg_driver, &msg2); publish_msg(&msg_driver, &msg3); int main(void) { while(1) { message_driver_handle(&msg_driver); } }
2026
1万
4万
版主
64
3317
9957
技术达人
96
3309
9964
62
9984
45
3310
9948
78
3313
9954
发表回复 本版积分规则 回帖后跳转到最后一页
时间类勋章
人才类勋章
发帖类勋章
等级类勋章
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注21ic项目外包
扫码关注21ic视频号
扫码关注21ic抖音号
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才 | 论坛帮助
京公网安备 11010802024343号