在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RTT平臺(tái)zephyr_polling軟件包SPI Bluenrg2丟包問(wèn)題排查

冬至子 ? 來(lái)源:paradox ? 作者:paradox ? 2023-10-23 15:41 ? 次閱讀

在對(duì)協(xié)議棧在 Bluenrg2 芯片上采用 SPI 作為 HCI 的數(shù)據(jù)傳輸進(jìn)行測(cè)試的時(shí)候,發(fā)現(xiàn)存在丟包問(wèn)題。當(dāng)進(jìn)行大吞吐連續(xù)傳輸時(shí),可以發(fā)現(xiàn)協(xié)議棧收到的字節(jié)數(shù)少于測(cè)試APP發(fā)送的字節(jié)數(shù)。

首先需要找到丟包的位置,有多個(gè)可能:①在HCI層傳輸上報(bào)給協(xié)議棧上層的過(guò)程丟包;②在HCI層與芯片進(jìn)行SPI通信時(shí)丟包;③在芯片接收和上報(bào)的過(guò)程丟包(按說(shuō)可能性不大)。

使用在每一層計(jì)數(shù)接收到的數(shù)據(jù)的字節(jié)數(shù),進(jìn)行比較的方式確定產(chǎn)生丟包的位置。

1 在HCI層傳輸上報(bào)給協(xié)議棧上層的過(guò)程丟包
在 HCI 層的 SPI 初始化hci_driver_init()處也設(shè)置一個(gè)打印當(dāng)前接收的字節(jié)數(shù)的定時(shí)任務(wù):

HCI_SPI_ACL_recv_count = 0;
k_timer_init(&HCI_SPI_count_work, HCI_SPI_count_timeout, NULL);
k_timer_start(&HCI_SPI_count_work, K_SECONDS(30), K_SECONDS(30));

void HCI_SPI_count_timeout(struct k_timer *timer)
{
printf("HCI SPI ACL recv count timeout: %dn", HCI_SPI_ACL_recv_count);
}
在HCI層的接收函數(shù)hci_driver_init_loop()處,對(duì)ACL數(shù)據(jù)包進(jìn)行判斷和計(jì)數(shù)。

switch(data[0])
{
case HCI_EVENT_PKT:
buf = bt_buf_get_controller_tx_evt();
break;
case HCI_ACLDATA_PKT:
buf = bt_buf_get_controller_tx_acl();
HCI_SPI_ACL_recv_count += ret;
// printk("ACL: ");
// for (int i = 0; i < ret; ++i)
// {
// printk("%02x:",data[i]);
// }
// printk("n");
break;
default:
return;
}

測(cè)試

手機(jī)連接BLE模塊,發(fā)送間隔設(shè)定為1ms,數(shù)據(jù)包大小20字節(jié),測(cè)試得到打印結(jié)果。比較發(fā)現(xiàn),協(xié)議棧上層的計(jì)數(shù)比HCI層接收處的數(shù)據(jù)計(jì)數(shù)更少,在HCI層傳輸上報(bào)給協(xié)議棧上層的過(guò)程有丟包。

檢查HCI層接收數(shù)據(jù)和上報(bào)的代碼,發(fā)現(xiàn)當(dāng)數(shù)據(jù)傳輸量很大,MCU來(lái)不及處理時(shí),協(xié)議棧上層的接收隊(duì)列會(huì)堆積最后爆滿,HCI 層申請(qǐng) buffer 的時(shí)候可能失敗,此時(shí)本次從芯片處接收到的數(shù)據(jù)就會(huì)被丟棄。

解決方案是在開(kāi)始一次 SPI 接收之前,判斷當(dāng)前的緩沖區(qū)是否還有空間,有空間才接收。一般來(lái)說(shuō)(事實(shí)上最后發(fā)現(xiàn)這個(gè)芯片好像并不是這樣的),芯片收到的數(shù)據(jù)如果一直沒(méi)有被HCI層接收,芯片端的緩沖區(qū)滿了之后,芯片會(huì)暫停數(shù)據(jù)傳輸服務(wù)。這樣可以使發(fā)送端的傳輸暫停,等待MCU完成處理后再繼續(xù)傳輸,避免丟包。

if (bt_buf_reserve_size(BT_BUF_ACL_IN) == 0)
{
printk("HCI ACL BUFFER EMPTY rn");
return;
}

int ret = HCI_TL_SPI_Receive(data, len); //ret: bytes num Recv

再次測(cè)試發(fā)現(xiàn),HCI層接收到的字節(jié)數(shù)和協(xié)議棧上層接收的字節(jié)數(shù)一致,但手機(jī)端發(fā)送的字節(jié)數(shù)和協(xié)議棧上層接收的字節(jié)數(shù)還是不一致,丟包還是存在。

2 在芯片接收和上報(bào)的過(guò)程丟包

在 SPI 的接收函數(shù)HCI_TL_SPI_Receive()處也加入一個(gè)計(jì)數(shù)HCI_SPI_ACL_recv_count,計(jì)數(shù)從芯片處接收到的全部數(shù)據(jù),包括包頭等;在HCI層將數(shù)據(jù)包塞入緩沖區(qū)之后,加入一個(gè)計(jì)數(shù)HCI_ACL_buf_recv_count,計(jì)數(shù)buffer緩沖區(qū)內(nèi)的數(shù)據(jù)字節(jié)數(shù)(不包括包頭)。

四個(gè)計(jì)數(shù)分別是:

HCI_SPI_recv_count_timeout: 從芯片處通過(guò)SPI接收到的全部數(shù)據(jù)包(包括包頭)

HCI SPI ACL recv count timeout: HCI層接收到的ACL數(shù)據(jù)包的數(shù)據(jù)(僅數(shù)據(jù),不包括包頭等)

HCI_ACL_buf_recv_count_timeout: HCI層寫入緩沖區(qū)后,緩沖區(qū)內(nèi)的data字段里的數(shù)據(jù)(僅數(shù)據(jù),不包括包頭等)

app_count: 協(xié)議棧上層接收到的數(shù)據(jù)(僅數(shù)據(jù),不包括包頭等)

因?yàn)?a href="http://www.xsypw.cn/tags/藍(lán)牙/" target="_blank">藍(lán)牙啟動(dòng)的過(guò)程中也有一系列數(shù)據(jù)交互,為了確保計(jì)數(shù)的準(zhǔn)確性,加入一個(gè)開(kāi)始計(jì)數(shù)的HCISPIFlag,HCISPIFlag為true時(shí)才開(kāi)始計(jì)數(shù)。當(dāng)HCI層接收到手機(jī)端發(fā)送的99:99:99:99數(shù)據(jù)包(該數(shù)據(jù)包不會(huì)上報(bào)給協(xié)議棧上層)時(shí),HCISPIFlag轉(zhuǎn)為true。

ACL數(shù)據(jù)包的包頭為12字節(jié),例如測(cè)試數(shù)據(jù)包的內(nèi)容:

02:01:281b00:17:00:04:00:520b00:00:01:02:03:04:05:06:07:08:09:00:01:02:03:04:05:06:07:08:09

開(kāi)始計(jì)數(shù)的命令判斷:

bool HCIcountCmdCheck(uint8_t *buf) {
uint8_t cmd[4] = {0x99, 0x99, 0x99, 0x99};
for (int i = 0; i < 4; ++i)
{
if (buf[i + 12] != cmd[i]) {
return false;
}
}
return true;
}
HCI層SPI接收處的計(jì)數(shù):

if(byte_count > 0)
{
/* avoid to read more data than the size of the buffer /
if (byte_count > size)
{
byte_count = size;
}
for(len = 0; len < byte_count; len++)
{
rt_spi_transfer(ble_spi, &char_00, (uint8_t
)&read_char, 1);
buffer[len] = read_char;
}
HCI_SPI_recv_count += len;
// ACL pack received count
if (HCISPIFlag)
{
if (buffer[0] == HCI_ACLDATA_PKT) {
HCI_SPI_ACL_recv_count += (len - 12);
}
}
}

測(cè)試

手機(jī)連接BLE模塊,發(fā)送間隔設(shè)定為1ms,數(shù)據(jù)包大小20字節(jié),測(cè)試得到打印結(jié)果:

[00:26:45.218]收←◆Connected
[00:27:05.152]收←◆HCI_SPI_recv_count_timeout: 660
HCI SPI ACL recv count timeout: 0
HCI_ACL_buf_recv_count_timeout: 0
[00:27:05.302]收←◆app count timeout: 0
[00:27:08.899]收←◆HCI count start
app count start
[00:27:35.134]收←◆HCI_SPI_recv_count_timeout: 302404
HCI SPI ACL recv count timeout: 188580
HCI_ACL_buf_recv_count_timeout: 188580
[00:27:35.284]收←◆app count timeout: 189840
[00:28:05.116]收←◆HCI_SPI_recv_count_timeout: 720932
HCI SPI ACL recv count timeout: 450160
HCI_ACL_buf_recv_count_timeout: 450160
[00:28:05.267]收←◆app count timeout: 451560
[00:28:35.096]收←◆HCI_SPI_recv_count_timeout: 1143556
HCI SPI ACL recv count timeout: 714300
HCI_ACL_buf_recv_count_timeout: 714300
[00:28:35.246]收←◆app count timeout: 715480
[00:29:05.081]收←◆HCI_SPI_recv_count_timeout: 1579780
HCI SPI ACL recv count timeout: 986940
HCI_ACL_buf_recv_count_timeout: 986940
[00:29:05.231]收←◆app count timeout: 988100
[00:29:35.066]收←◆HCI_SPI_recv_count_timeout: 1726692
HCI SPI ACL recv count timeout: 1078760
HCI_ACL_buf_recv_count_timeout: 1078760
[00:29:35.215]收←◆app count timeout: 1078760

手機(jī)APP端:

1.jpg

手機(jī)端發(fā)送 55276個(gè)包,共1105504字節(jié),其中20字節(jié)的測(cè)試數(shù)據(jù)包 55275個(gè),共1105500字節(jié)。

協(xié)議棧上層收到1078760字節(jié)數(shù)據(jù),即53938個(gè)數(shù)據(jù)包; HCI層接收到的 ACL 數(shù)據(jù)包的數(shù)據(jù)字節(jié)數(shù)和 HCI 層寫入緩沖區(qū)的data字段里的數(shù)據(jù)字節(jié)數(shù),與協(xié)議棧上層的一致(最終一致,中間定時(shí)器打印的count數(shù)不一致是因?yàn)榫彌_區(qū)的數(shù)據(jù)還未被取出)。從芯片處通過(guò)SPI接收到的全部數(shù)據(jù)包為1726692字節(jié),其中660字節(jié)為啟動(dòng)階段傳輸。

ACL 數(shù)據(jù)包的包頭為12字節(jié),發(fā)送的命令 ACL 包為16字節(jié),測(cè)試ACL數(shù)據(jù)包為32字節(jié)。則實(shí)際接收到的測(cè)試ACL數(shù)據(jù)包為(1726692 - 660 - 16) / 32 = 53938個(gè),與協(xié)議棧上層的一致。

對(duì)比發(fā)現(xiàn),在芯片接收手機(jī)數(shù)據(jù)和上報(bào)的過(guò)程中發(fā)生了丟包。一般來(lái)說(shuō),芯片收到的數(shù)據(jù)如果一直沒(méi)有被HCI層接收,芯片端的緩沖區(qū)滿了之后,芯片會(huì)阻止發(fā)送端(手機(jī))繼續(xù)發(fā)送數(shù)據(jù)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接收機(jī)
    +關(guān)注

    關(guān)注

    8

    文章

    1182

    瀏覽量

    53516
  • SPI接口
    +關(guān)注

    關(guān)注

    0

    文章

    258

    瀏覽量

    34409
  • BLE技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    5891
  • MCU芯片
    +關(guān)注

    關(guān)注

    3

    文章

    253

    瀏覽量

    11536
  • RTThread
    +關(guān)注

    關(guān)注

    8

    文章

    132

    瀏覽量

    40903
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RTT_Zephyr_Polling BlueNRG2 SPI使用說(shuō)明

    在RT-Thread平臺(tái)下,利用 BlueNRG2 藍(lán)牙芯片運(yùn)行 RTT_Zephyr_Polling 協(xié)議棧。使用 SPI 作為 HCI 傳輸方式。
    的頭像 發(fā)表于 09-21 14:54 ?1318次閱讀
    <b class='flag-5'>RTT_Zephyr_Polling</b> <b class='flag-5'>BlueNRG2</b> <b class='flag-5'>SPI</b>使用說(shuō)明

    RTT平臺(tái)zephyr_polling軟件包SPI Bluenrg2芯片宕機(jī)問(wèn)題與修復(fù)

    項(xiàng)目的代碼測(cè)試完成之后,準(zhǔn)備收尾時(shí),出現(xiàn)了問(wèn)題。清除掉開(kāi)發(fā)過(guò)程中用來(lái)調(diào)試的print打印之后,zephyr_polling 的 HCI 突然不能正常工作了,之前測(cè)試可用的 zephyr_polling 中的各個(gè)例程都不再能運(yùn)行。
    的頭像 發(fā)表于 09-25 17:08 ?1115次閱讀
    <b class='flag-5'>RTT</b><b class='flag-5'>平臺(tái)</b><b class='flag-5'>zephyr_polling</b><b class='flag-5'>軟件包</b><b class='flag-5'>SPI</b> <b class='flag-5'>Bluenrg2</b>芯片宕機(jī)問(wèn)題與修復(fù)

    RTT zephyr_polling軟件包 Bluenrg2藍(lán)牙芯片啟動(dòng)流程

    在用標(biāo)準(zhǔn)的 HCI 指令控制設(shè)備進(jìn)行藍(lán)牙操作之前,需要提前通過(guò) VS Command 對(duì)設(shè)備進(jìn)行配置,只有正確配置好的設(shè)備才能正常使用。
    的頭像 發(fā)表于 09-27 11:19 ?1416次閱讀
    <b class='flag-5'>RTT</b> <b class='flag-5'>zephyr_polling</b><b class='flag-5'>軟件包</b> <b class='flag-5'>Bluenrg2</b>藍(lán)牙芯片啟動(dòng)流程

    如何用Ubuntu qemu跑zephyr_polling的藍(lán)牙?

    進(jìn)入 RT-Thread online packages → IoT - internet of things 目錄即可看到 zephyr_polling軟件包,勾選軟件包
    的頭像 發(fā)表于 09-28 11:24 ?1960次閱讀
    如何用Ubuntu qemu跑<b class='flag-5'>zephyr_polling</b>的藍(lán)牙?

    如何使用RTT Studio配置at軟件包來(lái)連接wifi模塊?

    如何使用RTT Studio配置at軟件包來(lái)連接wifi模塊?
    發(fā)表于 02-16 07:47

    SPI驅(qū)動(dòng)屏幕移植LVGL軟件包具體流程

    _da, send_data, RT_NULL,2);}二、移植lvgl(一)、添加lvgl軟件包首先打開(kāi)rtthread setting,點(diǎn)擊右側(cè)的縮進(jìn),打開(kāi)后,選擇軟件包,再將多媒體
    發(fā)表于 07-08 15:09

    rtt有支持多個(gè)文件壓縮的軟件包

    rtt有支持多個(gè)文件壓縮的軟件包么,比如tar指令,或者有那個(gè)大佬實(shí)現(xiàn)了多文件壓縮的源碼可以分享一下么?
    發(fā)表于 11-15 10:53

    I2C模塊arduinoio Simulink軟件包

    I2C模塊arduinoio Simulink軟件包
    發(fā)表于 01-22 14:06 ?0次下載

    RT-Thread 軟件包介紹

    RT-Thread 軟件包介紹軟件包的目的軟件包在高級(jí)語(yǔ)言中非常常見(jiàn),很多高級(jí)語(yǔ)言都有對(duì)應(yīng)的軟件包平臺(tái),比如 Python 的 PyPi,R
    發(fā)表于 05-21 19:38 ?5563次閱讀

    RT-Thread軟件包定義和使用

    RT-Thread軟件包是運(yùn)行于RT-Thread物聯(lián)網(wǎng)操作系統(tǒng)平臺(tái)上,面向不同應(yīng)用領(lǐng)域的通用軟件組件 。RT-Thread 同時(shí)提供了開(kāi)放的軟件包
    的頭像 發(fā)表于 05-21 11:29 ?1w次閱讀
    RT-Thread<b class='flag-5'>軟件包</b>定義和使用

    STM32F103C8 使用RT-Thread軟件包系統(tǒng)讀取MPU6050

    常見(jiàn)的元件自然有相應(yīng)的軟件包啦,在工程根目錄打開(kāi)ENV工具1.在這個(gè)目錄下可以發(fā)現(xiàn)很多軟件包,我們將MPU6xxx打開(kāi)2.在打開(kāi)RTT的iic支持
    發(fā)表于 12-06 14:36 ?12次下載
    STM32F103C8 使用RT-Thread<b class='flag-5'>軟件包</b>系統(tǒng)讀取MPU6050

    什么是Linux軟件包,如何管理它們

    現(xiàn)代類 Unix 操作系統(tǒng)都提供了一個(gè)集中的軟件包管理機(jī)制,以幫助用戶搜索、安裝和管理軟件。而軟件通常以的形式存儲(chǔ)在倉(cāng)庫(kù)中,對(duì)軟件包的使用
    的頭像 發(fā)表于 02-06 14:59 ?1456次閱讀

    RT-Thread在線軟件包改為本地軟件包的方法

    RT-Thread 的軟件包,使用時(shí)需要手動(dòng)通過(guò) ENV 工具 更新到 本地的 packages 目錄,并且 packages 目錄默認(rèn)不參與 Git 工程管理,軟件包多了,偶爾需要更改軟件包本身的一些代碼,這就造成了
    的頭像 發(fā)表于 08-11 15:02 ?1239次閱讀
    RT-Thread在線<b class='flag-5'>軟件包</b>改為本地<b class='flag-5'>軟件包</b>的方法

    RTT zephyr_polling SPI Bluenrg2數(shù)據(jù)傳輸測(cè)試

    RTT 那邊的 Kconfig 配置完成,項(xiàng)目的基本開(kāi)發(fā)內(nèi)容就完成了。然后再對(duì)協(xié)議棧在 Bluenrg2 芯片上采用 SPI 作為 HCI 的數(shù)據(jù)傳輸進(jìn)行測(cè)試。
    的頭像 發(fā)表于 09-25 16:25 ?908次閱讀
    <b class='flag-5'>RTT</b> <b class='flag-5'>zephyr_polling</b> <b class='flag-5'>SPI</b> <b class='flag-5'>Bluenrg2</b>數(shù)據(jù)傳輸測(cè)試

    RT-Thread平臺(tái) zephyr_polling軟件包 Bluenrg2 藍(lán)牙芯片啟動(dòng)流程

    RTT zephyr_polling軟件包 Bluenrg2 藍(lán)牙芯片啟動(dòng)流程 “開(kāi)源之夏”“藍(lán)牙HOST協(xié)議棧zephyr_polling
    的頭像 發(fā)表于 09-27 18:40 ?920次閱讀
    RT-Thread<b class='flag-5'>平臺(tái)</b> <b class='flag-5'>zephyr_polling</b><b class='flag-5'>軟件包</b> <b class='flag-5'>Bluenrg2</b> 藍(lán)牙芯片啟動(dòng)流程
    主站蜘蛛池模板: 午夜影剧| 亚洲美女精品| 成人免费久久精品国产片久久影院| 日日碰狠狠添天天爽五月婷| 狠狠丁香激情久久综合| 三级毛片在线| 欧美色视频日本片免费高清| 久久久精品久久久久久久久久久| 国内黄色一级片| 久久综合狠狠综合狠狠| 日本写真高清视频免费网站网| 伊人久久影院大香线蕉| 香蕉视频vip| 永久黄网站色视频免费观看| 午夜色片| 欧美生活性色| 成人欧美一区二区三区黑人免费 | susu成人影院| 被公侵犯肉体中文字幕一区二区| 性做久久久久久久免费观看| 国产逼逼视频| 理论片久久| 免费看黄在线| 视频免费播放| 国卡一卡二卡三免费网站| 泰国一级毛片aaa下面毛多| 免费黄色福利| 一夜七次郎久久综合伊人| 伊在线视频| 国内精品网站| 日本不卡在线视频高清免费 | 亚洲精品午夜久久aaa级久久久| 1024成人| 国产伦精品一区二区免费| 亚洲最新| 美女视频一区二区| 色五夜婷婷| 欧美午夜性| 在线播放91灌醉迷j高跟美女| 操人网站| 一级待一黄aaa大片在线还看|