В запросе представлен текст на языке C.
Перевод текста на русский язык:
В пользовательском файле *.c реализовать этот хук-функцию, например:
void *msg_3_dup_hook(void *args)
{
struct msg_3_def *msg_3 = (struct msg_3_def *) args;
struct msg_3_def *r_msg_3 = rt_calloc(1, sizeof(struct msg_3_def));
if (r_msg_3 == RT_NULL)
{
return RT_NULL;
}
rt_memcpy((rt_uint8_t *) r_msg_3, (rt_uint8_t *) msg_3, sizeof(struct msg_3_def));
if (msg_3->buffer && msg_3->buffer_size > 0)
{
r_msg_3->buffer = rt_calloc(1, msg_3->buffer_size);
if (r_msg_3->buffer == RT_NULL)
{
rt_free(r_msg_3);
return RT_NULL;
}
rt_memcpy(r_msg_3->buffer, msg_3->buffer, msg_3->buffer_size);
r_msg_3->buffer_size = msg_3->buffer_size;
}
return r_msg_3;
}
void msg_3_release_hook(void *args)
{
struct msg_3_def *msg_3 = (struct msg_3_def *) args;
if (msg_3->buffer)
rt_free(msg_3->buffer);
}
task_msg_bus_init(); //инициализировать сообщения шины, уже импортировано в функцию автоматического инициализации компонента INIT_COMPONENT_EXPORT(task_msg_bus_init)
Вызов этой функции динамически создаст один поток рассылки сообщений шины.
static void net_reday_callback(task_msg_args_t args)
{
LOG_D("[net_reday_callback]:TASK_MSG_NET_REDAY => args->msg_name:%d, args->msg_obj:%s", args->msg_name, args->msg_obj);
}
task_msg_subscribe(TASK_MSG_NET_REDAY, net_reday_callback);
task_msg_unsubscribe(TASK_MSG_NET_REDAY, net_reday_callback);
Без содержимого сообщения:
task_msg_publish(TASK_MSG_OS_REDAY, RT_NULL);
Текстовое/JSON сообщение:
char msg_text[50];
rt_snprintf(msg_text, 50, "{\"net_reday\":%d,\"ip\":\"%s\",\"id\":%ld}", 1, "10.0.0.20", i);
task_msg_publish(TASK_MSG_NET_REDAY, msg_text);
Сообщение типа структуры (без динамического выделения памяти для внутренних полей):
struct msg_2_def msg_2;
msg_2.id = i;
rt_snprintf(msg_2.name, 8, "%s\0", "hello");
task_msg_publish_obj(TASK_MSG_2, &msg_2, sizeof(struct msg_2_def));
Сообщение типа структуры (с динамическим выделением памяти для внутренних полей):
const char buffer_test[32] = {
0x0F, 0x51, 0xEE, 0x89, 0x9D, 0x40, 0x80, 0x22, 0x63, 0x44, 0x43, 0x39, 0x55, 0x2D, 0x12, 0xA1,
0x1C, 0x91, 0xE5, 0x2C, 0xC4, 0x6A, 0x62, 0x5B, 0xB6, 0x41, 0xF0, 0xF7, 0x75, 0x48, 0x05, 0xE9
};
struct msg_3_def msg_3;
msg_3.id = i;
rt_snprintf(msg_3.name, 8, "%s\0", "slyant");
msg_3.buffer = rt_calloc(1, 32);
rt_memcpy(msg_3.buffer, buffer_test, 32);
msg_3.buffer_size = 32;
task_msg_publish_obj(TASK_MSG_3, &msg_3, sizeof(struct msg_3_def));
rt_free(msg_3.buffer);
Приём определённого сообщения:
static void msg_wait_thread_entry(void *params)
{
rt_err_t rst;
task_msg_args_t args;
//создать подписчика на сообщения
int subscriber_id = task_msg_subscriber_create(TASK_MSG_NET_REDAY);
if(subscriber_id < 0) return;
while(1)
{
rst = task_msg_wait_until(subscriber_id, 50, &args);
if(rst==RT_EOK)
{
LOG_D("[task_msg_wait_until]:TASK_MSG_NET_REDAY => args.msg_name:%d, args.msg_obj:%s", args->msg_name, args->msg_obj);
rt_thread_mdelay(200);//имитировать ресурсоёмкую операцию, во время которой опубликованные сообщения не будут потеряны
//освободить сообщение
task_msg_release(args);
}
else
{
//можно выполнить другие операции, во время которых опубликованные сообщения не будут потеряны
}
}
}
rt_thread_t t_wait = rt_thread_create("msg_wt", msg_wait_thread_entry, RT_NULL, 512, 17, 10);
rt_thread_startup(t_wait);
Одновременный приём нескольких определённых сообщений:
static void msg_wait_any_thread_entry(void *params)
{
rt_err_t rst;
task_msg_args_t args = RT_NULL;
const enum task_msg_name name_list[4] = {TASK_MSG_OS_REDAY, TASK_MSG_NET_REDAY, TASK_MSG_2, TASK_MSG_3};
//создать много подписчиков на сообщения
int subscriber_id = task_msg_subscriber_create2(name_list, sizeof(name_list)/sizeof(enum task_msg_name));
if(subscriber_id < 0) return;
while(1)
{
rst = task_msg_wait_until(subscriber_id, 50, &args);
if(rst==RT_EOK)
{
if(args->msg_name==TASK_MSG_OS_REDAY)
{
LOG_D("[task_msg_wait_any]:TASK_MSG_OS_REDAY => msg_obj is null:%s",
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )