CC254x到CC2640
Posted 枫之星雨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CC254x到CC2640相关的知识,希望对你有一定的参考价值。
介绍
TI-RTOS是CC26xx设备上蓝牙低功耗项目的新操作环境。该软件是一个多线程环境,其中,协议栈、应用程序及其配置文件存在于不同的线程上。TI-RTOS具有与OSAL相似的功能,但实现它们的机制不同。本节介绍了在蓝牙低功耗协议栈之上开发应用程序时,TI-RTOS和OSAL之间的主要区别。虽然TI-RTOS的并入是主要架构的变化,但蓝牙低功耗API和相关程序与CC254x相似。
本节包括以下主题:
1.OSAL
2.用ICall分离的应用和协议栈
3.线程,信号量和队列
4.外围驱动程序
5.事件处理
这些差异大都是TI-RTOS独有的。本节将介绍这些差异以及它们与OSAL的关系。
OSAL
移植到TI-RTOS的一个重大变化是从OSAL环境中完全移除应用程序。虽然协议栈代码在自己的线程中使用OSAL,但应用程序线程只能使用在“ICallBleAPI.c”中定义的OSAL的API。许多功能,如“osal_memcpy,osal_memcmp和 osal_mem_alloc()”不可用。这些功能已被TI-RTOS,C运行时和ICall API所取代。比如,OSAL的“osal_mem_alloc()”被ICall API的“ICall_malloc()”取代等等。
用ICall分离的应用和协议栈
在CC2640蓝牙低功耗协议栈中,应用程序是与协议栈镜像不同的OSAL方法,它仅由单个镜像组成。这个分离的好处在ICall中有详细介绍。这种结构允许应用程序和协议栈的独立升级。
协议栈镜像的启动入口的地址在构建时由应用程序镜像知道,因此应用程序镜像知道协议栈镜像的启动位置。应用程序和协议栈之间的消息传递通过称为ICall的开发框架。(间接调用框架)此功能允许应用程序调用OSAL中使用的相同API,但由ICall解析并发送到协议栈进行处理。许多协议栈的功能被定义在 ICallBleAPI.c为应用程序透明地使用,而ICall则透明地处理协议栈的发送和接收。
线程、信号量和队列
与单线程操作系统(如OSAL)不同,TI-RTOS是多线程的,每个线程都有自定义优先级。TI-RTOS处理线程同步,为应用程序线程提供API,用于维护不同线程之间的同步。信号量是应用程序的主要同步源。信号量用于将事件消息传递给应用程序的事件处理器。
在蓝牙低功耗协议栈线程的上下文中运行的配置文件回调通过存储事件数据并在应用程序的上下文中发布应用程序的信号量来实现。类似地,在ISR上下文中运行的按键事件和时钟事件也会发出信号,将事件传递给应用程序。TI-RTOS独有的是,队列是应用程序如何按照事件的调用顺序处理事件,并从配置文件和协议栈运行回调函数。队列还提供事件处理的FIFO排序。示例项目可以使用队列来管理来自应用程序配置文件或GAP配置文件角色的内部事件(例如,Peripheral或Central)。ICall使用一个队列,它通过ICall API访问。
外围驱动程序
除了切换到基于RTOS的环境外,外设驱动程序代表了CC254x架构的重大变化。CC254x软件使用的任何驱动程序必须移植到相应的TI-RTOS驱动程序接口。
事件处理
类似OSAL,每个TI-RTOS任务具有实现了应用程序基本任务的两种功能:simple_peripheral_init()和 simple_peripheral_taskFxn()。
1.simple_peripheral_init()包含应用程序配置文件、GAP和GATT角色的ICall注册例程和初始化功能。通常在CC254x应用程序的START_DEVICE_EVT 事件的函数调用也在simple_peripheral_init()函数中进行。初始化包括设置应用程序应从配置文件和协议栈层接收的回调。
2.simple_peripheral_taskFxn()包含处理事件的无限循环。在循环进入并刚刚完成初始化之后,应用程序任务调用ICall_wait()阻塞其信号量,直到发生事件。
与CC254x应用程序的osal_set_event()类似,应用程序任务用simple_peripheral_clockHandler()设置事件之后用Semaphore_post(sem)发起应用程序的信号量,唤醒应用。另一种方法是使用simple_peripheral_enqueueMsg()排列消息来按照顺序处理事件。与CC254x应用程序的osal_start_timerEx()类似 ,您可以在使用Util_constructClock()的预定时间后使用时钟设置事件 。此函数还可以设置simple_peripheral项目中所示的周期性事件。
事件可以来自相同的任务,配置文件或协议栈。首先处理协议栈中的事件,并调用 与CC254x应用程序osal_msg_receive() 类似的ICall_fetchServiceMsg()。在回调函数中收到的内部事件和来自配置文件或GAP角色的消息必须被视为重入,并且也应在simple_peripheral_taskFxn()函数中处理。换句话说,处理应该在应用程序上下文中完成。在许多情况下,例如在GAP角色配置文件回调中,您必须将事件放在队列中以保留消息到达的顺序。
以上是关于CC254x到CC2640的主要内容,如果未能解决你的问题,请参考以下文章