《安富莱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)表示已经激活,或者单次定时器模式。

    TX_TIMER my_timer; 
    UINT status; 
    status = tx_timer_activate(&AppTimer);
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 《安富莱STM32-V6开发板ThreadX内核教程(V1.5)简单整理学习指南》

    发表回复