ThreadX学习笔记(7)事件标志_threadx event-程序员宅基地

技术标签: 学习  笔记  

文章参考:

ThreadX学习(8)——事件标志_tx_event_flags_set-程序员宅基地

1.tx_event_flags_create
TX_EVENT_FLAGS_GROUP group_ptr;//先定义再创建

UINT  tx_event_flags_create(TX_EVENT_FLAGS_GROUP *group_ptr, CHAR *name_ptr)

创建事件标志组:

第 1 个参数 group_ptr 是事件标志组控制块指针。
第 2 个参数 name_ptr 是事件标志组名称字符串。
返回值:
TX_SUCCESS: (0x00) 成功。
TX_GROUP_ERROR:(0x06)无效的事件组指针。要么指针为NULL,要么事件组已经创建。
X_CALLER_ERROR:(0x13)无效的服务调用者。

示例代码显示事件标志组已经创建成功。


VOID tx_application_define(void  *first_unused_memory)
{
	char buffer[256];
	UINT aa= tx_semaphore_create(&semaphore_ptr,"semaphore 0",1);
	snprintf(buffer,sizeof(buffer),"%u\n",aa);
	HAL_UART_Transmit(&huart1,(uint8_t *)buffer,strlen(buffer),HAL_MAX_DELAY);
	UINT bb = tx_event_flags_create(&group_ptr,"group 0");
	huartsend(bb);
  tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0,  
            thread_0_stack, DEMO_STACK_SIZE, 
            1, 1, 10, TX_AUTO_START);
	tx_thread_create(&thread_1, "Thread 1", thread_1_entry, 0,
                     thread_1_stack, DEMO_STACK_SIZE,
                     2, 2, TX_NO_TIME_SLICE, TX_AUTO_START);
}
void thread_1_entry(ULONG thread_input)
{
	CHAR *name;
	ULONG current_flags;
	TX_THREAD *first_suspended;
	ULONG suspended_count;
	TX_EVENT_FLAGS_GROUP *next_group;
	
	char cc[]="线程2\n";
	HAL_UART_Transmit(&huart1, (uint8_t *)cc, strlen(cc), HAL_MAX_DELAY);
	char buffer[256];
	UINT aa=tx_event_flags_info_get(&group_ptr,
	                         &name, 
	                         &current_flags,
	                         &first_suspended,
	                         &suspended_count,
	                         &next_group);
	snprintf(buffer,sizeof(buffer),"name:%s\ncurrent_flags;%lu\nsuspended_count;%lu\n",name,current_flags,suspended_count);
	HAL_UART_Transmit(&huart1,(uint8_t *)buffer,strlen(buffer),HAL_MAX_DELAY);
}

2. tx_event_flags_info_get
UINT tx_event_flags_info_get(TX_EVENT_FLAGS_GROUP *group_ptr,
	                         CHAR **name, 
	                         ULONG *current_flags,
	                         TX_THREAD **first_suspended,
	                         ULONG *suspended_count,
	                         TX_EVENT_FLAGS_GROUP **next_group);

获取事件标志组信息:

第 1 个参数 group_ptr 是事件标志组控制块指针。
第 2 个参数 name 是事件标志组名字符串,获取后存储的指针。
第 3 个参数 current_flags 是事件标志组的值,所存储的指针。
第 4 个参数 first_suspended 是请求该事件标志组的挂起列表的第一个线程TCB,所存储的指针。
第 5 个参数 suspended_count 是请求该事件标志组被挂起的线程数,所存储的指针。
第 6 个参数 next_group 是下一个事件标志组,所存储的指针。
返回值:
TX_SUCCESS:(0x00)成功。
TX_GROUP_ERROR:(0x06)无效的事件组指针。

相关示例代码已经在上一个函数写了。

3.tx_event_flags_delete
UINT  tx_event_flags_delete(TX_EVENT_FLAGS_GROUP *group_ptr)

删除事件标志组:

第 1 个参数 group_ptr 是事件标志组控制块指针。

返回值:

TX_SUCCESS: (0x00) 成功。

TX_GROUP_ERROR:(0x06)无效的事件组指针。

TX_CALLER_ERROR:(0x13)无效的服务调用者。

在事件标志组创建函数的示例代码后面写事件标志组删除函数,并用串口打印返回值,可以看到成功删除事件标志组。

void thread_1_entry(ULONG thread_input)
{
	CHAR *name;
	ULONG current_flags;
	TX_THREAD *first_suspended;
	ULONG suspended_count;
	TX_EVENT_FLAGS_GROUP *next_group;
	
	char cc[]="线程2\n";
	HAL_UART_Transmit(&huart1, (uint8_t *)cc, strlen(cc), HAL_MAX_DELAY);
	char buffer[256];
	UINT aa=tx_event_flags_info_get(&group_ptr,
	                         &name, 
	                         &current_flags,
	                         &first_suspended,
	                         &suspended_count,
	                         &next_group);
	snprintf(buffer,sizeof(buffer),"name:%s\ncurrent_flags;%lu\nsuspended_count;%lu\n",name,current_flags,suspended_count);
	HAL_UART_Transmit(&huart1,(uint8_t *)buffer,strlen(buffer),HAL_MAX_DELAY);
	UINT bb=tx_event_flags_delete(&group_ptr);
	huartsend(bb);
}

 4.tx_event_flags_get
UINT  tx_event_flags_get(   TX_EVENT_FLAGS_GROUP *group_ptr, 
							ULONG requested_flags,
							UINT get_option, 
							ULONG *actual_flags_ptr, 
							ULONG wait_option)

示例代码展示了当事件标志组设置函数设置的标志位不满足线程的事件标志时,时间会挂起,后续程序不会继续运行。只有事件标志组设置函数标志位设置成满足现成的事件标志时,才会继续运行程序。 

void thread_1_entry(ULONG thread_input)
{
	CHAR *name;
	ULONG current_flags;
	TX_THREAD *first_suspended;
	ULONG suspended_count;
	TX_EVENT_FLAGS_GROUP *next_group;
	
	ULONG actual_flags_ptr;
	
	char cc[]="线程2\n";
	HAL_UART_Transmit(&huart1, (uint8_t *)cc, strlen(cc), HAL_MAX_DELAY);
	char buffer[256];
	UINT aa=tx_event_flags_info_get(&group_ptr,
	                         &name, 
	                         &current_flags,
	                         &first_suspended,
	                         &suspended_count,
	                         &next_group);
	snprintf(buffer,sizeof(buffer),"name:%s\ncurrent_flags;%lu\nsuspended_count;%lu\n",name,current_flags,suspended_count);
	HAL_UART_Transmit(&huart1,(uint8_t *)buffer,strlen(buffer),HAL_MAX_DELAY);
	
	UINT bb=tx_event_flags_set(&group_ptr,
                        0x6,
                        TX_OR);
	UINT gg=tx_event_flags_info_get(&group_ptr,
	                         &name, 
	                         &current_flags,
	                         &first_suspended,
	                         &suspended_count,
	                         &next_group);
	snprintf(buffer,sizeof(buffer),"name:%s\ncurrent_flags;%lu\nsuspended_count;%lu\n",name,current_flags,suspended_count);
	HAL_UART_Transmit(&huart1,(uint8_t *)buffer,strlen(buffer),HAL_MAX_DELAY);
	UINT ee= tx_event_flags_get(&group_ptr, 
							0x7,
							TX_AND, 
							&actual_flags_ptr, 
							TX_WAIT_FOREVER);
	UINT ff=tx_event_flags_info_get(&group_ptr,
	                         &name, 
	                         &current_flags,
	                         &first_suspended,
	                         &suspended_count,
	                         &next_group);
	snprintf(buffer,sizeof(buffer),"name:%s\ncurrent_flags;%lu\nsuspended_count;%lu\n",name,current_flags,suspended_count);
	HAL_UART_Transmit(&huart1,(uint8_t *)buffer,strlen(buffer),HAL_MAX_DELAY);
	char hh[]="www\n";
	HAL_UART_Transmit(&huart1, (uint8_t *)cc, strlen(cc), HAL_MAX_DELAY);
}

 将事件标志组设置函数中的0x6参数变成0x7

void thread_1_entry(ULONG thread_input)
{
	CHAR *name;
	ULONG current_flags;
	TX_THREAD *first_suspended;
	ULONG suspended_count;
	TX_EVENT_FLAGS_GROUP *next_group;
	
	ULONG actual_flags_ptr;
	
	char cc[]="线程2\n";
	HAL_UART_Transmit(&huart1, (uint8_t *)cc, strlen(cc), HAL_MAX_DELAY);
	char buffer[256];
	UINT aa=tx_event_flags_info_get(&group_ptr,
	                         &name, 
	                         &current_flags,
	                         &first_suspended,
	                         &suspended_count,
	                         &next_group);
	snprintf(buffer,sizeof(buffer),"name:%s\ncurrent_flags;%lu\nsuspended_count;%lu\n",name,current_flags,suspended_count);
	HAL_UART_Transmit(&huart1,(uint8_t *)buffer,strlen(buffer),HAL_MAX_DELAY);
	
	UINT bb=tx_event_flags_set(&group_ptr,
                        0x7,
                        TX_OR);
	UINT gg=tx_event_flags_info_get(&group_ptr,
	                         &name, 
	                         &current_flags,
	                         &first_suspended,
	                         &suspended_count,
	                         &next_group);
	snprintf(buffer,sizeof(buffer),"name:%s\ncurrent_flags;%lu\nsuspended_count;%lu\n",name,current_flags,suspended_count);
	HAL_UART_Transmit(&huart1,(uint8_t *)buffer,strlen(buffer),HAL_MAX_DELAY);
	UINT ee= tx_event_flags_get(&group_ptr, 
							0x7,
							TX_AND, 
							&actual_flags_ptr, 
							TX_WAIT_FOREVER);
	UINT ff=tx_event_flags_info_get(&group_ptr,
	                         &name, 
	                         &current_flags,
	                         &first_suspended,
	                         &suspended_count,
	                         &next_group);
	snprintf(buffer,sizeof(buffer),"name:%s\ncurrent_flags;%lu\nsuspended_count;%lu\n",name,current_flags,suspended_count);
	HAL_UART_Transmit(&huart1,(uint8_t *)buffer,strlen(buffer),HAL_MAX_DELAY);
	char hh[]="www\n";
	HAL_UART_Transmit(&huart1, (uint8_t *)hh, strlen(hh), HAL_MAX_DELAY);
}

5.tx_event_flags_set 
UINT tx_event_flags_set(TX_EVENT_FLAGS_GROUP *group_ptr,
                        ULONG  flags_to_set,
                        UINT set_option);

设置事件标志:

第 1 个参数 group_ptr 是事件标志组控制块指针。
第 2 个参数 flags_to_set 是设置的事件标志,视设置选项而定。
第 3 个参数 set_option 是设置选项:
TX_AND: (0x02)将事件标志组旧值与flags_to_set进行“与”操作,一般用于对事件标志的清除,因此flags_to_set中的清除目标应该设为0。如旧值为0x11(0001 0001),要清除第0位,则flags_to_set为0xFE(1111 1110),最后变为(0001 0000)。
TX_OR: (0x00)将事件标志组旧值与flags_to_set进行“或”操作,一般用于对事件标志的设置,因此flags_to_set中的设置目标应该设为1。如旧值为0x11(0001 0001),要设置第1位,则flags_to_set为0x02(0000 0010),最后变成(0001 0011)。
返回值:
TX_SUCCESS: (0x00) 成功.
TX_GROUP_ERROR: (0x06) 无效的事件标志组指针.
TX_OPTION_ERROR: (0x08) 无效的设置选项.

相关示例代码在获取事件标志组函数中已经涉及。

6.tx_event_flags_set_notify
UINT tx_event_flags_set_notify( TX_EVENT_FLAGS_GROUP *group_ptr,
       							VOID (*events_set_notify)(TX_EVENT_FLAGS_GROUP *));

事件标志设置通知回调:

第 1 个参数 group_ptr 是事件标志组控制块指针。
第 2 个参数 events_set_notify 是事件标志设置通知函数的指针。如果该值为TX_NULL,则禁用通知。
返回值:
TX_SUCCESS: (0x00)成功注册事件标志设置通知。
TX_GROUP_ERROR:(0x06)无效的事件标志组指针。
TX_FEATURE_NOT_ENABLED: (0xFF)系统编译时禁用了通知功能。

示例代码展示了如何使用事件标志设置通知回调函数,这个函数需要在tx_application_define里私使用,同时需要声明相关事件标志设置通知函数。根据串口打印结果,表示事件标志设置通知回调函数成功调用。

VOID tx_application_define(void  *first_unused_memory)
{
	char buffer[256];
	UINT aa= tx_semaphore_create(&semaphore_ptr,"semaphore 0",1);
	snprintf(buffer,sizeof(buffer),"%u\n",aa);
	HAL_UART_Transmit(&huart1,(uint8_t *)buffer,strlen(buffer),HAL_MAX_DELAY);
	UINT bb = tx_event_flags_create(&group_ptr,"group 0");
	huartsend(bb);
	
	UINT cc= tx_event_flags_set_notify(&group_ptr, event_flags_notify_callback);
	//调用事件标志组设置通知函数
	huartsend(cc);
  tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0,  
            thread_0_stack, DEMO_STACK_SIZE, 
            1, 1, 10, TX_AUTO_START);
	tx_thread_create(&thread_1, "Thread 1", thread_1_entry, 0,
                     thread_1_stack, DEMO_STACK_SIZE,
                     2, 2, TX_NO_TIME_SLICE, TX_AUTO_START);
}
void event_flags_notify_callback(TX_EVENT_FLAGS_GROUP *event_flags_group)
{
    // 这里是回调函数的内容
    // 例如,我们可以发送一条消息或设置一个标志,表示事件已经发生
    HAL_UART_Transmit(&huart1, (uint8_t *)"Event Flag Set\n", strlen("Event Flag Set\n"), HAL_MAX_DELAY);
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_71240643/article/details/136571918

智能推荐

jquery mobile 使滚动条滚动到底部scrollTop函数无效的解决方法_jquery scrolltop没法到底部-程序员宅基地

文章浏览阅读5k次。$('body').scrollTop(100);我们使用上面的scrollTop函数时发现滚动后又闪回顶部,原因是在jquery mobile 中要使用另外的函数 $.mobile.silentScroll(100); 这个函数需要你点击DIV再调用才有效果,如果一开始就设置是没效果的像下面用是没效果的 $(document).ready(function() {_jquery scrolltop没法到底部

蓝桥杯第四届省赛模拟智能灌溉_第四届蓝桥杯单片机省赛 site:blog.csdn.net-程序员宅基地

文章浏览阅读649次。第四届省赛主要涉及到IIC和DS1302,在官方驱动基础上进行改动。#include <STC15F2K60S2.h>#include "ds1302.h"#include "iic.h"#define uchar unsigned char#define uint unsigned intuchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X9..._第四届蓝桥杯单片机省赛 site:blog.csdn.net

unity3D 实现物体(人物)移动到鼠标点击的位置_unity获取鼠标点击的位置,并将其赋值给物体1的坐标-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏45次。1、通过输入鼠标右键获取光标在屏幕上的坐标信息,if(Input.GetMouseButtonDown(1)){ Vector3 mousePosition= Input.MousePosition;}//此处获得的是光标在屏幕上的相对坐标,不方便直接使用。2、将该光标转化为世界坐标//从相机中打出一个经过mousePosition的射线Ray ray=Camera.main.ScreenP..._unity获取鼠标点击的位置,并将其赋值给物体1的坐标

uni-app vue-cli创建项目方式,打包成android ios手机apk_vueuniapp打包成-程序员宅基地

文章浏览阅读4k次,点赞2次,收藏13次。当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。文章演示Android打包,ios打包也差不多步骤(ios要自有证书,测试证书只能用在越狱手机上上)。项目基于vue-cli方式创建,打包成Android ios手机apk。第一步: 勾选需要打包为 Android 还是 ios 的手机apk。第三步:测试app包,选择公共测试证书就好了,正式上线选择自有证书。应用名称:打包后的Apk包名称。_vueuniapp打包成

Linux安装字体_可以讲windows上的字体放在linux服务器上吗-程序员宅基地

文章浏览阅读4.2k次。Windows下的ttf字体是可以在Linux上使用的,我们可以“盗用”Windows现成的字库,所以我们只需要把windows下的字体文件上传到Linux上,执行相关命令就行了。(1)创建目录mkdir -p /usr/share/fonts/my_fonts(2)将要安装的字体上传到该文件夹下这里我们安装黑体常规,即simhei.ttf。关于具体字体查找,我以windows为例。进入C:\Windows\Fonts,该文件夹下就存放相关字体,将simhei.tty拷贝到linux 目录/u_可以讲windows上的字体放在linux服务器上吗

【Ubuntu16.04】安装无线网卡驱动_ubuntu 16.04 连接 usb网卡-程序员宅基地

文章浏览阅读4.9w次,点赞6次,收藏29次。1、参考链接:https://blog.csdn.net/weijia_kmy/article/details/51304518昨天下载了ubuntu16.0.4,安装后发现没有wifi可连接,于是上网查了一个晚上,都没有可行的办法。无奈今早就又下载ubuntu15.10安装,发现可以连wifi。用了一会突然桌面没了。我的天!又捣鼓了一上午......也没好过来。个人感觉15.10没16.04好。..._ubuntu 16.04 连接 usb网卡

随便推点

通过angular cli混合应用程序将angularjs迁移到angular-程序员宅基地

文章浏览阅读690次。The purpose of this tutorial is to provide another way to do the migration from an AngularJS application to the latest version of Angular. At the time that this guideline was done, Angular is at the v..._convert to angularjs project的影响

PO系列之 PO中使用webService_sap po edit external definition-程序员宅基地

文章浏览阅读738次。一前言PO(/PI)是SAP公司的一个中间件产品,用来辅助连接SAP系统与外围系统. (当然外围系统之间也可以使用PO).作为中间件,PO支持很多与系统交互的方式(RESTful, SOAP ,JDBC, FILE )等等百度了一下 webService 与SOAP的关系(如图一)可以看出SOAP只是webService三要素之一, 用来描述传递信息的格式本文主要介绍webService在PO中的应用及特殊映射方式图一二ABAP与webServiceABAP可.._sap po edit external definition

通达信公式编写使用哪种计算机语言,通达信公式编写入门(附通达信经典实用选股公式).pdf...-程序员宅基地

文章浏览阅读7.1k次,点赞4次,收藏20次。通达信公式编写入门通达信公式入门公式编辑器快捷键: [Ctrl+F][.9]我们大多数的用户并不是完全了解“公式编辑器”的意义, 简单地,我们可以从以下几个角度进行理解:一、指标分析:“公 式编辑器”好比是一个工作母床,通过这个工作母床可以制造出所需要的各式各样的零件, 同样,在指标分析的工作中, 利用编辑器可以编写出相应的分析条件..._通达信编程3000例pdf

Cado-nfs使用-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏14次。Cado-nfs使用CADO-NFS是C / C ++中数字字段筛选(NFS)算法的完整实现,用于分解整数并计算有限字段中的离散对数。它包含与算法所有阶段相对应的各种程序,以及可能在计算机网络上并行运行它们的通用脚本。Cado-nfs gitlab地址1. Cado分解大整数命令非常简单,直接加上大整数即可./cado-nfs.py [大整数]举个栗子./cado-nfs.py 9037762929200312168400214710176085810924733654900109067_cado-nfs

Web开发 ------ 基于Django+Vue网上购物商城(一):数据库模型和xadmin后台设计_django 不要 admin-程序员宅基地

文章浏览阅读4.2k次,点赞6次,收藏48次。文章目录基于Django+Vue网上购物商城一、项目介绍1.技术难点2.系统功能3.项目环境4.后台管理页面二、项目准备创建Django工程报错 及解决三、数据库模型设计1.创建app包以及app里面的四个应用2.用户认证数据库模型设计(1)设计代码(2)settings中配置,替换系统的用户(3)settings中注册,到INSTALLED_APPS(4)迁移数据库2.商品管理模型设计(1)安装..._django 不要 admin

Idea导入jar包的两种方法_idea将前端jar包导入到后端-程序员宅基地

文章浏览阅读10w+次,点赞140次,收藏375次。今天用IDEA,需要导入一个Jar包,因为以前都是用eclipse的,所以对这个idea还不怎么上手,连打个Jar包都是谷歌了一下。但是发现网上谷歌到的做法一般都是去File –> Project Structure中去设置,有没有如同eclipse一样简便的右键添加方法呢。然后自己摸索了一下,找到了。以阿里大于的依赖包为例子,因为正好是我遇到要导入的Jar包。先说下第一种方法吧。也就是Fi..._idea将前端jar包导入到后端