任务管理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);
函数形参:文章来源:https://www.toymoban.com/news/detail-827513.html
- 第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模板网!