文章目录
用vs code调了一整天的环境没有解决,然后用vs2010直接打开就能跑,哎。后面看一下项目中是怎么引用的tx.lib。
1 Introduction to ThreadX
分时操作系统:将系统处理机时间和内存空间按照一定的时间间隔,轮流地切换给各终端用户的程序使用。特征:交互性、多路性、独立性、及时性。
实时操作系统:在一定时间限制内完成特定功能,并控制所有实时任务协调一致工作的操作系统,提供及时响应并具备高可靠性。分为两种,硬实时(规定时间内完成操作),软实时(按照任务优先级完成操作)。特征:多任务、有线程优先级、多种中断级别。
2 Installation and Use of ThreadX
- demo中有4个文件,使用时需要接入tx.a,并且要包含tx_api.h和tx_port.h
- 1) 应用threadx 函数或者数据结构时,需要include tx_api.h
- 2)main函数中调用tx_kernal_enter来开始threadX
- 3)编写tx_application_define函数,用于初始化系统资源。
- 4)编译源程序,并与ThreadX运行时库tx.lib链接。 生成的image可以下载到目标并执行!
void tx_application_define(void *first_unused_memory) 函数
my_threadx
#include "tx_api.h"
#include <stdio.h>
void my_thread_entry(ULONG thread_input);
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. */
printf("my_thread_counter = %d\n",my_thread_counter);
tx_thread_sleep(1);
}
}
2.2 Configuration Options
在tx_user.h中对一些option进行配置。
- Smallest Configuration 占用代码最小的配置
- 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_DISABLE_ERROR_CHECKING
- Fastest Configuration 执行速度最快
- TX_REACTIVATE_INLINE
TX_INLINE_THREAD_RESUME_SUSPEND
- TX_REACTIVATE_INLINE
define | meaning |
---|---|
TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO | |
TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO | |
TX_DISABLE_ERROR_CHECKING | 默认0。不使能error check,前提是在代码充分debug之后,可以降低代码大小,提高执行速度 |
TX_DISABLE_NOTIFY_CALLBACKS | 默认0,不使能通知信息的回调函数 |
TX_DISABLE_PREEMPTION_THRESHOLD | 默认0,抢占阈值 |
TX_DISABLE_REDUNDANT_CLEARING | 默认0 |
TX_DISABLE_STACK_FILLING | 0 |
TX_ENABLE_EVENT_TRACE | 0 |
TX_ENABLE_STACK_CHECKING | |
TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO | |
TX_INLINE_THREAD_RESUME_SUSPEND | 定义后,ThreadX可以改善tx_thread_resume和通过tx_thread_suspend API调用内联代码。 这增加了代码大小,但增强了这两个API调用。 |
TX_MAX_PRIORITIES | |
TX_MINIMUM_STACK | |
TX_MISRA_ENABLE | |
TX_MUTEX_ENABLE_PERFORMANCE_INFO | |
TX_NO_TIMER | 禁用tx计时器 |
TX_NOT_INTERRUPTABLE | 定义后,ThreadX不会尝试最小化中断锁定时间。 这样可以更快执行但略有增加中断锁定时间 |
TX_QUEUE_ENABLE_PERFORMANCE_INFO | |
TX_REACTIVATE_INLINE | |
TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO | 收集信号量的信息 |
TX_THREAD_ENABLE_PERFORMANCE_INFO | 收集tx的性能信息 |
TX_TIMER_ENABLE_PERFORMANCE_INFO | |
TX_TIMER_PROCESS_IN_ISR | |
TX_TIMER_THREAD_PRIORITY | 定义内部的优先级ThreadX系统计时器线程。 的默认值为优先级0,即ThreadX中的最高优先级。 默认值定义在tx_port.h |
TX_TIMER_THREAD_STACK_SIZE | 定义timer_thread 的堆栈大小 |
3 Functional Components of ThreadX
3.1 Execution Overview
程序执行分为4个部分,1 初始化 2 线程执行 3 中断服务函数 4 应用时钟
- 初始化。初始化包括处理器复位和线程调度循环的入口之间的所有程序执行。
- 线程执行。初始化完成之后,threadx进入调度环,调度环去寻找一个thread区执行。
- ISR。一旦检测到中断,处理器会保存关于当前执行程序的关键信息,然后执行ISR。
- 应用时钟。App Timer 类似于ISRs,只不过AT是最频繁的中断,但是AT之间不可以相互中断。
3.2 memory usage
3.3 initialization
- 1)main 中包括tx_kernel_enter 函数来进入tx
- 2)tx_kernel_enter 。这个进入函数会调用tx_application_define函数。
- 3)tx_application_define函数定义了所有初始应用程序线程,队列,信号量,互斥锁,事件标志,内存池和计时器。 它是也可以创建和删除系统资源。 但是,所有初始应用程序资源在这里定义。
3.4 Thread Execution
- 调用tx_thread_create 来创建线程
3.4.1 Thread Execution States
3.4.2 Thread Priorities
默认32的优先级 0-31,可以扩展到1024,每次增加32.
3.4.2 Thread Scheduling
调用基于优先级,如果是相同优先级那么遵循FIFO的原则。
3.5 Message Queues
该服务创建通常用于线程间通信的消息队列。 消息总数是根据指定的消息大小和队列中的字节总数来计算的。
3.6 Counting Semaphores
信号量:在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。
3.7 Mutexes
mutex内访问的资源,其他的线程不可以再去访问。
3.8 Event Flags
该服务创建一组32个事件标志。 所有32个事件标志组初始化为零。 每个事件标志都由一个位表示。