《安富莱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)
函数描述:
函数形参:
thread_ptr
是任务控制块地址。name_ptr
是任务名,这个参数主要是用于调试目的,调试的时候方便看是哪个任务。entry_function
是任务函数地址。当任务从此入口函数返回时,它将处于Complete State完成态,并无限挂起。entry_input
是传递给任务的形参。stack_start
栈基地址。stack_size
是栈大小,单位字节,主要被函数嵌套调用和局部变量使用。priority
是任务优先级,范围0到(TX_MAX_PRIORITES-1),其中0表示最高优先级。preempt_threshold
是抢占阀值,范围0到(TX_MAX_PRIORITES-1)。只有高于此级别的优先级才可以抢占该任务。此数值必须小于或等于该任务的优先级数值。如果设置为等于该任务的优先级数值,将禁用抢占阈值。time_slice
是时间片大小。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)无效调用。
注意事项:
/* 任务优先级,数值越小优先级越高 */
#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)
函数描述:
函数形参:
thread_ptr
填要删除的任务控制块地址。UINT
类型TX_SUCCESS(0x00)成功删除任务。
TX_THREAD_ERROR(0x0E)无效的任务控制块指针。
TX_DELETE_ERROR(0x11)指定的任务未处于Terminated终止态或者Completed完成态。
TX_CALLER_ERROR(0x13)无效调用者。
注意事项:
的任务挂起函数tx_thread_suspend
UINT tx_thread_suspend(TX_THREAD *thread_ptr)
函数描述:
函数形参:
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操作系统的任务恢复。另外,此任务还将恢复在没有自动启 动的情况下创建的任务。函数形参:
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
终止态才能复位。函数形参:
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 操作系统的任务终止。该函数终止指定任务,而不管该任 务是否被挂起。任务可以调用此函数以终止自身。函数形参:
TX_SUCCESS(0x00)成功终止任务。
TX_THREAD_ERROR(0x0E)无效的任务控制块指针。
TX_CALLER_ERROR(0x13)无效调用者。
注意事项:
事件 Event
事件标志组创建函数tx_event_flags_create
/* 第 1 个参数是事件标志组控制块。
第 2 个参数是事件标志组名字 */
UINT tx_event_flags_create(
TX_EVENT_FLAGS_GROUP *group_ptr,
CHAR *name_ptr);
函数描述:
函数形参:
group_ptr
是事件标志组控制块。name_ptr
是事件标志组名字。UINT
类型TX_SUCCESS(0x00)创建成功。
TX_GROUP_ERROR(0x06)无效事件标志。
TX_CALLER_ERROR(0x13)无效调用。
注意事项:
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);
函数形参:
group_ptr
是事件标志组控制块。flags_to_set
根据第 3 个参数的类型,用于设置或者清楚标志位。32bit 数值,每个 bit 代表一个标志 位。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);
函数形参:
group_ptr
是事件标志组控制块。requested_flags
是请求的事件标志,32bit数据值,每个bit代表一个标志位。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将被清零。
actual_flags_ptr
是32bit事件标志的实际数值(未被清零前的数值)。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个参数错误。
注意事项:
#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 *));
函数描述:
函数形参:
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);
函数描述:
函数形参:
queue_ptr
是消息队列控制块。name_ptr
是消息队列名字。message_size
是消息队列每个消息的大小,消息大小范围1-16,每个消息4字节。queue_start
是消息队列缓冲地址,必须保证此地址4字节对齐,即此地址对4求余数为0.queue_size
是消息缓冲大小,单位字节。TX_SUCCESS (0x00) 创建成功。
TX_QUEUE_ERROR (0x09) 消息队列控制块无效。
TX_PTR_ERROR (0x03)无效的消息队列其实地址。
TX_SIZE_ERROR (0x05) 消息队列大小无效。
TX_CALLER_ERROR (0x13) 无效的调用
注意事项:
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);
函数描述:
函数形参:
如果消息队列满了,这个形参将派上用场:
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);
函数描述:
函数形参:
queue_ptr
是消息队列控制块。destination_ptr
是从消息队列复制出来数据的存储地址。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 以外的形参。比 如在中断服务程序里面设置等待。
注意事项:
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);
函数描述:
函数形参:
semaphore_ptr
是信号量控制块。name_ptr
是信号量名字。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);
函数描述:
函数形参:
semaphore_ptr
是信号量控制块。TX_SUCCESS (0x00) 发送成功。
TX_SEMAPHORE_ERROR (0x0C) 信号量控制块无效。
注意事项:
TX_SEMAPHORE Semaphore;
/* 信号量释放 */
tx_semaphore_put(&Semaphore);
信号量接收函数tx_semaphore_get
UINT tx_semaphore_get(
TX_SEMAPHORE *semaphore_ptr,
ULONG wait_option);
函数描述:
函数形参:
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);
函数描述:
函数形参:
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);
函数描述:
函数形参:
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);
函数描述:
函数形参:
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);
函数形参:
timer_ptr
是定时器组控制块。name_ptr
是定时器组名字。VOID (*expiration_function)(ULONG)
是定时器计数溢出后调用的回调函数。expiration_input
是第3个参数所设置函数的形参。initial_ticks
设置定时器时间溢出的初始延迟,单位ThreadX系统时间节拍数,范围1 到0xFFFFFFFF。 注意不可以是0。reschedule_ticks
设置初始延迟后的定时器运行周期,如果设置为0,表示单次定时器。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);
函数形参:
timer_ptr
是定时器组控制块。TX_SUCCESS(0x00)设置成功。
TX_TIMER_ERROR (0x15) 无效的定时器组控制块。
TX_ACTIVATE_ERROR(0x17)表示已经激活,或者单次定时器模式。
TX_TIMER my_timer;
UINT status;
status = tx_timer_activate(&AppTimer);