1 About SYS/BIOS (介绍SYS/BIOS)
本章介绍SYS/BIOS、TI-RTOS Kernel和其它TI-RTOS组件
1.1 SYS/BIOS
SYS/BIOS是一个可扩展的实时内核,是为实时调度与同步或实时检测的应用程序设计的。SYS/BIOS提供抢占多线程、硬件抽象、实时分析和配置。SYS/BIOS可降低目标的内存和CPU要求。SYS/BIOS别称为TI-RTOS Kernel,是TI-RTOS产品的组件。可以从CCS APPCenter((choose Help > CCS App Center in CCS)安装TI-RTOS,从而安装SYS/BIOS;或者安装一个独立产品 (https://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/bios/sysbios/index.html)。SYS/BIOS优势如下:
- 所有的SYS/BIOS对象均可动态或静态创建
- 2. 为减小内存大小,APIs被模块化,仅把程序使用的APIs绑定到可执行程序中。此外,静态配置的对象通过消除对象创建调用的需求来减少代码大小
- 3. 错误检查和调试工具为最大化性能的最小化内存大小,错误检查和调试工具是可配置的,而且可以从生产代码版本中删除
- 4. 几乎所有系统调用都提供确定的性能,使应用程序能够可靠地满足实时要求。为了提高性能,主机上的检测数据(如日志和跟踪)被格式化了
- 5. 线程模块提供了多种线程类型,支持硬件中断( Hardware interrupts)、软件中断( software
interrupts)、任务( tasks)、空闲函数( idle functions)和周期函数( periodic functions)。可以通过线程类型来控制线程的优先级( priorities)和阻塞特征( blocking) - 6. 在线程间提供通信和同步结构,这些结构包括信号量(semaphores)、邮箱(mailboxes)、事件(events)、门(gates)和可变长度的消息(variable-length messaging)。
- 7. 动态内存管理服务提供可变大小和固定大小内存分配
- 8. 中断调度程序处理低级上下文的保存与恢复操作,中断服务程序完全用C编写
- 9. 系统服务支持中断的启用与禁用和中断向量的插入,包括在多个源开启中断向量
-
1.2 SYS/BIOS与TI-RTOS关系
- TI- rtos是一个可扩展的一站式嵌入式工具生态系统,它可以从一个实时多任务核(real-time
multitasking kernel (SYS/BIOS) )到一个完整的 RTOS 解决方案,包括额外的中间组件和设备驱动。提供预先测试和集成的必要系统软件组件,TI-RTOS使您能够专注于区分应用程序。 - TI-RTOS的组件如下,有些组件并非适用于所有设备系列:
1.3 SYS/BIOS 与XDCtools 关系
XDCtools提供TI-RTOS及其组件(包括SYS/BIOS)所需的底层核心工具,为使用SYS/BIOS,必须同时安装XDCtools和SYS/BIOS,安装CCS时会自动安装XDCtools。XDCtools对SYS/BIOS很重要,因为要使用XDCtools去配置 SYS/BIOS and XDCtools 模块;XDCtools用来创建配置文件,此步产生的源代码文件将与应用程序代码进行编译和链接;XDCtools提供许多模块和运行的 APIs,SYS/BIOS利用这些模块和APIs进行内存分配( memory allocation)、日志记录(logging)、系统控制(system control)等。
XDCtools别称为RTSC(Real Time Software Components),它是应用于嵌入式系统中的具有Eclipse生态系统提供可重用软件组件(称为packages)的开源项目的名称。可参考rtsc.eclipseprojects.io。
1.3.1 SYS/BIOS
SYS/BIOS and XDCtools 都是包,是产品功能的一个子集。XDCtools使用包的命名来提高可读性和确保从不同来源交付的包没有命名冲突,命名冲突将给系统集成带来问题。
1.3.2 用XDCtools配置SYS/BIOS
配置SYS/BIOS:指定应用程序将使用的模块和包;可以静态地为应用程序使用的模块创建对象;验证显式和隐式使用的模块集,以确保它们是兼容的;可以静态地为系统、模块和对象设置参数,以改变它们的运行时行为。
应用程序的配置存储在一个或多个扩展名为*.cfg的脚本文件中。XDCtools对这些文件进行解析,生成相应的C源代码、C头文件和链接器命令文件,然后将它们编译并链接到最终应用程序中。下图描述了典型SYS/BIOS应用程序的构建流程。
配置文件(*.cfg)使用类似javascript的简单语法来设置对象提供的属性和调用方法。您可以通过以下方式创建和修改配置文件:
1 在CCS中使用可视化配置工具XGCONF
2 在CCS的XGCONF编辑器的“cfg Script”标签中编辑配置文本
3 在文本编辑器直接编辑*.cfg文件
使用CCS中的XGCONF配置工具配置静态SYS/BIOS Task实例的过程如下图所示。该配置可在CCS的“静态示例”SYS/BIOS项目模板中查看。
在配置工具中建立的名为“task0”的Task实例对应如下配置脚本:
var Task = xdc.useModule('ti.sysbios.knl.Task')
Task.numPriorities = 16;
Task.idleTaskStackSize = 1024;
var tskParams = new Task.Params;
tskParams.arg0 = 1;
tskParams.arg1 = 2;
tskParams.priority = 15;
tskParams.stack = null;
tskParams.stackSize = 1024;
var task0 = Task.creat('&task0Fxn',tskParams);
1.3.3 XDCtools 模块和 运行APIs
XDCtools包含的模块可提供 SYS/BIOS应用程序运行所需的基本系统服务,这些大多位于XDCtools中的xdc.runtime包中,默认所有SYS/BIOS应用程序都会在构建时自动添加xdc.runtime包。XDCtools提供用于C代码和配置文件的功能大致可以分为四类,下表中列出的模块位于xdc.runtime包中。
1.4 SYS/BIOS 包和 APIs
SYS/BIOS提供以下包:
每个SYS/BIOS包提供一个或多个模块,每个模块依次提供使用该模块的 APIs ,APIs 的函数命名形式为Module_actionDescription(),如Task_setPri()设置Task线程的优先级。使用一个模块时,你的应用程序必须包含标准的SYS/BIOS头文件和该模块的头文件,每个模块提供的APIs函数不同。
# include <xdc/std.h> /* initializes XDCtools */
# include <ti/sysbios/BIOS.h> /* initializes SYS/BIOS */
# include <ti/sysbios/knl/Task.h> /* initializes Task module*/
1.4.1 SYS/BIOS 对象创建
支持创建实例对象的模块有Hwi、Task、Swi、Semaphore、Mailbox、Queue、Event、Clock、Timer以及各种类型的Gate和Heap等。如Task模块允许您创建多个Task对象。每个Task对象对应一个线程,该线程有自己的函数、优先级和定时。实例对象可以通过以下三种方式创建:
1 Module_create() :create APIs需要一个堆( heap )来动态分配目标内存(dynamic memory allocation of the object),所有模块create函数都需要将Error_Block结构传递给create函数,如下面的代码片段创建并发布一个信号量对象:
# include <ti/sysbios/knl/Semaphore.h>
Semaphore_Handle semaphore0;
Semaphore_Params semaphoreParams;
Error_Block eb;
...
Error_init(&eb);
Semaphore_Params_init(&semaphoreParams);
semaphore0 = Semaphore_create(0,&semaphoreParams,&eb)
if (semaphore0 == NULL){
........}
Semaphore_post(semaphore0);
2 Module_construct() :构造 APIs 必须传递一个对象结构,而不是从堆中动态分配对象,避免动态内存分配有助于减少代码占用。大多数Module_construct()不需要Error_Block,这也有助于减少代码占用,一些Module_construct()可能会在内部分配内存。如在没有提供任务栈的情况下,Task_construct()会分配一个任务栈。如下面的代码片段构造并发布一个信号量对象:
# include <ti/sysbios/knl/Semaphore.h>
Semaphore_Struct semaphore0Struct;
Semaphore_Params semaphoreParams;
...
Semaphore_Params_init(&semaphoreParams);
Semaphore_construct(&semaphore0Struct,0,&semaphoreParams);
...
Semaphore_Post(Semaphore_handle(&semaphore0Struct));
3 Static creation:允许在应用程序的*.cfg文件中指定对象,静态分配对象时不需要堆,对象的结构被添加到配置生成的源文件中。下面的*.cfg语句配置了一个信号量对象。该信号量将使用与Semaphore_create()相同的Semaphore_post()调用来发布
var semaphore0Params = new Semaphore.Params();
Program.global.semaphore0 = Semaphore.create(0,semaphore0Params);
运行时静态创建的对象不会销毁
Semaphore_Params结构由SYS/BIOS定义如下:
typedef struct Semaphore_Params{ // instance config-params structure
IInstance_Params *instance; // common per-instance configuration
Event_Habdle event; // event instance to use if non-NULL
Semaphore_Mode mode ; // Semaphore mode: counting or binary
}Semaphore_Params; //有typedef 时此处Semaphore_Params为结构体Semaphore_Params的别名
/* 下面创建信号量,将模式改为二进制,以指定这是一个二进制信号量*/
Semaphore_Params semaphoreParams;
Semaphore_Params_init(&semaphoreParams);
semParams.mode = Semaphore_Mode_BINARY; //semParams ??
1.4.2 POSIX 线程支持
SYS/BIOS还提供了POSIX线程(pthread) APIs的子集,其中包括pthread线程、互斥锁(mutexes)、读写锁( read-write locks)、屏障(barriers)和条件变量( condition variables)。pthread APIs可以简化将应用程序从POSIX环境移植到SYS/BIOS的过程,并允许编译相同的代码以在POSIX环境和SYS/BIOS中运行。由于pthread APIs构建在SYS/BIOS Task和Semaphore模块之上,一些POSIX APIs可以从SYS/BIOS Tasks中调用。SYS/BIOS支持POSIX线程APIs,见TI-POSIX用户指南(/docs/tiposix/Users_Guide.html),POSIX Threads Programming | LLNL HPC Tutorials
The Open Group Base Specifications Issue 7, 2018 edition
1.5 使用c++与SYS/BIOS
系统/BIOS应用程序可以用C或c++编写,涉及内存管理、名称混淆、从配置的属性调用类方法,以及对类构造函数和析构函数的特殊考虑,SYS/BIOS提供了一个用c++编写的示例。示例代码在SYS/BIOS安装的packages\ti\sysbios\examples\generic\bigtime目录下的bigtime.cpp文件中。
1.5.1 内存管理
函数new和delete是用于动态内存分配和释放的c++操作符。而对于TI目标,这些操作符使用malloc()和free()。SYS/BIOS提供了可重入版本的malloc()和free(),它们在内部使用xdc.runtime.Memory模块和(默认情况下)ti.sysbios.heaps.HeapMem模块