thread msg

提取的nordic rf51xx/rf52xx sdk中的线程间消息通信机制,非常简洁

demo.c

#include <stdio.h>
#include <stdlib.h>
#include "app_scheduler.h"

#define SCHED_MAX_EVENT_DATA_SIZE          20      /**< Maximum size of scheduler events. */
#define SCHED_QUEUE_SIZE                 200  /**< Maximum size of scheduler queue. */
#define scheduler_init() APP_SCHED_INIT(SCHED_MAX_EVENT_DATA_SIZE, SCHED_QUEUE_SIZE)

typedef enum {
    THREAD_INIT,
    DEMO_TEST,
    //add your msg
}msg_id_t;

typedef struct {
  uint8_t id;
  uint8_t len;
  uint8_t *data;
}thread_msg_t;

static void msg_send_to_back(void *handler, void *msg, bool use_scher){
  if(handler==0)return;
  if(use_scher)
     app_sched_event_put(msg,sizeof(thread_msg_t),(app_sched_event_handler_t)handler);
  else
    ((app_sched_event_handler_t)handler)(msg,sizeof(thread_msg_t));
}

static void demo2_thread(void *para, uint16_t para_size)
{
    printf("demo2_thread!
");
    thread_msg_t msg=*((thread_msg_t *)para);
    {
        switch(msg.id){
            case DEMO_TEST:{
                printf("%d,%d,%s 
",msg.id, msg.len, msg.data);
            }
            break;
        }
    }
}

static void demo1_thread(void *para, uint16_t para_size)
{
    printf("demo1_thread!
");
    const *data = "hello,world !";
    thread_msg_t msg={DEMO_TEST,sizeof(thread_msg_t),data};
    msg_send_to_back((void *)demo2_thread,&msg,true);
}

int main()
{
    scheduler_init();

    thread_msg_t msg={THREAD_INIT,0,0};
    msg_send_to_back((void *)demo1_thread,&msg,true);

    printf("ready go!
");
    for(;;){
      app_sched_execute();
    }
    return 0;
}

demo2.c

#include <stdio.h>
#include <stdlib.h>
#include "app_scheduler.h"

#define SCHED_MAX_EVENT_DATA_SIZE          20      /**< Maximum size of scheduler events. */
#define SCHED_QUEUE_SIZE                 200  /**< Maximum size of scheduler queue. */
#define scheduler_init() APP_SCHED_INIT(SCHED_MAX_EVENT_DATA_SIZE, SCHED_QUEUE_SIZE)

typedef enum {
    THREAD_INIT,
    DEMO_TEST,
    //add your msg
}msg_id_t;

typedef struct {
  uint8_t id;
  uint8_t len;
  uint8_t *data;
}thread_msg_t;

void *demo1_thread_queue=0;
void *demo2_thread_queue=0;

static void msg_send_to_back(void *handler, void *msg, bool use_scher){
  if(handler==0)return;
  if(use_scher)
     app_sched_event_put(msg,sizeof(thread_msg_t),(app_sched_event_handler_t)handler);
  else
    ((app_sched_event_handler_t)handler)(msg,sizeof(thread_msg_t));
}

void demo2_thread(void *para, uint16_t para_size)
{
    printf("demo2_thread!
");
    thread_msg_t msg=*((thread_msg_t *)para);
    {
        switch(msg.id){
            case DEMO_TEST:{
                printf("%d,%d,%s 
",msg.id, msg.len, msg.data);
            }
            break;
        }
    }
}

void demo1_thread(void *para, uint16_t para_size)
{
    printf("demo1_thread!
");
    const *data = "hello,world !";
    thread_msg_t msg={DEMO_TEST,sizeof(thread_msg_t),data};
    msg_send_to_back(demo2_thread_queue,&msg,true);
}

int main()
{
    scheduler_init();

    demo1_thread_queue=(void *)demo1_thread;
    demo2_thread_queue=(void *)demo2_thread;

    thread_msg_t msg={THREAD_INIT,0,0};
    msg_send_to_back((void *)demo1_thread_queue,&msg,true);

    printf("ready go!
");
    for(;;){
      app_sched_execute();
    }
    return 0;
}

https://github.com/zhoudd1/scheduler

原文地址:https://www.cnblogs.com/dong1/p/9825036.html