提取的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==)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!\n");
thread_msg_t msg=*((thread_msg_t *)para);
{
switch(msg.id){
case DEMO_TEST:{
printf("%d,%d,%s \n",msg.id, msg.len, msg.data);
}
break;
}
}
} static void demo1_thread(void *para, uint16_t para_size)
{
printf("demo1_thread!\n");
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,,};
msg_send_to_back((void *)demo1_thread,&msg,true); printf("ready go!\n");
for(;;){
app_sched_execute();
}
return ;
}

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=;
void *demo2_thread_queue=; static void msg_send_to_back(void *handler, void *msg, bool use_scher){
if(handler==)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!\n");
thread_msg_t msg=*((thread_msg_t *)para);
{
switch(msg.id){
case DEMO_TEST:{
printf("%d,%d,%s \n",msg.id, msg.len, msg.data);
}
break;
}
}
} void demo1_thread(void *para, uint16_t para_size)
{
printf("demo1_thread!\n");
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,,};
msg_send_to_back((void *)demo1_thread_queue,&msg,true); printf("ready go!\n");
for(;;){
app_sched_execute();
}
return ;
}

https://github.com/zhoudd1/scheduler

thread msg的更多相关文章

  1. #include <thread>

    1 detach 脱离当前主线程,自由执行,乱序; 2 join() 等待模式,执行完再执行下一个 3 std::this_thread::get_id() 获取当前线程编号 4 std::threa ...

  2. MFC用PostMessage传递消息

    1.自定义消息ID. #define WM_MY_MESSAGE (WM_USER+100)         WM_USER为windows系统为非系统消息保留的ID,这里至少要用100,因为其它控件 ...

  3. 使用 logback + slf4j 进行日志记录

    此处主要介绍maven web工程下如何使用 logback + slf4j  进行日志记录. logback主要包含三个组成部分:Loggers(日志记录器).Appenders(输出目的在).La ...

  4. 33、线程与全局解释器锁(GIL)

    之前我们学了很多进程间的通信,多进程并发等等,今天我们来学习线程,线程和进程是什么关系,进程和线程有什么相同而又有什么不同今天就来揭晓这个答案. 一.线程概论 1.何为线程 每个进程有一个地址空间,而 ...

  5. logback使用配置详解

    title: logback使用配置详解 date: 2017-04-25 16:42:49 tags: 日志 --- 1.介绍 Logback是由log4j创始人设计的另一个开源日志组件,它当前分为 ...

  6. android消息处理源码分析

    一.简介消息处理机制主要涉及到这几个类:1.Looper2.MessageQueue3.Message4.Handler 二.源码分析 Looper.class的关键源码: //保存Looper对象, ...

  7. slfj+logback

    1.pom.xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...

  8. log4j学习(二) 不要用log4j了,用slf4j + logback吧

    标题比较尴尬,log4j学习系列的最后一篇是放弃log4j    - -!  一. 简介 log4j的作者提出了slf4j,简单日志门面,相当于是一套统一的java日志api,是个接口标准,编程时使用 ...

  9. python中GIL和线程与进程

    线程与全局解释器锁(GIL) 一.线程概论 1.何为线程 每个进程有一个地址空间,而且默认就有一个控制线程.如果把一个进程比喻为一个车间的工作过程那么线程就是车间里的一个一个流水线. 进程只是用来把资 ...

随机推荐

  1. hdu4675 GCD of Sequence 莫比乌斯+组合数学

    /** 题目:hdu4675 GCD of Sequence 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4675 题意:给定n个数的a数组,以及m,k: ...

  2. 重启oracle方法一二三

    startup nomount alter database mount alter database open Linux:方法1 用root以ssh登录到linux,打开终端输入以下命令: cd ...

  3. python 2.7安装某些包出现错误:"libxml/xmlversion.h:没有那个文件或目录"

    解决办法: 1. ubuntu系统: 首先: apt-get install libxml2-dev sudo ln -s /usr/include/libxml2/libxml /usr/inclu ...

  4. css -- 运用@media实现网页自适应中的几个关键分辨率

    经常为不同分辨率设备或不同窗口大小下布局错位而头疼,可以利用@media screen实现网页布局的自适应,但是怎样兼容所有主流设备就成了问题.到底分辨率是多少的时候设置呢? 先看下面的代码,这是从b ...

  5. sdut 2159:Ivan comes again!(第一届山东省省赛原题,STL之set使用)

    Ivan comes again! Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 The Fairy Ivan gave Say ...

  6. zoj 1081:Points Within(计算几何,判断点是否在多边形内,经典题)

    Points Within Time Limit: 2 Seconds      Memory Limit: 65536 KB Statement of the Problem Several dra ...

  7. 【openwrt+arduion】案例

    http://www.geek-workshop.com/thread-4950-1-1.html http://www.guokr.com/article/319356/ http://www.gu ...

  8. 怎么绘制旋转Chem3D模型

    化学领域的专业人士常常需要绘制各种化学图形,特别是3D的图形,这个就需要用到一些化学绘图软件.Chem3D是ChemOffice的核心组件之一,可以绘制化学三维模型,包括新建.删除.旋转.移动等基础编 ...

  9. Leetcode: Merge/Insert Interval

    题目 Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[ ...

  10. Android 全局异常处理(三)

    用过安卓手机的用户以及安卓开发者们会时长碰到程序异常退出的情况,普通用户遇到这种情况,肯定非常恼火,甚至会骂一生垃圾软件,然后卸载掉.那么开发者们在开发过程中遇到这种情况给怎么办呢,当然,你不可能世界 ...