首先,nordic号称协议栈(称为SoftDevice)和应用完全分开,是怎么实现的呢?
TI的协议栈以库的形式提供,用户应用在链接时和库链在一起形成最终的机器代码,TI提供库和头文件供用户使用。
nordic用了不同的方式:SoftDevice,这样协议栈和用户应用可以单独编译和链接。实现BLE的SoftDevice似乎叫S110,由nordic提供。我猜nordic应该只提供S110的机器码,应该不会提供源代码。
看了nRF51 SDK,里面确实没有BLE的库,所有sd_打头的函数都是SoftDevice相关的。比如:sd_ble_gap_adv_data_set
这个函数是这么定义的:
SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const * const p_data, uint8_t dlen, uint8_t const * const p_sr_data, uint8_t srdlen));
这个SVCALL在使用MDK时是这么定义的:
#define SVCALL(number, return_type, signature) return_type __svc(number) signature
似乎是使用了Cortex-M0的SVC机制实现Softdevice。
(题外话,我在想Nordic会把自己的协议栈绑在一种CPU架构上吗?不是的,代码里有一个开关SVCALL_AS_NORMAL_FUNCTION
可以让上面的SVCALL宏定义变成普通的函数声明。当然在没有
源代码和库的情况下打开这个开关会出现找不到函数实现的链接错误)
总体来说我觉得softdevice就是nordic一种封闭协议栈核心代码的方式,和TI提供库文件的方式没有区别。
nordic号称自己的协议栈可以配合其它的RTOS,但是如果RTOS也用了相同的SVC呢?
我不关心nordic或者TI的协议栈核心代码实现,就算给我源代码我也懒得看,但是我觉得TI用库提供协议栈的方式更直接和通用;nordic这种方式太取巧了,某些时候会给用户带来一些限制。
当然51822还是有一些优势的,至少封装比较小。
至于怎么在nRF51822上开发应用我还没来得及看,没办法和TI的架构比较
阅读(2950) | 评论(0) | 转发(0) |