内容参考:
ThreadX学习(5)——系统时钟和定时器_tx_timer_create-CSDN博客
1.tx_time_set
VOID tx_time_set(ULONG new_time)
设置内部系统时间:
- 第 1 个参数 new_time 是设置的内部系统时间新值。
示例代码先设置系统时钟为100个滴答,再调用tx_time_get函数,通过串口打印可以看到,已经成功设置系统时钟。
2.tx_time_get
ULONG tx_time_get(VOID)
获取内部系统时间:
返回值:
- ULONG类型,_tx_timer_system_clock的值。
相关代码已经在设置系统时间中展示。
3.tx_timer_create
TX_TIMER timer_ptr;//先定义一个定时器
UINT tx_timer_create( TX_TIMER *timer_ptr,
CHAR *name_ptr,
VOID (*expiration_function)(ULONG id),
ULONG expiration_input,
ULONG initial_ticks,
ULONG reschedule_ticks,
UINT auto_activate)
创建定时器:
第 1 个参数 timer_ptr 是定时器控制块指针。
第 2 个参数 name_ptr 是定时器名。
第 3 个参数 expiration_function 是定时器到期函数。
第 4 个参数 expiration_input 是定时器到期函数输入值。
第 5 个参数 initial_ticks 是定时器第一次定时滴答数。
第 6 个参数 reschedule_ticks 是第二次及以后的定时滴答数。
第 7 个参数 auto_activate 是定时器是否自动启用:
TX_AUTO_ACTIVATE(0x01):自动启用
其他值:暂不启用
返回值:
TX_SUCCESS(0x00)成功创建。
TX_TIMER_ERROR:(0x15)无效的应用程序计时器指针。要么指针是NULL,要么计时器已经创建。
TX_TICK_ERROR: (0x16)为初始计时提供的无效值(零)。
TX_ACTIVATE_ERROR: (0x17)无效的激活选择。
TX_CALLER_ERROR:(0x13)无效的服务调用者。
示例代码创建定时器,并且在定时器到期函数中通过串口发送数据,根据串口打印结果可以看到,成功创建定时器
VOID tx_application_define(void *first_unused_memory)
{
char buffer1[256];
UINT aa=tx_timer_create(&my_time,"mytime 0",time_0_entry,0,10,20,TX_AUTO_ACTIVATE);
snprintf(buffer1, sizeof(buffer1),"%u\n" ,aa);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer1, strlen(buffer1), HAL_MAX_DELAY);
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 time_0_entry(ULONG thread_input)
//线程1,控制led,只让他亮5s
{
char cc[]="时间0\n";
HAL_UART_Transmit(&huart1, (uint8_t *)cc, strlen(cc), HAL_MAX_DELAY);
}
4.tx_timer_activate&tx_timer_deactivate
UINT tx_timer_activate(TX_TIMER *timer_ptr)
UINT tx_timer_deactivate(TX_TIMER *timer_ptr)
启用定时器
第 1 个参数 timer_ptr 是定时器控制块指针。
返回值:
TX_SUCCESS(0x00)成功创建。
TX_TIMER_ERROR:(0x15)无效的应用程序计时器指针。
TX_ACTIVATE_ERROR: (0x17)计时器已经激活,或者是一个已经到期的一次性计时器。
暂停计时器
第 1 个参数 timer_ptr 是定时器控制块指针。
返回值:
TX_SUCCESS(0x00)成功。
TX_TIMER_ERROR:(0x15)无效的应用程序计时器指针。
我们在线程1中先暂停计数器,再启动计时器,可以看到两次操作都成功。
void thread_1_entry(ULONG thread_input)
//线程1,控制led,只让他亮5s
{
char cc[]="线程2\n";
HAL_UART_Transmit(&huart1, (uint8_t *)cc, strlen(cc), HAL_MAX_DELAY);
UINT stoptime= tx_timer_deactivate(&my_time);
char buffer[256];
snprintf(buffer, sizeof(buffer),"%u\n" ,stoptime);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
UINT status = tx_timer_activate(&my_time);
snprintf(buffer, sizeof(buffer),"%u\n" ,status);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
if (status != TX_SUCCESS)
{
// 处理激活定时器失败的情况
// 例如,可以通过串口输出错误信息
char error_msg[] = "Timer activation failed\n";
HAL_UART_Transmit(&huart1, (uint8_t *)error_msg, strlen(error_msg), HAL_MAX_DELAY);
}
else
{
// 定时器成功激活,可以执行其他操作或者输出一条消息
char success_msg[] = "Timer activated successfully\n";
HAL_UART_Transmit(&huart1, (uint8_t *)success_msg, strlen(success_msg), HAL_MAX_DELAY);
}
}
5.tx_timer_change
UINT tx_timer_change( TX_TIMER *timer_ptr,
ULONG initial_ticks,
ULONG reschedule_ticks)
修改定时器到期值:
第 1 个参数 timer_ptr 是定时器控制块指针。
第 2 个参数 initial_ticks 是新的第一次定时滴答数。
第 3 个参数 reschedule_ticks 是新的第二次及以后的定时滴答数。
返回值:
TX_SUCCESS(0x00)成功。
TX_TIMER_ERROR:(0x15)无效的应用程序计时器指针。
TX_TICK_ERROR: (0x16)为初始计时提供的无效值(零)。
TX_CALLER_ERROR:(0x13)无效的服务调用者。
在调用此服务之前必须停用应定时器,并在此服务之后调用tx_timer_activate以重新启动定时器。
示例代码先暂停定时器,再修改定时器参数,再启动定时器。
void thread_1_entry(ULONG thread_input)
{
CHAR *name;
UINT active;
ULONG remaining_ticks;
ULONG reschedule_ticks;
TX_TIMER *next_timer;
char cc[]="线程2\n";
HAL_UART_Transmit(&huart1, (uint8_t *)cc, strlen(cc), HAL_MAX_DELAY);
UINT stoptime= tx_timer_deactivate(&my_time);
//先暂停
char buffer[256];
snprintf(buffer, sizeof(buffer),"%u\n" ,stoptime);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
UINT bb= tx_timer_change(&my_time, 20, 40);
//再修改
snprintf(buffer, sizeof(buffer),"成功修改%u\n" ,bb);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
UINT dd= tx_timer_info_get(&my_time, &name, &active, &remaining_ticks,&reschedule_ticks,&next_timer);
snprintf(buffer, sizeof(buffer),"调用信息函数:%u\n" ,dd);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
snprintf(buffer, sizeof(buffer),"name:%s\nactive:%u\nremaining_ticks:%lu\nreschedule_ticks:%lu\n",name,active,remaining_ticks,reschedule_ticks);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
UINT status = tx_timer_activate(&my_time);
//再激活
snprintf(buffer, sizeof(buffer),"%u\n" ,status);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
if (status != TX_SUCCESS)
{
// 处理激活定时器失败的情况
// 例如,可以通过串口输出错误信息
char error_msg[] = "Timer activation failed\n";
HAL_UART_Transmit(&huart1, (uint8_t *)error_msg, strlen(error_msg), HAL_MAX_DELAY);
}
else
{
// 定时器成功激活,可以执行其他操作或者输出一条消息
char success_msg[] = "Timer activated successfully\n";
HAL_UART_Transmit(&huart1, (uint8_t *)success_msg, strlen(success_msg), HAL_MAX_DELAY);
}
}
6.tx_timer_info_get
UINT tx_timer_info_get(TX_TIMER *timer_ptr,
CHAR **name,
UINT *active,
ULONG *remaining_ticks,
ULONG *reschedule_ticks,
TX_TIMER **next_timer)
获取内存块池信息:
第 1 个参数 timer_ptr 是定时器控制块指针。
第 2 个参数 name 是定时器名字符串,获取后存储的指针。
第 3 个参数 active 是定时器启动或暂停状态,获取后存储的指针。
第 4 个参数 remaining_ticks 是定时器剩余滴答数,获取后存储的指针。
第 5 个参数 reschedule_ticks 是定时器第二次及以后的定时滴答数,获取后存储的指针。
第 6 个参数 next_timer 是下一个定时器指针,获取后存储的指针。
返回值:
TX_SUCCESS(0x00)成功获取信息。
TX_TIMER_ERROR:(0x15)无效的应用程序计时器指针。
代码已经在修改定时器参数函数中涉及。
7.tx_timer_delete
UINT tx_timer_delete(TX_TIMER *timer_ptr)
删除定时器:
- 第 1 个参数 timer_ptr 是定时器控制块指针。
- 返回值:
- TX_SUCCESS(0x00)成功。
- TX_TIMER_ERROR:(0x15)无效的应用程序计时器指针。
- TX_CALLER_ERROR:(0x13)无效的服务调用者。
和上一段示例代码相比,在函数末尾增加了删除定时器代码。串口打印结果显示删除成功。
void thread_1_entry(ULONG thread_input)
{
CHAR *name;
UINT active;
ULONG remaining_ticks;
ULONG reschedule_ticks;
TX_TIMER *next_timer;
char cc[]="线程2\n";
HAL_UART_Transmit(&huart1, (uint8_t *)cc, strlen(cc), HAL_MAX_DELAY);
UINT stoptime= tx_timer_deactivate(&my_time);
//先暂停
char buffer[256];
snprintf(buffer, sizeof(buffer),"%u\n" ,stoptime);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
UINT bb= tx_timer_change(&my_time, 20, 40);
//再修改
snprintf(buffer, sizeof(buffer),"成功修改%u\n" ,bb);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
UINT dd= tx_timer_info_get(&my_time, &name, &active, &remaining_ticks,&reschedule_ticks,&next_timer);
snprintf(buffer, sizeof(buffer),"调用信息函数:%u\n" ,dd);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
snprintf(buffer, sizeof(buffer),"name:%s\nactive:%u\nremaining_ticks:%lu\nreschedule_ticks:%lu\n",name,active,remaining_ticks,reschedule_ticks);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
UINT status = tx_timer_activate(&my_time);
//再激活
snprintf(buffer, sizeof(buffer),"%u\n" ,status);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
if (status != TX_SUCCESS)
{
// 处理激活定时器失败的情况
// 例如,可以通过串口输出错误信息
char error_msg[] = "Timer activation failed\n";
HAL_UART_Transmit(&huart1, (uint8_t *)error_msg, strlen(error_msg), HAL_MAX_DELAY);
}
else
{
// 定时器成功激活,可以执行其他操作或者输出一条消息
char success_msg[] = "Timer activated successfully\n";
HAL_UART_Transmit(&huart1, (uint8_t *)success_msg, strlen(success_msg), HAL_MAX_DELAY);
}
UINT ee=tx_timer_delete(&my_time);
snprintf(buffer, sizeof(buffer),"%u\n" ,ee);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
}