致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:\\Program Files (x86)\\Texas Instruments\\Boundary
该路径下有个ReadMe.txt文件,该文件包含了该工具的其他信息。
3.12.1 配置边界工具
边界工具使用一个XML文件,BoundaryConfig.xml,位于工具的安装路径,用来配置默认的工具操作。要求保持这些默认值。
每个SDK中的工程都有一系列的配置文件,这些文件由IDE的连接器和编译器使用来设置或调整Flash和RAM各自的值。这些配置文件位于各自工程的如下位置:
$BLE_INSTALL$\\Projects\\ble\\
1. 边界连接器配置文件:IAR-Boundary.xcl [IAR] or ccsLinkerDefines.cmd [CCS].用于定义
ICALL_STACK0_ADDR和ICALL_RAM0_ADDR边界地址。这个文件位于TOOLS IDE文件夹下面并且在有调节需求是由边界工具更新。
2. 边界C的定义文件IAR-Boundary.cdef [IAR] or ccsCompilerDefines.bcfg [CCS].限于IAR或
CCS连接器的限制,ICALL_STACK0_ADDR必须在该文件中的定义与连接器中的配置文件中的定义一致。这个文件位于TOOLS IDE文件夹,当有调节需求时由边界工具更新。
3.12.2 边界工具操作
边界工具(boundary.exe)被作为一个栈工程IDE编译后的操作。如果需要对RAM和/或Flash的边界进行调整,边界工具会更新连接器或编译器各自的配置文件并生成一个编译后的错误来通知一个变化应经发生。为了配合配置值的更新,在应用和栈工程中各执行一个“Project
??Rebuild All”。
除了代码和内存的大小外,边界工具也会在计算ICALL_STACK0_ADDR的值时考虑预留下来的flash页。flash保留页的例子包含在CCA页。flash预留页在栈工程连接器配置文件中定义。 一个使用边界工具的先决条件就是应用和栈工程第一次编译必须是成功的。如果产生一个连接器错误,首先应验证本次的改变有没有超出设备flash和/或RAM内存的最大值。典型的连接器错误是当栈工程配置为使用要求外部flash内存的特性。依据错误是否由flash或RAM空间造成,在各自的连接器和编译器配置文件中手动调整flash和/或RAM的边界。一旦工程可以连接成功,边界工具会重新调整各自的边界值为最佳值。然后按照要求执行“Rebuild All”。
注意:除非IAR配置为展示所有的编译消息,否则是不会给出为什么边界工具会产生一个编译错误的原因的。当IAR配置为显示所有的编译消息,“TheProject Boundary Address Has Been Moved”就会显示在编译输出窗口。在IAR中设置Tools ??Options ??Messages ??Show Build Messages to “All”.
一个关于执行了边界修改的编译消息的例子如下:
/////////////////////////////////////////////////////////////////////// Boundary Operation Complete
/////////////////////////////////////////////////////////////////////// <<< WARNING >>>
The Project Boundary Address Has Been Moved Or A Config File Change Is Required Rebuild This Project For The Address Or Config File Change To Take Effect ///////////////////////////////////////////////////////////////////////
3.12.3 禁止使用边界工具
为了禁能边界工具,打开栈工程的工程操作项选择“Build Actions”(IAR)或者“Steps”在CCS Build window(CCS),然后想下图所示一处编译后命令行。最好提前对该命令进行备份以便后面会用到边界工具。一旦边界工具被禁能了,连接器和编译器各自的配置文件就可以像3.10.3和3.11.4节中的步骤进行手动编辑了。
4 应用
这一章经描述SimpleBLEPeipheral工程的应用部分,这些应用部分都包含: 1. Pre-RTOS初始化;
2. SimpleBLEPeripheral任务:这是个应用任务,是系统中优先级最低的任务。该任务的
代码包含在编译器IDE文件夹“Application”中的simpleBLEPeripheral.c和simpleBLEPeripheral.h文件中。
3. Icall:一个抽象了的栈和其他任务之间的通讯接口模块。
注意:GAPRole任务也是应用工程工作空间的一部分。但是这个任务的功能性更接近于协议栈所以在5.2章中描述。 4.1 Start-up in main()
main()函数在IDE “Startup”文件下的main.c文件中,是整个运行时间的开始点。这里也是板子提出中断禁能和驱动初始化的地方。同样在这个函数中,电源管理也会初始化,任务会构建或创建。在最后一步,使能中断,SYS/BIOS内核调度通过调用BIOS_start()启动,没有返回,看第8张获取main()函数到达前的启动顺序:
Void main() {
PIN_init(BoardGpioInitTable); //enable iCache prefetching VIMSConfigure(VIMS_BASE, TRUE, TRUE); // Enable cache
VIMSModeSet(VIMS_BASE, VIMS_MODE_ENABLED); #ifndef POWER_SAVING
/* Set constraints for Standby, powerdown and idle mode */ Power_setConstraint(Power_SB_DISALLOW); Power_setConstraint(Power_IDLE_PD_DISALLOW); #endif // POWER_SAVING /* Initialize ICall module */ ICall_init();
/* Start tasks of external images - Priority 5 */ ICall_createRemoteTasks();
/* Kick off profile - Priority 3 */ GAPRole_createTask();
SimpleBLEPeripheral_createTask();
/* enable interrupts and start SYS/BIOS */ BIOS_start(); }
应用和GAPRole任务想3.3中描述的一样被构建了。栈任务在Icall_createRemoteTasks()中被创建了。Icall模块通过Icall_init()初始化了。整个IDE工作空间的主题,main.c存在于应用工程,这意味着当它编译后会处于应用调用的flash扇区中。 4.2 ICALL 4.2.1 介绍 间接调用框架(Icall)是一个模块,提供了应用面向BLE协议栈服务(如BLE-Stack APIs)和由RTOS提供的原始的服务(如线程同步)的机制。结合的,Icall允许应用和协议栈在一个统一的RTOS环境中高效的操作,通讯和共享资源。 Icall架构的核心组成部分是调度者,该调度者促进了应用和BLE协议栈任务间的应用程序接口通过双镜像边界。尽管多数的ICall交互抽象成了BLE协议栈接口(如:GAP,HCI等),应用开发者也有必要明白这种潜在的架构以便于在多线程RTOS环境中做到合适的BLE协议栈操作。
ICall模块源代码在应用工程中的“ICall”&“ICallBLE” IDE文件夹中。
4.2.2 ICall BLE协议栈服务
就像上图描述的一样,ICall内核使用案例包含了一个服务实体(如BLE协议栈任务)和一个客户端实体(如应用任务)之间的通讯。注意ICALL框架不能与BLE协议定义的GATT服务/客户相混淆。这样架构的原因是双重的:为了可以分开更新应用和BLE协议栈也是为了维持划分自cc2640的TI-RTOS逻辑层的软件的一致性(就想cc254x的OSAL)。
ICall BLE协议栈服务充当所有的BLE-Stack API的应用接口。当一个BLE协议栈接口被应用调用时,ICall模块将命令输送给BLE协议栈,适当的时候,将来自BLE蓝牙协议栈的消息返回给应用。
由于ICall模块时应用工程的一部分,应用任务可以通过直接函数调用访问ICall。注意由于BLE协议栈以最高优先级执行,应用任务将会阻塞直到回复的到来。某些协议栈的接口可能会立即响应,然而应用线程将会阻塞,因为该接口通过ICall调度给了BLE协议栈。其他的BLE协议栈接口可能通过ICall同步回应给应用,将恢复发送给应用任务的事件处理器中。 4.2.3 ICall的基本服务
另外,ICall包含了一个基本的服务就是抽象各种操作系统相关的函数。由于要共享资源和维持内部进程的通讯,应用应该使用下面的基本服务函数: