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