首页 > 编程知识 正文

afudos刷bios教程,bios中断大全

时间:2023-05-04 16:21:02 阅读:60377 作者:126

本章介绍SYS/BIOS与TI-RTOS和其他TI-RTOS组件之间的关系

SYS/BIOS SYS/BIOS是可扩展的实时内核。 旨在实现实时调度和同步或实时监控。 提供多线程、硬件抽象、实时分析和配置工具。 SYS/BIOS最小化目标内存和CPU要求

SYS/BIOS是TI-RTOS产品的“TI-RTOS密钥”组件

SYS/BIOS具有以下优点:

所有SYS/BIOS对象都可以静态或动态配置,以最小化内存大小。 因为APP应用程序编程接口是模块化的,所以只有程序中使用的API必须绑定到可执行程序。 另外,静态配置的对象不需要创建包含对象的调用,因此代码大小会变小。 错误检查和协调工具是可配置的,可以从生产代码版本中永久删除。 几乎所有系统调用都能提供可靠的性能,以最大化性能并最小化内存大小。 此外,APP应用程序可以确保满足实时截止日期。 为了提高性能,通过在主机上监视格式化了日志和跟踪等数据的线程模型,为各种情况提供线程类型。 可以支持硬件中断、软件中断、任务、空闲函数和周期函数。 通过选择线程类型,可以控制线程的优先级和块特性。 提供支持线程之间通信和同步的机制。 这包括信号、邮箱、事件、关口、可变长度消息等,可变大小和固定大小的块分配中断调度程序处理低级上下文存储和恢复从实时多任务内核(SYS/BIOS )扩展到完整的RTOS解决方案,包括其他中间件组件和设备驱动程序。 TI-RTOS通过提供预测试和集成的基本系统软件组件,使程序员能够专注于APP应用程序开发

TI-RTOS的组件

ti-RTOS kernel:sys/BIOS ti-RTOS instrumentation:ui ATI-RTOS networking:nd kti-RTOS文件系统: fatfsti-RTOS USB:USB TI-RTOS examples SYS/BIOS与XDCtools的关联XDCtools提供了TI-RTOS及其组件(包括SYS/BIOS )所需的基本核心工具。 要使用TI-RTOS,必须同时安装xdc工具和SYS/BIOS。

xdc工具将在CCS安装过程中自动安装。

如果要将TI-RTOS或SYS/BIOS作为独立产品安装,还必须下载并安装xdc工具。

由于以下原因,xdc工具对SYS/BIOS用户很重要:

xdc工具提供了一种用于配置用户在APP应用程序中使用的SYS/BIOS和xdc工具模块的技术。 xdc工具提供了构建配置文件的工具。 在此构建过程中,您将创建并编译源代码文件,然后将其链接到APP应用程序代码。 xdc工具提供许多模块和运行时API。 SYS/BIOS使用这些模块和API进行内存分配、日志记录、系统控制等。 SYS/BIOS是软件包的集合,每个软件包都提供产品功能。xdc工具使用软件包名称约定便于阅读,以防止来自不同源的软件包发生命名空间冲突。 这给系统集成带来了问题。

SYS/BIOS包符合此规则,名称由分层命名模式组成,各级用句点“.”分隔。

下图是用于创建APP应用程序的工具的体系结构图。 XDCtools提供的xdc.runtime软件包包含允许APP应用程序与SYS/BIOS模块和API一起使用的模块和API。

使用xdc工具配置SYS/BIOS配置是使用SYS/BIOS的重要部分,可用于:

指定APP应用程序使用的模块和包,静态创建APP应用程序使用的模块对象,验证查看和隐式使用的模块集,静态设置系统、模块和对象参数,以及运行xdc工具将解析这些文件,以创建相应的c源代码、c头文件和连接器命令文件,然后编译并链接到最终APP应用程序。

下图是典型的sys/BIOS APP应用程序构建流程图。

配置(*.cfg )文件使用简单语法(如JavaScript )设置对象提供的属性和调用方法。 您可以通过以下方式创建和修改配置文件:

*.cfg文件xdc工具模块,使用文本编辑器在CCS上使用可视化配置工具(XGconf )在CCS的XGconf编辑器的cfg脚本选项卡中编辑配置文本包含几个模块,可提供成功运行BIOS APP应用程序所需的基本系统服务。 这些模块大部分位于xdc工具的xdc.runtime软件包中。 缺省情况下,所有sys/BIOS APP应用程序都将在生成时自动添加xdc.run

time包

XDCtools提供的用于C代码和配置文件的功能大致分为四类:

SYS/BIOS Packages and APIs

SYS/BIOS提供了下列的包:

每个SYS/BIOS包提供了一个或多个模块。每个模块又提供了使用该模块的API。API的函数名的形式为Module_actionDescription()。例如,Task_setPri()设置Task线程的优先级

为了使用一个模块,应用程序必须包含标准的SYS/BIOS头文件和指定模块的头文件。例如:

#include<xdc/std.h> //initializes XDCtools#include<ti/sysbios/BIOS.h> //initializes SYS/BIOS#include<ti/sysbios/knl/Task.h> //initializes Task module

每个模块提供的API函数不同

SYS/BIOS对象创建

有几个模块支持创建的实例对象。这些模块包括Hwi,Task,Swi,Semaphore,Mailbox,Queue,Event,Clock,Timer和各种各样的Gate和Heap模块。例如,Task模块允许创建多个Task对象。每个Task对象对应一个线程,该线程有子集的函数、优先级和时间。

这些实例对象按下面三种方式创建

Module_create():创建API需要一个堆来允许对象动态内存分配。所有模块创建函数都要求一个Error_Block传递给创建函数。

Error_init(&eb); Semaphore_Params_init(&semaphoreParams); semaphore0 = Semaphore_create(0,&semaphoreParams,&eb);

Module_construct():construct必须传递一个对象结构,而不是从堆中动态分配对象。避免动态内存分配有助于减少代码占用。大多数Module_construct() API不需要Error_block,这也有助于减少代码占用。某些Module_construct() API可能会在内部分布内存

Semaphore_Struct semaphore0Struct; Semaphore_Params semaphoreParams; Semaphore_Params_init(&semaphoreParams); Semaphore_construct(&semaphore0Struct,0,&semaphoreParams);

Static creation允许在应用程序的*.cfg文件。如果是静态分配对象,则不需要堆。对象的结构被添加到为配置的生成的源文件中。下面的 *.cfg 语句配置一个Semaphore对象。Semaphore将使用与Semphore_create()相同的Semaphore_post()调用来post:

var semaphore0Params = new Semaphore.Params(); Program.global.semaphore = Semaphore.create(0,semaphore0Params );

静态创建的对象不能在运行时销毁

TI-RTOS例子使用了Module_construct()机制,这是静态和动态创建之间的一个很好的折衷。但是,每种类型的对象都有各自的优缺点,如下表:


每种对象创建方法都使用一个Module_Params结构体。这些结构体包含实例配置参数来控制实例的行为。下面的是SYS/BIOS中定义的Semaphore_Params结构体:

typedef struct Semaphore_Params{//Instance config-params structureIInstance_Params * instance;//Common per-instance configurationEvent_Handle event;//Event instance to use if non-NULLUInt eventId;//eventId if using EventsSemaphore_Mode mode;//Semaphore mode:COUNTING or BINARY}Semaphore_Params;

下列的应用程序代码创建了Semaphore parameters结构体,用默认参数进行初始化,并且"mode"参数设置为BINARY来指定这是一个二进制的信号量。然后就可以调用Semaphore_create()或者Semaphore_construct()来创建一个实例:

Semaphore_Params semaphoreParams;Semaphore_Params_init(&semaphoreParams);semaphore.mode = Semaphore_Mode_BINARY; POSIX线程支持

SYS/BIOS提供了一组POSIX线程(pthread) API的集合。这些包括pthread线程,互斥锁,读写锁,障碍和条件变量。pthread API可以简化将应用程序从POSIX环境移植到SYS/BIOS的过程,并允许在POSIX环境和SYS/BIOS中编译相同的代码。由于pthread API构建在SYS/BIOS中的task和Semaphore模块之上,因此可以从SYS/BIOS Tasks调用一些POSIX API

Using C++ with SYS/BIOS

SYS/BIOS应用程序可以用C或C++编写。了解C++和SYS/BIOS的几个问题有助于C++应用程序的顺利开发。问题涉及内存管理、名称修改、配置属性的调用类方法,以及类构造函数和析构函数的注意事项。

内存管理

new和delete的函数是用于动态内存分配和释放的C++操作符。对于TI设备,这些操作符使用malloc()和free()。SYS/BIOS提供内部使用xdc的malloc()和free()的可重入版本,内部使用xdc.runtime.Memory模块和默认为ti.sysbios.heaps.HeapMem模块。

名字修改

C编译器通过在函数的链接级别名称中的编码函数的签名来实现函数重载、运算符重载和类型安全链接。将签名编码为linkname的过程称为名称修改

名字修改可能会干扰SYS/BIOS应用程序,因为在配置中使用函数名来引用C源文件中声明的函数。为了防止名称混乱,从而使函数在配置中要可识别,因此有必要在外部C块中声明函数,有必要在外部的C块中声明函数。

/*extern "C" block to prevent name mangling of Functions called within the Configuration Tool*/extern “C” {void clockTask(Clock clock);void clockPrd(Clock clock);void clockIdle(void);}//end extern "C"

extern C块允许在配置文件中引用这些函数。如下:

var taskoParams = new Task.Params();task0Params.instance.name = "task0";task0Params.arg0 = $externPtr("cl3");Program.global.task0 = Task.create("&clockTask",task0Params);

注意,在上面的配置中,Task的arg0参数被设置为$externPtr(“cl3”)。为该参数创建全局时钟对象的C++代码如下:

/*Global clock objects*/Clock cl3(3);/*task clock*/

在extern C块中声明的函数不受名称损坏的影响。由于函数重载是通过名称损坏完成的,因此函数重载对于配置中调用的函数有限制。extern C块中只能出现一个函数重载的版本。下面示例中的代码将导致错误。

extern "C" {//Example causes ERRORInt addNums(Int x,Int y);Int addNums(Int x,Int y,Int z)//error,only one version of addNums is allowed};

虽然可以在SYS/BIOS C++应用程序中使用名称重载,但从配置中只能调用一个重载函数的版本

默认参数是一个C++特性,不适用于从配置调用的函数。C++允许在函数声明中指定形式参数的默认值。但是,从配置调用的函数必须提供参数值。如果未指定值,则实际参数值未定义。

从配置文件中调用类方法

通常,要在配置中引用的函数是类对象的成员函数。不能直接从配置中调用这些成员函数,但可以通过封装函数来完成相同的操作。通过写一个封装函数并接收一个类的实例作为一个参数,可以从封装封装函数中调用类的成员函数

/*=======clockPrd=======Wrapper function for PRD objects calling Clock::tick()*/void clockPrd(Clock clock){clock.tick();return;}

类方法所需的任何附加参数都可以传递给封装函数

类的构造函数和析构函数

在C++类对象实例化的时候,类的构造函数都会执行。类似地,每当删除类对象时,都会调用类的析构函数。因此,在编写构造函数和析构函数时,应考虑函数预期执行的时间并相应地对它们进行裁剪。当调用类构造函数或析构函数时,考虑什么类型的线程将运行是非常重要的。

不同的准则适用于可以从不同的SYS/BIOS线程(任务、软件中断和硬件中断)调用哪些SYS/BIOS API函数。例如,内存分配APIs(如memory_alloc()和memory_calloc())不能在软件中断的上下文中调用。因此,如果一个特定的类被软件中断实例化,它的构造函数必须避免执行内存分配。

同样,类析构函数预期执行的时间也很重要。类析构函数不仅在显示删除对象时执行,而且本地对象执行超出范围。需要知道调用类析构函数时正在执行的线程类型,并且只进行适合该线程的SYS/BIOS API调用。

参考文献:

《TI-RTOS Kernel (SYS/BIOS) User’s Guide》

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。