基于TI-RTOS的CC2650DK开发(23)--- 尺寸基准

附录C 尺寸基准
本附录描述了SYS/BIOS尺寸基准统计。

C.1 概览
尺寸基准是一系列建立在彼此之上的应用。移动到表C-1,每个应用都包含之前应用的所有配置设置和API调用。所有的测试应用,默认情况下都包含常用的Hwi和Swi模块。反过来,这将为该模块提供所有相关代码,同时排除大多数其他非依赖模块代码

应用程序分为三类:
  • 构造SYS/BIOS对象的
  • 创建SYS/BIOS对象的
  • 创建POSIX对象的
下表中下方的应用通常需要上方应用模块(例如,Semaphore模块需要使用Task模块) 此过程允许通过减去所依赖的其他模块的尺寸来度量模块的尺寸影响。尽管如此,表中的数据依然是绝对数字。

除了检测应用程序的尺寸基准,还提供了指定模块的尺寸基准。这些基准显示了创建单个指定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)--- 尺寸基准 - 阿巴睇 - 阿巴睇的博客

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,  0NULL);
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,  10NULL);
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( 0NULLNULL);

Semaphore_post(dynamicSem);
Semaphore_pend(dynamicSem, BIOS_WAIT_FOREVER);
Semaphore_delete(&dynamicSem);

C.3.3  创建互斥应用
创建互斥应用演示了动态创建和删除一个互斥实例对尺寸的影响。

添加C代码:
GateMutex_Handle dynamicMutex;

IArg dynamicMutexKey;

dynamicMutex = GateMutex_create( NULLNULL);

dynamicMutexKey = GateMutex_enter(dynamicMutex);
GateMutex_leave(dynamicMutex, dynamicMutexKey);
GateMutex_delete(&dynamicMutex);

C.3.4  创建时钟应用
创建时钟应用演示了动态创建和删除一个时钟实例对尺寸的影响。

添加C代码:
Clock_Handle dynamicClock;

dynamicClock = Clock_create(oneArgFxn,  10NULLNULL);

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,  00);

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);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值