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.何为线程 每个进程有一个地址空间,而且默认就有一个控制线程.如果把一个进程比喻为一个车间的工作过程那么线程就是车间里的一个一个流水线. 进程只是用来把资 ...
随机推荐
- RAII in C++
在C++中,如果对一个块直接分配资源,而且在释放资源之前发生异常,那么这些资源在栈展开(注1)期间将不会得到释放.例如,一个块可以通过调用new动态分配内存,如果该块因异常退出,编译器将不会删除该指针 ...
- macosx下apache的默认用户为daemon
环境macosx, xampp. 其中apache的默认账户为daemon,若想对htdocs下的文件做写操作,必须改动该文件夹的用户权限: chown daemon:daemon MYDIR chm ...
- Oracle Data Provider for .NET的使用(三)-ORACLE与.NET类型对应关系
想来这个是最重要的事情了,因为多数情况下,我们使用dbhelper来调用数据库的时候,是因为如下三个地方导致错误: 1.错误的sql语句:末尾多了分号,少了部分关键字 2.sql中的参数与parame ...
- 系统管理模块_部门管理_改进_抽取添加与修改JSP页面中的公共代码_在显示层抽取BaseAction_合并Service层与Dao层
系统管理模块_部门管理_改进1:抽取添加与修改JSP页面中的公共代码 commons.jspf <%@ page language="java" import="j ...
- RF中空列表变量不能直接赋至为[]
RF中空列表正确定义方法为:
- NestedScrollView,RecyclerView
为什么把它们放一起呢, 是因为它有着相同的特点 在新版的support-v4兼容包里面有一个NestedScrollView控件,这个控件其实和普通的ScrollView并没有多大的区别,这个控件其实 ...
- springboot整合mybatis之用外置服务器启动项目(二)
在上一篇中我们是用的springboot自带的tomcat服务器,接下来想试一下 将springboot当做一个web项目 放在eclipse中用tomcat来启动. 首先在pom.xml中加上,移除 ...
- 模拟http请求 带 chunked解析办法二
以PHP代码为例 //这个是解析chuned块 get_chunk_data($fsock) { $data = ''; while(true) { $len = hexdec(fgets($fsoc ...
- 使用隧道技术进行C&C通信
一.C&C通信 这里的C&C服务器指的是Command & Control Server--命令和控制服务器,说白了就是被控主机的遥控端.一般C&C节点分为两种,C&a ...
- tomcat中文配置
tomcat传递中文乱码,修改server.xml文件 <Connector port=" protocol="HTTP/1.1" connectionTimeou ...