附录C 尺寸基准
本附录描述了SYS/BIOS尺寸基准统计。
C.1 概览
尺寸基准是一系列建立在彼此之上的应用。移动到表C-1,每个应用都包含之前应用的所有配置设置和API调用。所有的测试应用,默认情况下都包含常用的Hwi和Swi模块。反过来,这将为该模块提供所有相关代码,同时排除大多数其他非依赖模块代码
应用程序分为三类:
- 构造SYS/BIOS对象的
- 创建SYS/BIOS对象的
- 创建POSIX对象的
除了检测应用程序的尺寸基准,还提供了指定模块的尺寸基准。这些基准显示了创建单个指定SYS/BIOS对象实例需要多少内存。
实际的尺寸基准数据包含在SYS/BIOS 6安装目录下的ti.sysbios.benchmarks包内(也就是 BIOS_INSTALL_DIR\packages\ti\sysbios\benchmarks\doc-files目录)。每个目标都有单独的HTML文件可通过benchmarks.html页到达,应跟下各节一起阅读作为实际尺寸信息的参考。
当Build-Profile设置为“release”,并且BIOS.libType配置参数设置为BIOS.LibType_Custom时,会收集基准数据。见2.4.5节的
Compiler and Linker Optimization获取更多这些设置。
对于每个基准应用,表提供了四块尺寸信息,对于C28x设备来说所有使用8bit或16bit。
- 代码尺寸:最终执行文件所有代码的总大小。
- 初始数据尺寸:所有常量的总大小(.const片的大小)。
- 非初始数据尺寸:所有变量的总大小。
- C初始化尺寸:生成针对TI编译器的C初始化记录代码的总大小。
![基于TI-RTOS的CC2650DK开发(23)--- 尺寸基准 - 阿巴睇 - 阿巴睇的博客](http://img2.ph.126.net/nYGhdl7VL19Xwi8eRNVIGw==/6631892399420460284.jpg)
C.2 构建应用尺寸
每个应用程序都建立在上表C-1中应用的基础之上,并为每个模块生成两个基准:应用尺寸和模块对象所使用的内存量。下面的应用程序所构建的对象并未使用任何内存分配。
注意:以下所有应用,包括Hwi和Swi模块都在它们各自的配置文件中。
每个应用的代码片段适用于所有目标,除了标注的地方。
C.2.1 构造Task应用
Task应用配置脚本启用Task调度,同时通过禁用任务堆栈检查调试功能来尽量减少代码尺寸。该脚本还减少了允许优先级task的数量,以减少RAM的使用。
添加配置脚本:
var BIOS = xdc.useModule(
'ti.sysbios.BIOS');
var Task = xdc.useModule( 'ti.sysbios.knl.Task'); BIOS.taskEnabled = true; Task.checkStackFlag = false; Task.numPriorities = 2; |
添加C代码:
Task_Struct taskStruct;
Task_Handle taskHandle; Task_Params taskParams; Task_Params_init(&taskParams); taskParams.stackSize = TASKSTACKSIZE; taskParams.stack = &taskStack; Task_construct(&taskStruct, twoArgsFxn, &taskParams, NULL); taskHandle = Task_handle(&taskStruct); Task_getPri(taskHandle); Task_destruct(&taskStruct); |
C.2.2 构建Semaphore应用
此应用还包含构建C.2.1节所述的Task应用。为了减少代码尺寸,可在Semaphore应用配置脚本中禁止在Semaphore中支持Events。
添加配置脚本:
var Sem = xdc.useModule(
'ti.sysbios.knl.Semaphore');
Sem.supportsEvents = false; |
添加C代码:
Semaphore_Struct semStruct;
Semaphore_Handle semHandle; Semaphore_construct(&semStruct, 0, NULL); semHandle = Semaphore_handle(&semStruct); Semaphore_post(semHandle); Semaphore_pend(semHandle, BIOS_WAIT_FOREVER); Semaphore_destruct(&semStruct); |
C.2.3 构建互斥应用
此应用包含构建C.2.2节所描述的Semaphore应用。在这个应用中没有互斥模块特定配置设置的改变
添加配置脚本:
var GateMutex = xdc.useModule(
'ti.sysbios.gates.GateMutex');
|
添加C代码:
GateMutex_Struct mutexStruct;
GateMutex_Handle mutexHandle; IArg mutexKey; GateMutex_construct(&mutexStruct, NULL); mutexHandle = GateMutex_handle(&mutexStruct); mutexKey = GateMutex_enter(mutexHandle); GateMutex_leave(mutexHandle, mutexKey); GateMutex_destruct(&mutexStruct); |
C.2.4 构建时钟应用
此应用包含C.2.3节所述的互斥应用。
Clock应用配置脚本使用SYS/BIOS时钟服务,这会注册一个定时器Hwi以产生系统tick。
添加配置脚本:
var BIOS = xdc.useModule(
'ti.sysbios.BIOS');
var Clock = xdc.useModule( 'ti.sysbios.knl.Clock'); BIOS.clockEnabled = true; |
添加C代码:
Clock_Struct clockStruct;
Clock_Handle clockHandle; Clock_construct(&clockStruct, oneArgFxn, 10, NULL); clockHandle = Clock_handle(&clockStruct); Clock_start(clockHandle); Clock_stop(clockHandle); Clock_destruct(&clockStruct); |
C.3 Created模块应用尺寸
created应用展示了使用C代码动态创建对象的尺寸影响。配置文件和构建副本一样,和C.2节所见的相同,除了使用以下设置启用运行时创建:
/* Allow for run-time creates/memory allocation */
var Defaults = xdc.useModule( 'xdc.runtime.Defaults'); var Types = xdc.useModule( 'xdc.runtime.Types'); Defaults.common$.memoryPolicy = Types.CREATE_POLICY; BIOS.runtimeCreatesEnabled = true; |
除了<Module>_construct()调用被替换为<Module>_create调用,.c文件和它们的构建副本相同。
注意:所有在内部使用<Module>_create()的应用从内存模块中取出代码以为新对象实例分配空间。
C.3.1 创建Task应用
创建Task应用演示了动态创建和删除一个Task实例对尺寸的影响。
添加C代码:
Task_Handle dynamicTask;
Task_Params taskParams; Task_Params_init(&taskParams); taskParams.stackSize = TASKSTACKSIZE; taskParams.stack = &taskStack; dynamicTask = Task_create(twoArgsFxn, &taskParams, NULL); Task_getPri(dynamicTask); Task_delete(&dynamicTask); |
C.3.2 创建Semaphore应用
创建Semaphore应用演示了动态创建和删除一个Semaphore实例对尺寸的影响。
添加C代码:
Semaphore_Handle dynamicSem;
dynamicSem = Semaphore_create( 0, NULL, NULL); Semaphore_post(dynamicSem); Semaphore_pend(dynamicSem, BIOS_WAIT_FOREVER); Semaphore_delete(&dynamicSem); |
C.3.3 创建互斥应用
创建互斥应用演示了动态创建和删除一个互斥实例对尺寸的影响。
添加C代码:
GateMutex_Handle dynamicMutex;
IArg dynamicMutexKey; dynamicMutex = GateMutex_create( NULL, NULL); dynamicMutexKey = GateMutex_enter(dynamicMutex); GateMutex_leave(dynamicMutex, dynamicMutexKey); GateMutex_delete(&dynamicMutex); |
C.3.4 创建时钟应用
创建时钟应用演示了动态创建和删除一个时钟实例对尺寸的影响。
添加C代码:
Clock_Handle dynamicClock;
dynamicClock = Clock_create(oneArgFxn, 10, NULL, NULL); Clock_stop(dynamicClock); Clock_delete(&dynamicClock); |
C.4 POSIX应用尺寸
POSIX尺寸基准使用一系列应用动态创建它们各自的对象,请参阅
SYS/BIOS POSIX Thread (pthread) Support wiki page获取更多关于创建POSIX对象的信息。
C.4.1 POSIX Pthread应用
POSIX Pthread应用演示了动态初始化和创建一个 POSIX Pthread对尺寸的影响。因为Pthreads是基于SYS/BIOS Task模块生成的,它们的尺寸可比照创建Task应用的基准。
添加C代码:
pthread_t threadHandle = (pthread_t)
NULL;
int threadArg = 1; UInt32 retVal; /* Set up stack buffer, pthread_create calls Task_create internally */ pthread_attr_t pattrs; pthread_attr_init(&pattrs); pthread_attr_setstack(&pattrs,( void *)taskStack, TASKSTACKSIZE); pthread_create(&threadHandle, &pattrs, threadFxn, ( void *)&threadArg); pthread_join(threadHandle, ( void **)&retVal); |
C.4.2 POSIX Semaphore应用
POSIX Semaphore应用演示了动态创建一个POSIX Semaphore对尺寸的影响。此应用包含PThread模块,它的尺寸可以比照创建Semaphore应用的基准。
添加C代码:
static sem_t sem1;
sem_init(&sem1, 0, 0); sem_trywait(&sem1); sem_destroy(&sem1); |
C.4.3 POSIX互斥应用
POSIX互斥应用演示了动态创建一个POSIX互斥对尺寸的影响。此应用包含PThread模块,它的尺寸可比照创建互斥应用的基准。
添加C代码:
int getVal;
pthread_mutexattr_t attrs; /* Create minimal mutex(No priority) */ pthread_mutexattr_setprotocol(&attrs, PTHREAD_PRIO_NONE); pthread_mutex_init(&mutex, &attrs); pthread_mutexattr_getprotocol(&attrs, &getVal); pthread_mutexattr_destroy(&attrs); pthread_mutex_destroy(&mutex); |
C.4.4 POSIX定时器应用
POSIX定时器应用演示了动态创建一个POSIX定时器对尺寸的影响。此应用包含了PThread模块,它的尺寸可比照创建时钟应用的基准。
添加C代码:
sigevent sev;
timer_t timer; timer_create(CLOCK_MONOTONIC, &sev, &timer); |