SYD8801 API解析【ble_sched_execute】【BLE_SendData】
2017-07-27 09:40
141 查看
SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。[b]具体可咨询:http://www.syd-tek.com/[/b]
ble_sched_execute函数
该函数把要写进flash的数据写到falsh中,因为写flash的操作比较耗时,如果把比较耗时的工作放到协议栈中进行的话这些操作将会阻塞蓝牙协议栈的正常运行,造成蓝牙工作异常。所以SYD8801的协议栈在要写数据到flash的时候只是把数据放到内存中,然后在主循环中调用ble_sched_execute把放在内存的数据写到flash中,这样错开了比较耗时的flash操作和要求快速响应的协议栈操作。
另外注意:
操作内部3Kfalsh的API是ReadProfileData和WriteProfileData,这两个函数的最终操作依旧是在ble_sched_execute函数中进行的,所以不会阻塞协议栈,可以在中断函数中调用。
操作内部24Kfalsh的API是ble_flash_erase、ble_flash_read和ble_flash_write,这三个函数直接操作falsh并没有在ble_sched_execute函数中进行的,所以这三个函数会阻塞协议栈的,不能在任何中断服务函数中调用。
相关的内部3K和24Kflash的操作请看:http://blog.csdn.net/chengdong1314/article/details/60957122
BLE_SendData函数
BLE_SendData函数是蓝牙发送函数,这里调用GATTDataSend协议栈函数来做具体的发送操作,GATTDataSend函数API解析如下:
uint8_t GATTDataSend(uint8_t type, struct gap_att_report* p_report, uint8_t len, uint8_t *p_data);
Transmit packet.发送数据包函数,既可以通过notify形式发送,也可以通过INDICATION形式发送
Parameters
Returns 1 : setup success. 0 : invalid pointer supplied. 其中gap_att_report结构体定义如下: struct gap_att_report {
uint16_t primary; //要发送的蓝牙通道的主要服务的UUID
uint16_t uuid; //要发送的蓝牙通道的特性的UUID
uint16_t hdl; //要发送的蓝牙通道的特性的VAL handle
uint16_t config; //发送的时候没用
uint16_t value; //发送数据的形式 BLE_GATT_NOTIFICATION:通知形式发送数据;BLE_GATT_INDICATION:指示形式发送数据
}; 这里的hdl是特性下面的val_hdl的意思,如果在工具中的定义:
协议栈底层做有了数据缓冲区,当在上一个数据包没有发送完成的时候又调用了GATTDataSend函数,那么根据蓝牙规范将会使用更加快速的more data数据传输方式。所以只要GATTDataSend函数没有返回0,那么应用层就可以再次调用该函数进行数据的填充,这样速度更加的快!
比如这里有一个要发送的很大的数据块,数据存放在Send_char_buf数组中,可以通过下面的方式把这个超大的数组发送出去:
void synch_data(void){
if(synch_history_data==1){
if(send_section_cur_num<=send_section_num)
{
uint8_t send_buffer[20]={0};
uint8_t i=0,num=send_section_num-send_section_cur_num+1;
for(i=0;i<num;i++){
memcpy(send_buffer,Send_char_buf+send_section_cur_num*20, 20);
if(send_section_cur_num>=send_section_num)
{
if(BLE_SendData(send_buffer,((Send_char_buf[1]+3)%20))){
send_section_cur_num=0;
send_section_num=0;
synch_history_data=0;
}
else break;
}
else
{
if(BLE_SendData(send_buffer,20)) send_section_cur_num++;
else break;
}
}
}else synch_history_data=0;
}
}
这里的BLE_SendDa函数源代码如下:
uint8_t BLE_SendData(uint8_t *buf, uint8_t len)
{
if(start_tx == 1)
{
struct gap_att_report report;
if(wechat_tx)
{
report.primary = BLE_SERVICE_UUID_WECHAT;
report.uuid = BLE_SERVICE_UUID_WECHAT_INDICATE;
report.hdl = BLE_HANDLE;
report.value = BLE_GATT_INDICATION;
if(len > 20) len = 20;
return GATTDataSend(BLE_GATT_INDICATION, &report, len, buf);
}
else
{
report.primary = BLE_SERVICE_UUID_UART;
report.uuid = BLE_SERVICE_UUID_UART_NOTIFICATION;
report.hdl = 0x0001F;
report.value = BLE_GATT_NOTIFICATION;
return GATTDataSend(BLE_GATT_NOTIFICATION, &report, len, buf);
}
}
return 0;
}
注意:上面的办法是在不改蓝牙连接参数的情况下提高SYD8801发送数据到手机APP的速度,如果要更加彻底的提速就要修改蓝牙连接参数。提高蓝牙连接参数的方式如下:http://blog.csdn.net/chengdong1314/article/details/68941988
ble_sched_execute函数
该函数把要写进flash的数据写到falsh中,因为写flash的操作比较耗时,如果把比较耗时的工作放到协议栈中进行的话这些操作将会阻塞蓝牙协议栈的正常运行,造成蓝牙工作异常。所以SYD8801的协议栈在要写数据到flash的时候只是把数据放到内存中,然后在主循环中调用ble_sched_execute把放在内存的数据写到flash中,这样错开了比较耗时的flash操作和要求快速响应的协议栈操作。
另外注意:
操作内部3Kfalsh的API是ReadProfileData和WriteProfileData,这两个函数的最终操作依旧是在ble_sched_execute函数中进行的,所以不会阻塞协议栈,可以在中断函数中调用。
操作内部24Kfalsh的API是ble_flash_erase、ble_flash_read和ble_flash_write,这三个函数直接操作falsh并没有在ble_sched_execute函数中进行的,所以这三个函数会阻塞协议栈的,不能在任何中断服务函数中调用。
相关的内部3K和24Kflash的操作请看:http://blog.csdn.net/chengdong1314/article/details/60957122
BLE_SendData函数
BLE_SendData函数是蓝牙发送函数,这里调用GATTDataSend协议栈函数来做具体的发送操作,GATTDataSend函数API解析如下:
uint8_t GATTDataSend(uint8_t type, struct gap_att_report* p_report, uint8_t len, uint8_t *p_data);
Transmit packet.发送数据包函数,既可以通过notify形式发送,也可以通过INDICATION形式发送
Parameters
[in] | type | 1 : BLE_GATT_NOTIFICATION 通知形式发送数据 |
2 : BLE_GATT_INDICATION 指示形式发送数据 | ||
[in] | p_report | Pointer to report structure. 配置发送的gap_att_report结构体 |
[in] | len | Data length for p_data. 要发送的数据长度 |
[in] | p_data | Raw data to be transmit. 要发送的数据的指针 |
uint16_t primary; //要发送的蓝牙通道的主要服务的UUID
uint16_t uuid; //要发送的蓝牙通道的特性的UUID
uint16_t hdl; //要发送的蓝牙通道的特性的VAL handle
uint16_t config; //发送的时候没用
uint16_t value; //发送数据的形式 BLE_GATT_NOTIFICATION:通知形式发送数据;BLE_GATT_INDICATION:指示形式发送数据
}; 这里的hdl是特性下面的val_hdl的意思,如果在工具中的定义:
协议栈底层做有了数据缓冲区,当在上一个数据包没有发送完成的时候又调用了GATTDataSend函数,那么根据蓝牙规范将会使用更加快速的more data数据传输方式。所以只要GATTDataSend函数没有返回0,那么应用层就可以再次调用该函数进行数据的填充,这样速度更加的快!
比如这里有一个要发送的很大的数据块,数据存放在Send_char_buf数组中,可以通过下面的方式把这个超大的数组发送出去:
void synch_data(void){
if(synch_history_data==1){
if(send_section_cur_num<=send_section_num)
{
uint8_t send_buffer[20]={0};
uint8_t i=0,num=send_section_num-send_section_cur_num+1;
for(i=0;i<num;i++){
memcpy(send_buffer,Send_char_buf+send_section_cur_num*20, 20);
if(send_section_cur_num>=send_section_num)
{
if(BLE_SendData(send_buffer,((Send_char_buf[1]+3)%20))){
send_section_cur_num=0;
send_section_num=0;
synch_history_data=0;
}
else break;
}
else
{
if(BLE_SendData(send_buffer,20)) send_section_cur_num++;
else break;
}
}
}else synch_history_data=0;
}
}
这里的BLE_SendDa函数源代码如下:
uint8_t BLE_SendData(uint8_t *buf, uint8_t len)
{
if(start_tx == 1)
{
struct gap_att_report report;
if(wechat_tx)
{
report.primary = BLE_SERVICE_UUID_WECHAT;
report.uuid = BLE_SERVICE_UUID_WECHAT_INDICATE;
report.hdl = BLE_HANDLE;
report.value = BLE_GATT_INDICATION;
if(len > 20) len = 20;
return GATTDataSend(BLE_GATT_INDICATION, &report, len, buf);
}
else
{
report.primary = BLE_SERVICE_UUID_UART;
report.uuid = BLE_SERVICE_UUID_UART_NOTIFICATION;
report.hdl = 0x0001F;
report.value = BLE_GATT_NOTIFICATION;
return GATTDataSend(BLE_GATT_NOTIFICATION, &report, len, buf);
}
}
return 0;
}
注意:上面的办法是在不改蓝牙连接参数的情况下提高SYD8801发送数据到手机APP的速度,如果要更加彻底的提速就要修改蓝牙连接参数。提高蓝牙连接参数的方式如下:http://blog.csdn.net/chengdong1314/article/details/68941988
相关文章推荐
- SYD8801代码解析【BLE_SendData函数gap_att_report结构体设置】【蓝牙广播的实现】【协议栈回调事件】【自动睡眠】【使用内部晶振】【蓝牙状态机的说明】【断线时重新配置IO口】
- Send Raw Data to a Printer by Using the Win32 API
- org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; nested exc
- Spring data redis配置各个配置的解析
- 利用百度Geocoding API实现逆地址解析
- [WebKit]WebKit2 API解析
- View and Data API 现在支持IE11了
- javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
- 短信发送API(SendSms)---PHP
- 如何利用UCenter提供的uc_pm_send发站内短信以及UC_API的解决方法
- Platform Invoke and Marshaling Data: [2/3] Calling the Windows CE API
- jQuery中数据缓存$.data的用法及源码完全解析
- HDFS的create函数解析及如何选择存储Block的DataNode
- 深度解析云智慧监控宝新版API监控
- iOS5系统API和5个开源库的JSON解析速度测试
- Zookeeper API JAVA 解析
- 【BLE】CC2541之解析simpleBLECentralEventCB
- 在android用Google Geocoding API服务解析地址(关键词:android/GPS/Geocoding API/getLocationFrom()返回null)
- [转载]EXT核心API详解Ext.data(十二)-GroupingStore/JsonStore/SimpleStore javascript