文章参考:
ThreadX学习(8)——事件标志_tx_event_flags_set-CSDN博客
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,
¤t_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,
¤t_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,
¤t_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,
¤t_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,
¤t_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,
¤t_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,
¤t_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,
¤t_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);
}