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.何为线程 每个进程有一个地址空间,而且默认就有一个控制线程.如果把一个进程比喻为一个车间的工作过程那么线程就是车间里的一个一个流水线. 进程只是用来把资 ...
随机推荐
- 微信小程序 - dialog
实现了 标题,内容和按钮设置,可动态设置按钮,以及按钮点击事件的回调 可作为component 使用 直接上代码 //遮罩的代码 <viewclass="uiComponent uiC ...
- 最新Android面试题集锦
近期由于某些原因想换工作,整理一下个人认为面试中还比較值得记录的一些题目,给须要找这方面工作的人一个借鉴. 下面基本仅仅记录题目或者大概答案,假设大家有比較具体的解答或者比較好的面试题木,希望各位看到 ...
- Spring Boot注解(annotation)列表
(1)@SpringBootApplication 申明让spring boot自动给程序进行必要的配置,这个配置等同于: @Configuration ,@EnableAutoConfigurati ...
- Wamp2.5 64bit,无法改动MySQL datadir位置
今天偶然想到去更新一下机子里面PHP的版本号,然后又一次去wamp官网下载了WAMP(wamp 64 Apache : 2.4.9 MySQL : 5.6.17 PHP : 5.5.12 PHPMy ...
- Hadoop单机安装配置过程:
1. 首先安装JDK,必须是sun公司的jdk,最好1.6版本以上. 最后java –version 查看成功与否. 注意配置/etc/profile文件,在其后面加上下面几句: export JAV ...
- DLL入口函数
BOOL APIENTRY DllMain(HINSTANCE hInst /* Library instance handle. */, DWORD reason /* Rea ...
- centos-iptables-scripts
author:headsen chen date:2018-06-04 11:20:38 notice:This article is created by headsen chen himsel ...
- Eclipse 安装更多版本SDK
暂时记下,实在没时间测试了... 安卓应用开发之查eclipse版本号和添加ADT.SDK https://jingyan.baidu.com/article/b0b63dbfc5f49b4a4830 ...
- 电力项目七--js控制文字内容过长的显示和文本字数的显示
当文本框中文字内容过长时,需要调整显示的样式 如上图所示的样式 对应的代码为: <div id="showInfomation" style="visibility ...
- Tomcat上进行项目部署与WAR包含义
一.WAR包 1.与JAR包类似,是将java类(编译好的.class)和Web资源,压缩后生成压缩包. 2. 与JAR相比,多了WEB-INF文件夹,其它多出来的内容基本都是Web资源 WEB-IN ...