提取的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. asp.net 导出EXCEL超高兼容(不用装Excel)

    用网上的代码你会发现,下载下来后,会提示"你尝试打开的的文件的格式与文件扩展名指定的格式不一致 请验证文件没有损坏且来源可信的提示,研究了好久 后来发现可以使用人家做好的组件NOPI去实现, ...

  2. 【转】web测试技术经典案例(基础、全面)

    觉得有些内容还是挺实用的,就转了 1. 概述 随着web应用的增多,新的模式解决方案中以web为核心的应用也越来越多,很多公司各种应用的架构都以B/S及web应用为主,但是有关WEB测试方面的内容并没 ...

  3. C++ 引用本质的详解

    //引用本质的理解① #include<iostream> using namespace std; int GetA(){ ; return a; } int & GetB(){ ...

  4. zabbix 监控 AWS-SQS 队列

    zabbix-AWS_SQS-monitor AWS SQS status monitor with zabbix zabbix通过 AWS 云 api 自动发现.监控 AWS-SQS 本版本数据的图 ...

  5. php -- php获取ip地址和主机名

    客户端IP相关的变量1. $_SERVER['REMOTE_ADDR']; 客户端IP,有可能是用户的IP,也有可能是代理的IP. 2. $_SERVER['HTTP_CLIENT_IP']; 代理端 ...

  6. 【BZOJ】1636: [Usaco2007 Jan]Balanced Lineup(rmq+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1636 (我是不会说我看不懂题的) 裸的rmq.. #include <cstdio> # ...

  7. Cocos2d-X中的Slider控件

    Slider控件事实上就是滑块控件.经常使用于音乐中的音量控制,在Windows编程中开发音乐播放器就须要用到滑块控件控制音量 首先在project文件夹下的Resource文件夹中放 在Skider ...

  8. jquery widgets grid 重置列配置

    $("#jqxGridByAttendanceDetail").on("bindingcomplete", function (event) { // your ...

  9. 详谈JavaScript 匿名函数及闭包

    1.匿名函数函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种:这 ...

  10. ASP.NET MVC 随想录

    http://www.cnblogs.com/OceanEyes/category/696137.html