《安富莱_STM32-V6开发板ThreadX内核教程(V1.5)》简单整理学习

这篇具有很好参考价值的文章主要介绍了《安富莱_STM32-V6开发板ThreadX内核教程(V1.5)》简单整理学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

任务管理Thread

任务创建函数 tx_thread_create

UINT      tx_thread_create(TX_THREAD *thread_ptr,
                           CHAR *name_ptr,  
                           VOID (*entry_function)(ULONG id),  
                           ULONG entry_input, 
                           VOID *stack_start, ULONG stack_size,  
                           UINT priority,  
                           UINT preempt_threshold, 
                           ULONG time_slice,  
                           UINT auto_start,  
                           UINT thread_control_block_size) 

函数描述:

  • 函数tx_thread_create 用于实现 ThreadX操作系统的任务创建,并且还可以自定义任务栈的大小。

函数形参:

  • 第1个参数thread_ptr是任务控制块地址。
  • 第2个参数name_ptr是任务名,这个参数主要是用于调试目的,调试的时候方便看是哪个任务。
  • 第3个参数entry_function是任务函数地址。当任务从此入口函数返回时,它将处于Complete State完成态,并无限挂起。
  • 第4个参数entry_input是传递给任务的形参。
  • 第5个参数stack_start栈基地址。
  • 第6个参数stack_size是栈大小,单位字节,主要被函数嵌套调用和局部变量使用。
  • 第7个参数priority是任务优先级,范围0到(TX_MAX_PRIORITES-1),其中0表示最高优先级。
  • 第8个参数preempt_threshold是抢占阀值,范围0到(TX_MAX_PRIORITES-1)。只有高于此级别的优先级才可以抢占该任务。此数值必须小于或等于该任务的优先级数值。如果设置为等于该任务的优先级数值,将禁用抢占阈值。
  • 第9个参数time_slice是时间片大小。
  • 第10个参数auto_start是指定线程是立即启动还是处于挂起状态。

TX_AUTO_START(0x01)立即启动。
TX_DONT_START(0x00)挂起状态。 如果指定了TX_DONT_START,则应用程序以后必须调用tx_thread_resume才能运行线程。

  • 返回值:

TX_SUCCESS(0x00)成功创建线程。
TX_THREAD_ERROR(0x0E)无效的任务控制块指针。指针为NULL或任务已创建。
TX_PTR_ERROR(0x03)任务函数地址或栈的起始地址无效,通常为NULL。
TX_SIZE_ERROR(0x05)栈区域大小无效。任务必须至少具有TX_MINIMUM_STACK字节才能执行。
TX_PRIORITY_ERROR(0x0F)无效任务优先级,该值超出(0到 TX_MAX_PRIORITIES-1)范围。
TX_THRESH_ERROR(0x18)指定了无效抢占阈值。该值的有效优先级必须小于或等于该任务的初始优先级数值。
TX_START_ERROR(0x10)无效的auto_start参数。
TX_CALLER_ERROR(0x13)无效调用。
注意事项:

  • 不允许在中断服务程序中调用,只可以在初始化和任务中调用。
  • 使用抢占阈值将禁用时间片。合法的时间片值范围是1到0xFFFFFFFF(包括0)。值为 TX_NO_TIME_SLICE(值为0)将禁用此任务的时间切片。
  • 使用时间分片会导致少量系统开销。由于时间片仅在多个线程共享相同优先级的情况下才有用,因此,具有唯一优先级的任务不要分配时间片。
/* 任务优先级,数值越小优先级越高 */
#define APP_CFG_TASK_START_PRIO 2u
/* 任务栈大小,单位字节 */
#define APP_CFG_TASK_START_STK_SIZE 4096u
/* 静态全局变量 */ 
static TX_THREAD AppTaskStartTCB;
static uint64_t AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE/8];

/* 任务创建 */ 
tx_thread_create(&AppTaskStartTCB,            /* 任务控制块地址 */ 
                 "App Task Start",            /* 任务名 */
                 AppTaskStart,                /* 启动任务函数地址 */
                 0,                           /* 传递给任务的参数 */
                 &AppTaskStartStk[0],         /* 堆栈基地址 */
                 APP_CFG_TASK_START_STK_SIZE, /* 堆栈空间大小 */ 
                 APP_CFG_TASK_START_PRIO,     /* 任务优先级*/
                 APP_CFG_TASK_START_PRIO,     /* 任务抢占阀值 */
                 TX_NO_TIME_SLICE,            /* 不开启时间片 */
                 TX_AUTO_START);              /* 创建后立即启动 */

/*
*********************************************************************************************************
*	任务函数
*********************************************************************************************************
*/
static  void  AppTaskStart (ULONG thread_input)
{
	(void)thread_input;
    
    while (1)
	{
        tx_thread_sleep(1000);
    }
}

任务删除函数 tx_thread_delete

UINT tx_thread_delete(TX_THREAD *thread_ptr) 

函数描述:

  • 函数tx_thread_delete用于实现ThreadX操作系统的任务删除。

函数形参:

  • 第1个参数thread_ptr填要删除的任务控制块地址。
  • 返回值UINT类型

TX_SUCCESS(0x00)成功删除任务。
TX_THREAD_ERROR(0x0E)无效的任务控制块指针。
TX_DELETE_ERROR(0x11)指定的任务未处于Terminated终止态或者Completed完成态。
TX_CALLER_ERROR(0x13)无效调用者。
注意事项:

  • 不允许在中断服务程序中调用,只可以在任务和定时器组中调用。
  • 只能删除处于Terminated终止态或者Completed完成态的任务。因此也就不可以在要删除的任务中调用此函数,也就是自己删除自己。

的任务挂起函数tx_thread_suspend

UINT tx_thread_suspend(TX_THREAD *thread_ptr)

函数描述:

  • 函数tx_thread_suspend 用于实现ThreadX操作系统的任务挂起。任务也可以挂起自己。挂起后,可以通过tx_thread_resume 恢复。

函数形参:

  • 第1个参数thread_ptr填要挂起任务的任务控制块。
  • 返回值UINT类型

TX_SUCCESS(0x00)成功的任务挂起。
TX_THREAD_ERROR(0x0E)无效的任务控制块指针。
TX_SUSPEND_ERROR(0x14)指定的线程处于终止或完成状态。
TX_CALLER_ERROR(0x13)无效调用者。
注意事项:

  • 允许在中断,任务,定时器组和初始化中调用。
  • 如果指定的任务由于其它原因已经挂起,则本次挂起将被保存,直到之前的挂起已经恢复。当发生这种情况时,将执行指定任务的无条件挂起,之后的无条件挂起请求将无效。

任务恢复函数tx_thread_resume

UINT tx_thread_resume(TX_THREAD *thread_ptr) 

函数描述:

  • 函数tx_thread_resume 用于实现ThreadX操作系统的任务恢复。另外,此任务还将恢复在没有自动启 动的情况下创建的任务。

函数形参:

  • 第1个参数thread_ptr填要恢复的任务控制块地址。
  • 返回值:

TX_SUCCESS(0x00)成功的恢复任务。
TX_SUSPEND_LIFTED(0x19)先前设置的延迟暂停已取消。
TX_THREAD_ERROR(0x0E)无效的任务控制地址。
TX_RESUME_ERROR(0x12)指定任务没有被挂起,或者之前被tx_thread_suspend以外的服务挂起。
注意事项:

  • 允许在中断,任务,定时器组和初始化中调用。

任务复位函数tx_thread_reset

UINT  tx_thread_reset (TX_THREAD *thread_ptr) 

函数描述:

  • 函数tx_thread_reset 用于实现 ThreadX操作系统的任务复位。任务必须处于TX_COMPLETED完成态 或TX_TERMINATED终止态才能复位。

函数形参:

  • 第1个参数thread_ptr填要恢复的任务控制块地址。
  • 返回值:

TX_SUCCESS(0x00)成功复位任务。
TX_NOT_DONE(0x20)指定的线程未处于TX_COMPLETED或TX_TERMINATED状态。
TX_THREAD_ERROR(0x0E)无效的任务控制块指针。
TX_CALLER_ERROR(0x13)无效调用者。
注意事项:

  • 不允许在中断中调用,仅可以在任务中调用。

任务终止函数tx_thread_terminate

UINT  tx_thread_terminate(TX_THREAD *thread_ptr) 

函数描述:

  • 函数tx_thread_terminate 用于实现 ThreadX 操作系统的任务终止。该函数终止指定任务,而不管该任 务是否被挂起。任务可以调用此函数以终止自身。

函数形参:

  • 第1个参数填要恢复的任务控制块地址。
  • 返回值:

TX_SUCCESS(0x00)成功终止任务。
TX_THREAD_ERROR(0x0E)无效的任务控制块指针。
TX_CALLER_ERROR(0x13)无效调用者。
注意事项:

  • 不允许在中断中调用,仅可以在任务和定时器组中调用。
  • 终止后,必须调用函数tx_thread_reset复位任务以使其再次执行。
  • 应用程序有责任确保任务处于适合终止的状态。例如,任务不应在关键应用程序处理期间或在其他 中间件组件内部终止,否则可能会使这种处理处于未知状态。

事件 Event

事件标志组创建函数tx_event_flags_create

/*  第 1 个参数是事件标志组控制块。
	第 2 个参数是事件标志组名字  */
UINT tx_event_flags_create( 
	TX_EVENT_FLAGS_GROUP *group_ptr, 
	CHAR *name_ptr); 

函数描述:

  • 此函数用于创建事件标志组,支持32bit变量设置,变量的每个bit代表一个标志位,即支持32个标志位。

函数形参:

  • 第1个参数group_ptr是事件标志组控制块。
  • 第2个参数name_ptr是事件标志组名字。
  • 返回值 UINT类型

TX_SUCCESS(0x00)创建成功。
TX_GROUP_ERROR(0x06)无效事件标志。
TX_CALLER_ERROR(0x13)无效调用。
注意事项:

  • 初始状态,32个标志位都是0。
  • 只能在初始化和任务中调用。
TX_EVENT_FLAGS_GROUP EventGroup; /* 定义事件控制块 */

UINT status; 

status = tx_event_flags_create(&EventGroup, "EventGroup");  /* 创建事件标志组 */

事件标志组设置函数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 个参数的类型,用于设置或者清楚标志位。32bit 数值,每个 bit 代表一个标志 位。
  • 第 3 个参数set_option支持如下两种参数:

TX_AND:与操作。 表示第 2 个参数的设置值与事件标志当前 32bit 数值的与操作。比如第 2 个参数设置为 0x0000 0002,表示事件标志组 32bit 变量的 bit0 和 bit1 保持不变,其它全部清零。
TX_OR:或操作。 表示第 2 个参数的设置值与事件标志当前 32bit 数值的或操作。比如第 2 个参数设置为 0x0000 0002,表示事件标志组 32bit 变量的 bit0 和 bit1 全部置 1,其它 bit 不变。

  • 返回值 UINT类型

TX_SUCCESS(0x00)设置成功。
TX_GROUP_ERROR(0x06)无效的事件标志组。
TX_OPTION_ERROR(0x08)无效设置选项。

#define BIT_0 (1 << 0)
#define BIT_1 (1 << 1)

UINT status; 

status = tx_event_flags_set(&EventGroup, BIT_0, TX_OR);
status = tx_event_flags_set(&EventGroup, BIT_0 | BIT_1, TX_OR);

事件标志组获取函数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); 

函数形参:

  • 第 1 个参数group_ptr是事件标志组控制块。
  • 第 2个参数requested_flags 是请求的事件标志,32bit数据值,每个bit代表一个标志位。
  • 第 3 个参数get_option

TX_AND:等待第2个参数所有请求置1的bit全部被置1。
TX_AND_CLEAR:等待第2个参数所有请求置1的bit全部被设置,之后相应的bit将被清零。
TX_OR:等待第2个参数所有请求置1的bit中任何一个bit被置1。
TX_OR_CLEAR:等待第2个参数所有请求置1的bit中任何一个bit被置1,之后相应的bit将被清零。

  • 第 4 个参数actual_flags_ptr 是32bit事件标志的实际数值(未被清零前的数值)。
  • 第 5 个参数wait_option

TX_NO_WAIT (0x00000000):表示不管是否满足等待条件,立即返回。如果在定时器组,初始化或中断里面调用,必须要设置成这个参数。
TX_WAIT_FOREVER (0xFFFFFFFF):表示永久等待,直到满足等待条件。
等待时间:范围0x00000001 到 0xFFFFFFFE,单位系统时钟节拍。

  • 返回值 UINT类型

TX_SUCCESS (0x00) 事件标志获取成功。
TX_DELETED (0x01) 事件标志组在线程挂起时被删除。
TX_NO_EVENTS(0x07)无法在指定时间内获取指定的事件。
TX_WAIT_ABORTED(0x1A)事件标志组被另一个线程、定时器组或中断服务程序终止。
TX_GROUP_ERROR(0x06)无效事件标志组控制块。
TX_PTR_ERROR(0x03)第4个参数无实体。
TX_WAIT_ERROR(0x04) 定时器组,初始化或中断里面调用此函数时,第5个参数必须是 TX_NO_WAIT,其它参数会返回此错误值。
TX_OPTION_ERROR(0x08) 第3个参数错误。
注意事项:

  • 可以在初始化,任务,定时器组和中断服务程序里面调用。
  • 这个函数的第3个参数推荐配置为TX_AND_CLEAR或者TX_OR_CLEAR,否则用户满足条件时,函 数tx_event_flags_get 会一直成立。
#define BIT_0   (1 << 0) 
#define BIT_1   (1 << 1) 
#define BIT_ALL (BIT_0 | BIT_1) 

UINT status; 
TX_EVENT_FLAGS_GROUP  EventGroup; 

status = tx_event_flags_get(&EventGroup,     /* 事件标志控制块 */ 
							BIT_ALL,         /* 等待标志 */ 
                            TX_OR_CLEAR ,    /* 等待任意bit满足即可 */ 
                            &actual_events,  /* 获取实际值 */ 
                            TX_WAIT_FOREVER);/* 永久等待 */ 

事件标志组消息通知函数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个参数是事件标志组控制块。
  • 第2个参数是回调函数,如果此值TX_NULL,则不执行回调通知。
  • 返回值

TX_SUCCESS(0x00)注册成功
TX_GROUP_ERROR(0x06)无效的事件标志控制块。
TX_FEATURE_NOT_ENABLED(0xFF)系统没有使能事件标志通知特性。

TX_EVENT_FLAGS_GROUP my_group; 

UINT status; 

status = tx_event_flags_set_notify(&my_group, my_event_flags_set_notify); 

void my_event_flags_set_notify(TX_EVENT_FLAGS_GROUP *group_ptr) 
{ 
    
} 

消息队列Queue

消息队列创建函数tx_queue_create

UINT tx_queue_create( 
    TX_QUEUE *queue_ptr,  
	CHAR *name_ptr, 
	UINT message_size, 
	VOID *queue_start,  
	ULONG queue_size); 

函数描述:
函数形参:

  • 第1个参数queue_ptr是消息队列控制块。
  • 第2个参数name_ptr是消息队列名字。
  • 第3个参数message_size是消息队列每个消息的大小,消息大小范围1-16,每个消息4字节。
  • 第4个参数queue_start是消息队列缓冲地址,必须保证此地址4字节对齐,即此地址对4求余数为0.
  • 第5个参数queue_size是消息缓冲大小,单位字节。
  • 返回值

TX_SUCCESS (0x00) 创建成功。
TX_QUEUE_ERROR (0x09) 消息队列控制块无效。
TX_PTR_ERROR (0x03)无效的消息队列其实地址。
TX_SIZE_ERROR (0x05) 消息队列大小无效。
TX_CALLER_ERROR (0x13) 无效的调用
注意事项:

  • 如果第5个参数消息缓冲大小不是第3个参数消息大小的整数倍,多余的部分将清零。
TX_QUEUE MessageQueues; /* 定义消息队控制快 */ 

uint32_t MessageQueuesBuf[10]; /* 定义消息队列缓冲 */ 

/* 创建消息队列1 */ 
tx_queue_create(&MessageQueues,  
                "MessageQueues",  
                sizeof(uint32_t)/4, /* 每次消息队列发送的数据大小,单位32bit,范围1-16 */ 
                (VOID *)MessageQueuesBuf,  
                sizeof(MessageQueuesBuf)); /* 消息队列大小,单位字节 */ 

消息队列发送函数 tx_queue_send

UINT tx_queue_send( 
    TX_QUEUE *queue_ptr, 
    VOID *source_ptr,  
    ULONG wait_option);

函数描述:

  • 此函数用于消息队列发送,将要发送的数据复制到消息队列里面。

函数形参:

  • 第1个参数是消息队列控制块。
  • 第2个参数是要发送的数据地址。
  • 第3个参数是等待选项:

如果消息队列满了,这个形参将派上用场:
TX_NO_WAIT (0x00000000):表示不管消息队列是否满,立即返回。如果在定时器组,初始 化或中断里面调用,必须要设置成这个参数。
TX_WAIT_FOREVER (0xFFFFFFFF):表示永久等待,直到消息队列有空间可用。
等待时间:范围0x00000001 到 0xFFFFFFFE,单位系统时钟节拍、

  • 返回值

TX_SUCCESS(0x00)设置成功。
TX_GROUP_ERROR(0x06)无效的事件标志组。
TX_OPTION_ERROR(0x08)无效设置选项。
TX_SUCCESS (0x00) 消息发送成功。
TX_DELETED (0x01) 任务挂起阶段,消息队列被删除。
TX_QUEUE_FULL (0x0B) 消息队列满,包含等待了指定时间后消息队列依然满。
TX_WAIT_ABORTED (0x1A) 消息队列被其它任务,定时器组或者中断服务程序终止。
TX_QUEUE_ERROR (0x09) 无效的消息队列控制块。
TX_PTR_ERROR (0x03) 无效的发送数据地址。
TX_WAIT_ERROR (0x04) 无效调用,主要是在非常任务代码中使用
TX_NO_WAIT 以外的形参。比 如在中断服务程序里面设置等待发送。
注意事项:

TX_QUEUE MessageQueues; /* 定义消息队控制快 */ 

uint32_t MessageQueuesBuf[10]; /* 定义消息队列缓冲 */ 

uint32_t SendMessage = 0;

tx_queue_send(&MessageQueues, &SendMessage, TX_WAIT_FOREVER);

消息队列获取函数 tx_queue_receive

UINT tx_queue_receive( 
    TX_QUEUE *queue_ptr, 
    VOID *destination_ptr,  
    ULONG wait_option); 

函数描述:

  • 此函数用于消息队列数据获取,将消息队列中的数据复制出来。

函数形参:

  • 第1个参数queue_ptr是消息队列控制块。
  • 第2个参数destination_ptr是从消息队列复制出来数据的存储地址。
  • 第3个参数wait_option是等待选项:

如果消息队列空了,这个形参将派上用场:
TX_NO_WAIT (0x00000000),表示不管消息队列是否空,立即返回。如果在定时器组,初始 化或中断里面调用,必须要设置成这个参数。
TX_WAIT_FOREVER (0xFFFFFFFF),表示永久等待,直到消息队列有数据。
等待时间,范围0x00000001 到 0xFFFFFFFE,单位系统时钟节拍、

  • 返回值

TX_SUCCESS(0x00)设置成功。
TX_GROUP_ERROR(0x06)无效的事件标志组。
TX_DELETED (0x01) 任务挂起阶段,消息队列被删除。
TX_QUEUE_EMPTY (0x0A) 消息队列空,包含等待了指定时间后消息队列依然空。
TX_WAIT_ABORTED (0x1A) 消息队列被其它任务,定时器组或者中断服务程序终止。
TX_QUEUE_ERROR (0x09) 无效的消息队列控制块。
TX_PTR_ERROR (0x03) 无效的数据存储地址。
TX_WAIT_ERROR (0x04) 无效调用,主要是在非常任务代码中使用
TX_NO_WAIT 以外的形参。比 如在中断服务程序里面设置等待。
注意事项:

  • 可以在初始化,任务,定时器组和中断服务程序里面调用。
  • 一点要保证第2个参数的数据缓冲够存储一个消息队列的消息。
TX_QUEUE MessageQueues; /* 定义消息队控制快 */ 

uint32_t MessageQueuesBuf[10]; /* 定义消息队列缓冲 */ 

uint32_t RecMessage = 0;

tx_queue_receive(&MessageQueues, &RecMessage, TX_NO_WAIT);

信号量Semaphore

信号量创建函数tx_semaphore_create

UINT tx_semaphore_create( 
    TX_SEMAPHORE *semaphore_ptr, 
    CHAR *name_ptr,  
    ULONG initial_count); 

函数描述:

  • 此函数用于创建信号量。

函数形参:

  • 第1个参数semaphore_ptr是信号量控制块。
  • 第2个参数name_ptr是信号量名字。
  • 第3个参数initial_count是信号量初始值,范围0x00000000 到 0xFFFFFFFF。
  • 返回值

TX_SUCCESS (0x00) 创建成功。
TX_SEMAPHORE_ERROR (0x0C) 信号量控制块无效。
TX_CALLER_ERROR (0x13) 无效的调用
注意事项:

  • 可以在初始化和任务中调用。
TX_SEMAPHORE Semaphore; 
/* 创建信号量,初始值为0,用于信号同步 */ 
tx_semaphore_create(&Semaphore, "Semaphore", 0);

信号量发送函数tx_semaphore_put

UINT tx_semaphore_put(TX_SEMAPHORE *semaphore_ptr);

函数描述:

  • 此函数用于信号量发送(信号量释放),反映到ThreadX内核操作上,对计数值执行加一操作。

函数形参:

  • 第1个参数semaphore_ptr是信号量控制块。
  • 返回值

TX_SUCCESS (0x00) 发送成功。
TX_SEMAPHORE_ERROR (0x0C) 信号量控制块无效。
注意事项:

  • 如果当前信号量的计数值是0xFFFFFFFF,那么执行此函数后,计数值将复位为0。
TX_SEMAPHORE Semaphore; 
/* 信号量释放 */ 
tx_semaphore_put(&Semaphore);

信号量接收函数tx_semaphore_get

UINT tx_semaphore_get( 
    TX_SEMAPHORE *semaphore_ptr, 
    ULONG wait_option); 

函数描述:

  • 此函数用于信号量接收(获取),反映到ThreadX内核操作上,对计数值执行减一操作。

函数形参:

  • 第1个参数是信号量控制块。
  • 第2个参数是等待选项: 如果信号量计数值为零,这个形参将派上用场:

TX_NO_WAIT (0x00000000),表示不管是否有信号量可用(计数值非0),立即返回。如果在定 时器组,初始化或中断里面调用,必须要设置成这个参数。
TX_WAIT_FOREVER (0xFFFFFFFF),表示永久等待,直到有信号量可用(计数值非0)。
等待时间,范围0x00000001 到 0xFFFFFFFE,单位系统时钟节拍、

  • 返回值

TX_SUCCESS(0x00)设置成功。
TX_DELETED (0x01) 任务挂起阶段,消息队列被删除。
TX_NO_INSTANCE (0x0D)信号量计数值为0,包含等待了指定时间后信号量计数值依然为0。 TX_WAIT_ABORTED (0x1A) 消息队列被其它任务,定时器组或者中断服务程序终止。
TX_SEMAPHORE _ERROR (0x09) 无效的信号量控制块。
TX_WAIT_ERROR (0x04) 无效调用,主要是在非常任务代码中使用
TX_NO_WAIT 以外的形参。比 如在中断服务程序里面设置等待。
注意事项:

  • 可以在初始化,任务,定时器组和中断服务程序里面调用。
if (tx_semaphore_get(&Semaphore, TX_WAIT_FOREVER) == TX_SUCCESS)
{
    /* 获取到信号量 */   
}

互斥量Mutex

互斥信号量创建函数 tx_mutex_create

UINT tx_mutex_create( 
    TX_MUTEX *mutex_ptr, 
    CHAR *name_ptr,  
    UINT priority_inherit); 

函数描述:

  • 此函数用于创建互斥信号量。

函数形参:

  • 第1个参数是互斥信号量控制块。
  • ◆ 第2个参数是互斥信号量名字。
  • ◆ 第3个参数用于设置是否使能优先级继承

TX_INHERIT使能优先级继承,即支持优先级反转。
TX_NO_INHERIT关闭优先级继承。

  • 返回值

TX_SUCCESS (0x00) 互斥信号量创建成功。
TX_MUTEX_ERROR (0x1C) 无效的互斥信号量控制块或者互斥信号量已经创建。
TX_CALLER_ERROR (0x13) 无效调用。
TX_INHERIT_ERROR (0x1F) 无效的优先级继承参数。
注意事项:

  • 可以在初始化和任务中调用。
static  TX_MUTEX   AppPrintfSemp; 
/* 创建互斥信号量 */ 
tx_mutex_create(&AppPrintfSemp,"AppPrintfSemp",TX_INHERIT);

互斥信号量获取函数 tx_mutex_get

UINT tx_mutex_get( 
    TX_MUTEX *mutex_ptr,  
    ULONG wait_option); 

函数描述:

  • 此函数用于获取互斥信号量,如果互斥信号量已经被调用的任务所拥有,再次调用会触发所有权计数变量 加1操作。如果互斥信号量被一个低优先级任务所拥有,并且在创建互斥信号量的时候使能了优先级继承, 那么高优先级任务也要获取互斥信号量时,这个低优先级任务的优先级将提升到和高优先级任务一个等级。

函数形参:

  • 第1个参数是互斥信号量控制块。
  • ◆ 第2个参数是等待选项: 如果互斥信号量被一个任务锁拥有,这个形参将派上用场:

TX_NO_WAIT (0x00000000),表示不管是否获取成功,立即返回。如果在初始化阶段调用, 必须要设置成这个参数。
TX_WAIT_FOREVER (0xFFFFFFFF),表示永久等待,直到有互斥信号量可用)。
等待时间,范围0x00000001 到 0xFFFFFFFE,单位系统时钟节拍、

  • 返回值

TX_SUCCESS(0x00)设置成功。
TX_DELETED (0x01) 任务挂起阶段,消息队列被删除。
TX_NO_AVAILABLE (0x1D)等待了指定时间后, 依然无法获取信号量。
TX_WAIT_ABORTED (0x1A) 挂起被其它任务,定时器组或者中断服务程序终止。
TX_MUTEX _ERROR (0x1C) 无效的互斥信号量控制块。
TX_WAIT_ERROR (0x04) 无效调用,主要是在非常任务代码中使用
TX_NO_WAIT 以外的形参。比 如在中断服务程序里面设置等待。
TX_CALLER_ERROR (0x13)无效调用
注意事项:

  • 可以在初始化,任务,定时器组里面调用。
static  TX_MUTEX   AppPrintfSemp; 

tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);

互斥信号量释放函数 tx_mutex_put

UINT tx_semaphore_put(TX_SEMAPHORE *semaphore_ptr);

函数描述:

  • 此函数用于释放互斥信号量,当互斥信号量所有权计数变量为0时(每次嵌套调用,此变量都会执行加1 操作,释放时执行减1操作),互斥资源才可用。

函数形参:

  • 第1个参数是信号量控制块。
  • ◆ 返回值

TX_SUCCESS (0x00) 互斥信号量创建成功。
TX_NOT_OWNED(0x1E) 互斥信号量不被调用者所拥有。
TX_MUTEX_ERROR (0x1C) 无效的互斥信号量控制块或者互斥信号量已经创建。
TX_CALLER_ERROR (0x13) 无效调用。

static  TX_MUTEX   AppPrintfSemp;

tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER); 

定时器组Timer

定时器组创建函数 tx_timer_create

UINT tx_timer_create( 
    TX_TIMER *timer_ptr,  
    CHAR *name_ptr, 
    VOID (*expiration_function)(ULONG), 
    ULONG expiration_input,  
    ULONG initial_ticks, 
    ULONG reschedule_ticks,  
    UINT auto_activate); 

函数形参:

  • 第1个参数timer_ptr是定时器组控制块。
  • 第2个参数name_ptr是定时器组名字。
  • 第3个参数VOID (*expiration_function)(ULONG)是定时器计数溢出后调用的回调函数。
  • 第4个参数expiration_input是第3个参数所设置函数的形参。
  • 第5个参数initial_ticks设置定时器时间溢出的初始延迟,单位ThreadX系统时间节拍数,范围1 到0xFFFFFFFF。 注意不可以是0。
  • 第6个参数reschedule_ticks设置初始延迟后的定时器运行周期,如果设置为0,表示单次定时器。
  • 第7个参数auto_activate支持如下两个选项:

TX_AUTO_ACTIVATE 表示激活定时器。
TX_NO_ACTIVATE 表示未激活定时器

  • 返回值

TX_SUCCESS (0x00) 定时器组创建成功。
TX_TIMER_ERROR (0x15) 无效的定时器组控制块。或者定时器组已经创建。又或者指针为NULL。 TX_TICK_ERROR (0x16) 表示函数第5个形参为0。
TX_ACTIVATE_ERROR(0x17)表示第7 个形参无效。 TX_CALLER_ERROR (0x13) 表示无效的调用。

TX_TIMER AppTimer;

tx_timer_create(&AppTimer,
                "App Timer",
                TimerCallback,
                0, /* 传递的参数 */  
                100, /* 设置定时器时间溢出的初始延迟,单位ThreadX系统时间节拍数 */ 
                200, /* 设置初始延迟后的定时器运行周期,如果设置为0,表示单次定时器 */ 
                TX_AUTO_ACTIVATE);  /* 激活定时器 */ 

定时器组激活函数 tx_timer_create

UINT tx_timer_activate(TX_TIMER *timer_ptr); 

函数形参:

  • 第1个参数timer_ptr是定时器组控制块。
  • 返回值

TX_SUCCESS(0x00)设置成功。
TX_TIMER_ERROR (0x15) 无效的定时器组控制块。
TX_ACTIVATE_ERROR(0x17)表示已经激活,或者单次定时器模式。文章来源地址https://www.toymoban.com/news/detail-827513.html

TX_TIMER my_timer; 
UINT status; 
status = tx_timer_activate(&AppTimer);

到了这里,关于《安富莱_STM32-V6开发板ThreadX内核教程(V1.5)》简单整理学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包