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==)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的更多相关文章
- #include <thread>
1 detach 脱离当前主线程,自由执行,乱序; 2 join() 等待模式,执行完再执行下一个 3 std::this_thread::get_id() 获取当前线程编号 4 std::threa ...
- MFC用PostMessage传递消息
1.自定义消息ID. #define WM_MY_MESSAGE (WM_USER+100) WM_USER为windows系统为非系统消息保留的ID,这里至少要用100,因为其它控件 ...
- 使用 logback + slf4j 进行日志记录
此处主要介绍maven web工程下如何使用 logback + slf4j 进行日志记录. logback主要包含三个组成部分:Loggers(日志记录器).Appenders(输出目的在).La ...
- 33、线程与全局解释器锁(GIL)
之前我们学了很多进程间的通信,多进程并发等等,今天我们来学习线程,线程和进程是什么关系,进程和线程有什么相同而又有什么不同今天就来揭晓这个答案. 一.线程概论 1.何为线程 每个进程有一个地址空间,而 ...
- logback使用配置详解
title: logback使用配置详解 date: 2017-04-25 16:42:49 tags: 日志 --- 1.介绍 Logback是由log4j创始人设计的另一个开源日志组件,它当前分为 ...
- android消息处理源码分析
一.简介消息处理机制主要涉及到这几个类:1.Looper2.MessageQueue3.Message4.Handler 二.源码分析 Looper.class的关键源码: //保存Looper对象, ...
- slfj+logback
1.pom.xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...
- log4j学习(二) 不要用log4j了,用slf4j + logback吧
标题比较尴尬,log4j学习系列的最后一篇是放弃log4j - -! 一. 简介 log4j的作者提出了slf4j,简单日志门面,相当于是一套统一的java日志api,是个接口标准,编程时使用 ...
- python中GIL和线程与进程
线程与全局解释器锁(GIL) 一.线程概论 1.何为线程 每个进程有一个地址空间,而且默认就有一个控制线程.如果把一个进程比喻为一个车间的工作过程那么线程就是车间里的一个一个流水线. 进程只是用来把资 ...
随机推荐
- zend stdio 快捷键
1.快速跳转到当前所指的函数.变量.方法.类的定义处 F3或者 ctrl+鼠标左键2.ctrl+m 编辑窗口最大化3.ctrl+d 删除当前行4.ctrl+q 定位到最后编辑的地方(全局的)5.ctr ...
- 你所不知道的JSON
译者按: 老司机们,你知道JSON.stringify还有第二个和第三个可选参数吗?它们是什么呢? JSON已经逐渐替代XML被全世界的开发者广泛使用.本文深入讲解JavaScript中使用JSON. ...
- Linux环境PHP7.0.2安装
PHP7和HHVM比较PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM.HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导致crash了, 那么整个服务就挂 ...
- javascript jquery数组操作小结
----------------------------------------------------------定义数组-------------------------------------- ...
- 关于Unity中调试C#的方法
1.断点输出语句 在感觉有问题的地方的上下文写一些输出语句,如果控制台只有输出上文,没有输出下文,那么可以知道,上下文之间的语句有问题,因为下文没执行到,没有输出语句. Debug.Log(" ...
- Python之修改文件MD5值
import os def fileAppend(filename): myfile = open(filename,'a') myfile.write("####&&&am ...
- JSP 页面中用绝对路径显示图片
首先,图片和工程不在一个盘符下.图片也不能放到工程下. 在JSP 文件中 <img src="E:/图片/1.jpg"/> 这样是引不到图片的.因为,JSP页面在引 ...
- 在CentOS上安装Java环境
如何使用yum方式在CentOS上安装Java环境,系统以CentOS6.4为例. 工具/原料 Java JDK yum库 CentOS6.4 方法/步骤 1 查看CentOS自带JDK是否已安装. ...
- 如何用ChemDraw绘制化学课件
近年来随着ChemDraw等多媒体技术的迅速发展,多媒体技术越来越多的应用在教学中.学会应用ChemDraw绘制化学分子结构.化学反应式和实验装置的方法,将在有机化学的教学中提供一定的帮助,进一步提高 ...
- MyEclipse10.6 安装SVN插件方法及插件下载地址
今天MyEclipse10.6出了点问题,所以重装了它,同一时候也把svn的插件重装了一次,把网上资源和自己的经历顺便在博客这里记录一下.建议直接看方法一好了,简单方便,不必要折腾太多. 下来 ...