TI-RTOS概述

线程模块

TI-RTOS内核管理线程执行的四个不同的任务级别,按照优先级降序排列为:

硬件中断

软件中断

任务

后台空闲功能的空闲任务

硬件中断

Hwi线程也称为中断服务程序或ISR,是TI-RTOS应用程序中具有最高优先级的线程。

Hwi 线程用于执行有严格时间限制的关键任务,它们被触发以响应在实时环境中发生的外部异步事件(中断)。Hwi 线程总是运行至完成,但是如果有其他 Hwi 中断使能,它也可以暂时地被其他中断触发的 Hwi 线程抢占,这就是所谓的中断嵌套。

软件中断

Swis 是通过在程序编写过程中调用某些 Swi 模块的 API 来触发中断。由于时间限制,Swis 中断服务程序不能作为任务来运行,其截止时间不如硬件中断服务程序那么严格。

任务

任务线程的优先级高于空闲任务线程,低于软件中断。任务与软件中断的不同之处是:任务可以在执行期间等待(阻塞),直到有必要的资源可用。每个任务线程都有一个独立的堆栈。TI-RTOS 提供了可用于任务间通信和同步的多种机制。这些包括信号量、事件、消息队列和邮箱。

空闲任务

空闲任务线程在 TI-RTOS 应用程序中优先级最低,它会执行一个空闲循环。在主函数返回之后,TI-RTOS 应用程序会调用每个 TI-RTOS 模块的启动程序,然后进入空闲循环。每个线程在被再次调用之前都必须等待所有其他线程执行完成。空闲循环在没有更高优先级的任务需要执行的时候会一直执行。只有没有严格截止期限的函数才能在空闲循环中执行。

内核配置

TI-RTOS 应用程序可以使用工程中的 .cfg 文件来配置 TI-RTOS 内核。在 IAR 和 CCS 工程中,配置文件在应用程序项目工作区中的 TOOLS 文件夹下。

可以在 .cfg 文件中配置的一些选项(但不限于这些):

启动选项 Hwi、Swi 和任务优先级的数量 异常和错误处理 系统刻度的持续时间( TI-RTOS 内核中最基本的时间单位)。 定义应用程序的入口点和中断向量 TI-RTOS 堆和堆栈(不要与其他堆管理器混淆!) 包括预编译的内核和 TI-RTOS 驱动程序库 系统配置(for System_printf() )

一旦 .cfg 文件发生变动时,您需要重新运行 XDCTools 的 configuro 工具。.cfg 的名称并不重要,但是项目只能包含一个 .cfg 文件。

创造与构建

大多数 TI-RTOS 模块通常都有 _create()_construct() APIs 用来初始化最初的例程,这两个 API 之间运行时的主要差异是内存分配和错误处理。

线程同步

TI-RTOS 内核提供了几个诸如信号量、事件和队列用于同步任务的模块。

信号量

信号量通常用于 TI-RTOS 应用中的任务同步和互斥。

信号量可以分为计数信号量或二进制信号量。程序通过 Semaphore_post() 来释放信号量,计数信号量会记录跟踪信号量发布的次数。当一组资源在任务之间共享时,信号量很有用。在使用这些资源之前,任务会调用 Semaphore_pend() 来查看资源是否可用,只有共享资源被释放出来之后处于等待状态的任务得到该资源才能执行。

二进制信号量只能有两种状态:可用(count = 1)和不可用(count = 0)。二进制信号量可用于在任务之间共享一个资源,或者用于基本信令机制,可以多次发布信号量。二进制信号不跟踪计数, 他们只跟踪信号量是否已经发布。

等待信号量

Semaphore_pend() 是一个阻塞函数调用,它只能在任务中调用。当任务调用此阻塞函数后将会等待信号量的释放( post ),这时就绪的低优先级任务可以执行。调用 Semaphore_pend() 如果计数器为 0 ,任务将阻塞,否则计数器会递减 1 ,任务执行。

在另一个线程调用 Semaphore_post() 释放信号量或者提供的系统滴答时钟超时之前,任务都会保持阻塞状态。通过读取其返回值 Semaphore_pend() 可以区分信号量是否发布或超时。

发布信号量

信号量的发布是通过调用 Semaphore_post() 完成的。在发布信号量上挂起的任务将从阻塞状态转换到就绪状态。如果此时正好没有更高优先级的线程准备运行,得到该信号量的任务将会运行。如果信号量上没有挂起任务,调用 Semaphore_post() 将时信号量计数器加 1 ,二进制信号量的最大计数为 1 。

事件

事件等待

Event_pend()

事件发布

Event_post()

队列

TI-RTOS 队列是一个基于先入先出(FIFO)、线程安全的单向消息传递模块。队列通常用于高优先级线程将消息传递给较低优先级的线程以进行延迟处理,因此允许低优先级任务阻塞直到需要运行。

任务

TI-RTOS 任务(或称为线程)就是一段简单的程序,通常是一段死循环。实际上,将处理器从一个任务切换到另一个任务有助于实现并发。每个任务总是处于以下运行状态之一:

  • 运行:任务当前正在运行

  • 就绪:任务准备好等待执行

  • 阻塞:任务被暂停执行

  • 终止:任务终止执行

  • 无效:任务处于无效列表中(还不受 TI-RTOS 管理)

每个任务都会分配相应的优先级,多个任务可以具有相同的优先级。任务是从最高优先级向最低优先级执行的,相同优先级的任务按照到达顺序进行执行。当前运行的任务的优先级永远不会低于任何就绪任务的优先级。当有更高优先级的任务就绪时,正在运行的任务才会被抢占并重新安排执行。

就典型的使用情况而言,任务大部分时间都通过调用称为 _pend() 的 API(例如Semaphore_pend())而处于阻塞状态。通常高优先级线程(例如 Hwis 或Swis )使用 _post() API(例如 Semaphore_post() )来解除某些任务的阻塞。

时钟

猜你喜欢

转载自blog.csdn.net/weixin_45485619/article/details/127800736
TI