cc2640蓝牙芯片软件开发指导说明文件 - 图文

3. 当手动修改ICALL_RAM0_ADDR之后发生了连接错误,验证每个工程是否有足够的RAM调

用空间

3.11.5 动态内存调用

该系统使用了两个堆来实现动态内存调用。因此明白每个堆的用法很重要,这样应用开发者就可以最大限度的使用提供的内存了。

RTOS配置了一个小的堆在appBLE.cfgRTOS配置文件中:

var HeapMem = xdc.useModule('xdc.runtime.HeapMem'); BIOS.heapSize = 1668;

这个堆(“heapMEM”)用于初始化RTOS实体和分配BLE协议栈任务的运行时间的栈。这个堆的大小需要选择以适应系统初始化的要求。因为该堆的小尺寸,不允许调用RTOS堆的内存空间给一般应用使用。要获得关于TI-RTOS堆配置的更多信息,请看SYS/BIOS用户指导中的堆的实现章节

相反,这里有一个单独的堆是留给应用使用的。Icall模块直接初始化一个应用的RAM,heapmgrHeapstore,这个区域可以被各种任务使用。这个Icall堆的大小是在应用进程宏HEAPMGR_SIZE定义的,SimpleBLEPeripheral工程中默认设为2672。尽管Icall堆在应用工程中定义,但是同样与BLE协议栈共享。为了增加Icall堆的大小,需要在应用工程中调整预处理符HEAPMGR_SIZE的值

为了确定Icall堆使用的数量,定义应用工程中的HEAPMGR_METRICS预处理符。参考$BLE_INSTALL$\\Components\\applib\\heap中heapmgr.h文件提供的堆度量。 这里有个关于动态在Icall堆中调用一个可变长度队列的例子:

//define pointer uint8_t *pArray;

// Create dynamic pointer to array.

if (pArray = (uint8_t*)ICall_malloc(n*sizeof(uint8_t))) {

//fill up array } else {

//not able to allocate }

这里是一个关于释放上面的队列的例子: Icall_free(pMsg->payLoad);

3.11.6 关于初始化RTOS实体的一个主意

因为RTOS的堆的大小是有限制的,所以强烈要求构建而不是创建RTOS实体。为了阐明这点,考虑Clock_construct()和Clock_create()函数之间的区别。这里是它们来自SYS/BIOS接口中的定义:

通过声明一个静态的Clock_Struct实体并发送这个实体到Clock_construct()中,这个真实的Clock_Struct的.DATA区域开始使用。不是限制的RTOS堆。相反,Clock_create()将会导

致RTOS为Clock_Struct分配RTOS的限制堆。

一般而言要尽可能的在贯穿整个工程中初始化时钟和RTOS实体。如果必须使用创建RTOS实体,那么RTOS堆就可能需要在appBLE.cfg中进行调整大小。

3.12使用边界工具来调节RAM & Flash的边界配置

边界工具(boundary.exe)在调整各自的预处理符时非常实用,ICALL_STACK0_ADDR(flash)和ICALL_RAM0_ADDR(RAM),这些边界都是在应用和栈工程之间共享的。边界工具可以通过调整边界来把没有用到的flash或者RAM的空间分配给应用工程。该工具消除了工作在双工程环境下手动调整RAM和Flash边界的必要。

边界工具不会修改工程文件。另外,边界工具也不会修改任何源代码或任何编译/链接的优化表现。该工具只是基于对工程映射和链接配置文件的分析后简单的调整RAM和Flash各自的边界地址。

边界工具安装路径为:

C:\\Progra

>>閻忕偞娲栫槐鎴﹀礂閵婏附鐎�<<
12@gma联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4