项目地址:https://github.com/azure-rtos/threadx
其中
这将编译生成一个库文件,可以将这个库文件包含在自己的项目中
$ mkdir build; cd build
$ cmake -Bbuild -DCMAKE_TOOLCHAIN_FILE=cmake/cortex_linux.cmake -GNinja ../
$ cmake --build .
注意:除了编译threadx之外,要编译其他组件的时候都要参考组件间的关系图来完成编译依赖
threadx
├── CONTRIBUTING.md
├── LICENSE.txt
├── LICENSED-HARDWARE.txt
├── README.md
├── SECURITY.md
├── CMakeLists.txt
├── cmake //保存了相应平台的cmake设置,会在目录的CmakeList.txt中调用
├── common //threadx的源码(for 单核CPU)
├── common_modules //支持动态应用加载相关代码
├── common_smp //threadx的源码(for 多核CPU)
├── docs
├── ports //与平台对应的代码(for 单核CPU),移植时需要这个里面的代码
├── ports_module //动态应用加载平台相关代码
├── ports_smp //与平台对应的代码(for 多核CPU)
├── samples //例程
└── utility //包含了低功耗相关代码和FreeRTOS适配层
调度器定时器初始化相关操作在threadx的***tx_initialize_low_level***汇编文件
下面是一些重要的文件
文件名 | 描述 |
---|---|
tx_api.h | threadx的API文件 |
tx_port.h | 包含对应平台的数据定义和结构体定义 |
demo_threadx.c | threadx的demo文件 |
tx.a (tx.lib) | threadx c源码编译获得的c库,可以在项目中直接使用 |
包含tx_api.h
创建一个main函数,在main函数中必须调用***tx_kernel_enter***来启动threadx,不涉及到threadx内核相关的初始化工作应该在此函数之前初始化。
注意:tx_kernel_enter函数不会返回。
在main.c中创建***tx_application_define*** 函数,在这里创建系统初始资源包括threads, queues, memory pools, event flags groups, mutexes, 和semaphores。
编译应用程序并连接***tx.lib***,最终生成可执行程序。
#include "tx_api.h"
unsigned long my_thread_counter = 0;
TX_THREAD my_thread;
main( )
{
/* Enter the ThreadX kernel. */
tx_kernel_enter( );
}
void tx_application_define(void *first_unused_memory)
{
/* Create my_thread! */
tx_thread_create(&my_thread, "My Thread",
my_thread_entry, 0x1234, first_unused_memory, 1024,
3, 3, TX_NO_TIME_SLICE, TX_AUTO_START);
}
void my_thread_entry(ULONG thread_input)
{
/* Enter into a forever loop. */
while(1)
{
/* Increment thread counter. */
my_thread_counter++;
/* Sleep for 1 tick. */
tx_thread_sleep(1);
}
}
TX_DISABLE_ERROR_CHECKING
TX_DISABLE_PREEMPTION_THRESHOLD
TX_DISABLE_NOTIFY_CALLBACKS
TX_DISABLE_REDUNDANT_CLEARING
TX_DISABLE_STACK_FILLING
TX_NOT_INTERRUPTABLE
TX_TIMER_PROCESS_IN_ISR
在最小代码量的基础上添加下面两个配置
TX_REACTIVATE_INLINE
TX_INLINE_THREAD_RESUME_SUSPEND
在***tx_port.h***中配置全局时钟,其定义了多少个tick中断表示一秒(例如:10ms产生一次中断则这个值设置成100)在threadx组件中有使用这个变量FileX, NetX, GUIX, USBX,等。
注意:需要与系统心跳时间相匹配,否则会使计算出来的时间错误
TX_TIMER_TICKS_PER_SECOND 100
TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO
如果定义了这个宏,则使能了byte内存池的性能收集功能。默认未定义此宏
TX_DISABLE_ERROR_CHECKING
如果定义了这个宏,则会跳过给所有的基本参数检查,这大概能提高30%左右的性能以及减少image大小,默认未定义此宏
注意:部分函数的返回值也会变成无效的如果定义了此宏
TX_DISABLE_NOTIFY_CALLBACKS
如果定义了这个宏,则会导致各个模块中的notify callbacks失效,这样可以稍微减少代码大小以及提高性能。默认未定义此宏
TX_DISABLE_PREEMPTION_THRESHOLD
如果定义了这个宏,则会取消抢占阈值调度功能,会稍微减少代码大小并且提高性能。默认未定义
TX_DISABLE_REDUNDANT_CLEARING
如果定义了这个宏,则会取消Threadx对全局未赋值变量以及结构体的清零功能。只有在编译器初始化代码中有做这个清零操作的时候才能取消这个功能。定义这个宏会稍微减少代码大小并且提高系统初始化时的性能。默认这个宏未定义
TX_DISABLE_STACK_FILLING
如果定义了这个宏,禁止在创建时将0xEF值放在每个线程堆栈的每个字节中。默认情况下,没有定义此选项。
TX_ENABLE_EVENT_TRACE
定义后,ThreadX启用事件收集代码来创建TraceX跟踪缓冲区。
TX_ENABLE_STACK_CHECKING
定义后,启用ThreadX运行时堆栈检查,包括分析使用了多少堆栈,以及检查堆栈区域前后的数据模式“栅栏”。如果检测到堆栈错误,则调用已注册的应用程序堆栈错误处理程序。这个选项确实会略微增加开销和代码大小。查看***tx_thread_stack_error_notify***API函数以获得更多信息。默认情况下,没有定义此选项。
TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO
定义后,启用收集事件标志组的性能信息。默认情况下,没有定义此选项。
TX_INLINE_THREAD_RESUME_SUSPEND
定义后,ThreadX通过内联代码改进了***tx_thread_resume*** 和***tx_thread_suspend*** API调用。这增加了代码大小,但提高了这两个API调用的性能。
TX_MAX_PRIORITIES
定义ThreadX的优先级级别。取值范围为32 ~ 1024(含1024),必须能被32整除。增加支持的优先级级别的数量会使每组32个优先级的RAM使用增加128字节。然而,这对性能的影响微乎其微。缺省情况下,该值被设置为32个优先级。
TX_MINIMUM_STACK
定义最小堆栈大小(以字节为单位)。它用于在创建线程时进行错误检查。默认值是特定于平台的,可以在***tx_port.h***中找到。
TX_MISRA_ENABLE
在定义时,ThreadX利用了符合MISRA C的约定。详情请参阅***ThreadX_MISRA_Compliance.pdf***。
TX_MUTEX_ENABLE_PERFORMANCE_INFO
定义后,启用对mutex(互斥锁)的性能信息的收集。默认情况下,没有定义此选项。
TX_NO_TIMER
在定义时,ThreadX计时器逻辑是完全禁用的。这在没有使用ThreadX计时器特性(线程睡眠、API超时、时间片和应用程序计时器)的情况下非常有用。如果指定了TX_NO_TIMER ,则还必须定义选项TX_TIMER_PROCESS_IN_ISR 。
TX_NOT_INTERRUPTABLE
在定义时,ThreadX不会试图最小化中断锁定时间。这将导致更快的执行,但会略微增加中断锁定时间。
TX_QUEUE_ENABLE_PERFORMANCE_INFO
定义后,启用收集队列上的性能信息。默认情况下,没有定义此选项。
TX_REACTIVATE_INLINE
定义后,内联执行ThreadX计时器的重新激活,而不是使用函数调用。这会提高性能,但会略微增加代码大小。默认情况下,没有定义此选项。
TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO
定义后,启用对信号量的性能信息的收集。默认情况下,没有定义此选项。
TX_THREAD_ENABLE_PERFORMANCE_INFO
定义后,启用收集线程上的性能信息。默认情况下,没有定义此选项。
TX_TIMER_ENABLE_PERFORMANCE_INFO
定义后,启用对计时器收集性能信息。默认情况下,没有定义此选项。
TX_TIMER_PROCESS_IN_ISR
定义后,消除了ThreadX的内部系统计时器线程。这将提高计时器事件的性能,并减少RAM需求,因为不再需要计时器堆栈和控制块。但是,使用此选项将所有计时器过期处理移动到计时器ISR级别。默认情况下,没有定义此选项。
TX_TIMER_THREAD_PRIORITY
定义内部ThreadX系统计时器线程的优先级。默认值为优先级0—ThreadX中的最高优先级。默认值定义在***tx_port.h***中。
TX_TIMER_THREAD_STACK_SIZE
定义内部ThreadX系统计时器线程的堆栈大小(以字节为单位)。该线程处理所有线程睡眠请求和所有服务调用超时。此外,所有应用程序计时器回调例程都是从这个上下文中调用的。默认值是特定于平台的,可以在***tx_port.h***中找到。
可以使用**_tx_version_id这个变量在程序中获取tx version,在*tx_port.h***中定义了这个变量