zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    小程序自定义组件(3)子向父传参
    postgresql插件安装
    二进制减法的实现
    mysql锁表问题
    mysql查看修改参数
    众数问题-找出超过一半的数
    只出现一次的数
    元素最大间距离
    第一个缺失数字
    局部最小值位置
  • 原文地址:https://www.cnblogs.com/dong1/p/9825036.html
Copyright © 2011-2022 走看看