threadx学习笔记(5)系统时钟和定时器

内容参考:

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);
}

  • 20
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值