色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

Pico W基于C/C++ SDK適配RT-Thread Wi-Fi經(jīng)驗(yàn)總結(jié)

冬至子 ? 來源:螺絲松掉的人 ? 作者:螺絲松掉的人 ? 2023-11-28 17:15 ? 次閱讀

前言:

Pico W 作為 Raspberry Pi Pico 的衍生版本,主要增加了無線通信的功能,通過搭載 CYW43439 無線芯片,支持 2.4 GHz Wi-Fi 4 及藍(lán)牙5.0 ,其余和 Raspberry Pi Pico 基本相同,外部引腳也相互兼容。

也可以參考我之前文章中介紹的使用 Clion 搭建開發(fā)調(diào)試下載環(huán)境,同樣適用。這里需要注意的一點(diǎn)是,當(dāng)你首次燒錄使板載 LED 閃爍的程序時(shí),開發(fā)板可能沒有相應(yīng)的現(xiàn)象,這可能不是你下載失敗了,也不是你的開發(fā)板是壞的,而是 Pico W 的板載 LED 由無線模塊控制

準(zhǔn)備工作

開發(fā)環(huán)境搭建完成后,接下來就可以根據(jù)樹莓派官方的 SDK 和 Example 調(diào)一調(diào)程序,逐漸梳理清楚邏輯和各模塊之間的依賴關(guān)系。例如先運(yùn)行一個(gè)最簡(jiǎn)單的 Wi-Fi scan 的示例程序,其主要邏輯是先 cyw43_arch_init() 初始化模塊,再通過 cyw43_arch_enable_sta_mode() 使能為 STA 模式,最后使用cyw43_wifi_scan() 開始掃描并注冊(cè)掃描完成回調(diào)函數(shù)打印掃描結(jié)果,整體的邏輯和 API 還是很簡(jiǎn)潔明了的。

開始開發(fā)

主要有以下三種類型:poll , threadsafe_background, freertos 。poll 是需要用戶定期調(diào)用的,并且不保證線程安全性;threadsafe_background 和 freertos 能夠保證線程安全性,threadsafe_background 不使用 RTOS,通過低優(yōu)先級(jí)的 ISR 實(shí)現(xiàn)調(diào)度同步,freertos 是通過專門的線程處理調(diào)動(dòng)同步。

一開始我選擇的是基于 threadsafe_background 進(jìn)行開發(fā),通過參照以上 Cmake 關(guān)系圖很快就成功在 RT-Thread 的 Bsp 中復(fù)現(xiàn)了 Wi-Fi scan 示例程序。但是開發(fā)后續(xù)需要使用 lwip 的功能時(shí),與 RT-Thread 就產(chǎn)生了很多沖突。

想要更好的適配 RT-Thread 還是得按照 RTOS 的來,于是開始復(fù)現(xiàn)官方提供的基于 FreeRTOS 的,首先想到的是使用 RT-Thread 的 FreeRTOS 兼容層軟件包,在 menuconfig 中使能即可:

1.jpg

引入兼容層后大部分報(bào)錯(cuò)消失了,但報(bào)錯(cuò)沒有 portCHECK_IF_IN_ISR 的相關(guān)實(shí)現(xiàn),在 FreeRTOS 的源碼中查找發(fā)現(xiàn)其為 RP2040 特有的實(shí)現(xiàn)。其是用于判斷上下文環(huán)境是否處于中斷中,改為 RT-Thread 中的檢測(cè)中斷 nest 是否大于 0 即可。

成功編譯下載程序后,卻因?yàn)?a href="http://m.1cnz.cn/tags/定時(shí)器/" target="_blank">定時(shí)器進(jìn)入了 hardfault ,檢查發(fā)現(xiàn) FreeRTOS 兼容層中的 portMAX_DEALY 對(duì)接錯(cuò)了,不是 RT_TICK_MAX ,應(yīng)該為 RT_TICK_MAX / 2 - 1(韋東山老師在rtt開發(fā)者大會(huì)上專門講解過 RTT 優(yōu)雅的定時(shí)器算法,感興趣可以看看)這個(gè)問題目前已經(jīng)修復(fù)了。

之后程序還是進(jìn)入 hardfault ,一直 debug 對(duì)比代碼沒有發(fā)現(xiàn)問題,再次分析對(duì)比 FreeRTOS 和 RT-Thread 之間的差異,兩者的優(yōu)先級(jí)等級(jí)和數(shù)值的關(guān)系是相反的,檢查發(fā)現(xiàn) async_context_task 線程的優(yōu)先級(jí)為 tskIDLE_PRIORITY + 4 在 FreeRTOS 中優(yōu)先級(jí)比空閑線程高4,但在 RT-Thread 中因?yàn)閮?yōu)先級(jí)太低,得不到調(diào)度,造成死鎖問題。解決辦法是將其線程優(yōu)先級(jí)提高。

移植 RT-Thread

以上的示例程序跑通以后,就開始將 wifi freertos 的相關(guān)的文件移植為 RT-Thread 。主要包含以下內(nèi)容:

替換頭文件:

用 RT-Thread 的頭文件替換 FreeRTOS 的頭文件。

修改任務(wù)創(chuàng)建和管理:

使用 RT-Thread 的任務(wù)創(chuàng)建和管理 API 替代 FreeRTOS 的任務(wù) API。

注意 RT-Thread 的任務(wù)入口函數(shù)參數(shù)和返回值的差異。

修改互斥鎖:

替換 xSemaphoreCreateRecursiveMutex 為 RT-Thread 提供的互斥鎖創(chuàng)建 API。

替換 xSemaphoreTakeRecursive 和 xSemaphoreGiveRecursive 為 RT-Thread 互斥鎖的 API。

替換定時(shí)器:

使用 RT-Thread 的軟定時(shí)器或者實(shí)時(shí)時(shí)鐘服務(wù)替代 FreeRTOS 定時(shí)器。

任務(wù)通知:

替換 FreeRTOS 的任務(wù)通知 API 為 RT-Thread 的事件和信號(hào)量等。

任務(wù)掛起和喚醒:

替換 FreeRTOS 的 vTaskSuspend 和 vTaskResume 為 RT-Thread 的任務(wù)掛起和喚醒 API
主要涉及 async_context_rtthread,cyw43_arch,cyw43_arch_rtthread,lwip_rtthread這些文件,基礎(chǔ)的移植完成后,就可以開始將其對(duì)接到 RT-Thread 的 Wi-Fi 設(shè)備驅(qū)動(dòng)框架了,主要參考 rw007 和 cyw43012-RTT 的對(duì)接。需要使能 RT-Thread 的 lwip 和 SAL 等組件。
需要注意的一點(diǎn)是 RT-Thread 的 lwip 組件使能后,已經(jīng)包含了 lwip 的初始化,cyw43_arch_init() 中的 lwip 初始化相關(guān)注釋即可,否則重復(fù)初始化會(huì)因?yàn)橥瓿闪繜o法獲取造成阻塞。

#if CYW43_LWIP
// ok &= lwip_rtthread_init(context);
#endif
// 重復(fù)初始化信號(hào)量無法獲取造成阻塞
bool lwip_rtthread_init(async_context_t *context) {
RT_ASSERT(!lwip_context);
lwip_context = context;
static bool done_lwip_init;
if (!done_lwip_init) {
done_lwip_init = true;
rt_sem_t init_sem = rt_sem_create("lwip_init_sem", 0, RT_IPC_FLAG_PRIO);
tcpip_task_blocker = rt_sem_create("tcpip_task_blocker", 0, RT_IPC_FLAG_PRIO);
tcpip_init(tcpip_init_done, init_sem);
// 阻塞在信號(hào)量獲取
rt_sem_take(init_sem, RT_TICK_MAX / 2 - 1);
rt_sem_delete(init_sem);
} else {
rt_sem_release(tcpip_task_blocker);
}
return true;
}

運(yùn)行過程中可能會(huì)報(bào)錯(cuò)提示 lwip 線程棧空間不足,在 menuconfig 中適當(dāng)改大即可

1.jpg

對(duì)接完成后測(cè)試功能,使能為 STA 模式,日志中顯示 mac 地址

1.jpg

掃描附近ap

1.jpg

連接ap并成功ping通

1.jpg

測(cè)試ap功能,使能為AP模式,設(shè)置名稱及pwd,可以使用手機(jī)成功連接。

注意事項(xiàng)

使用pico w的無線模塊需要使用一些相關(guān)的宏定義,如無線模塊的引腳定義等,其定義在 picow.h 中。但程序默認(rèn)包含的是 pico.h 。可以通過定義宏 PICO_CONFIG_HEADER=boards/pico_w.h 進(jìn)行切換。

吞吐量還未進(jìn)行測(cè)試。

目前基于 C/C++ SDK 的開發(fā)案例較少,推薦直接閱讀官方文檔。

在對(duì)接設(shè)備驅(qū)動(dòng)框架 wifi_join 方法時(shí)苦惱于 ap 的 channel 和 bssid 沒有正常傳遞,查看源碼發(fā)現(xiàn)使能 RT_WLAN_JOIN_SCAN_BY_MGNT
這個(gè)宏可以先掃描ap,并傳遞包含 channel 和 bssid 的 info,但要將以下改為rt_memcpy

1.jpg

個(gè)人理解,沒有找到其他的說明和用例。(不過最后發(fā)現(xiàn),連接ap沒有 channel 和 bssid 也行,直接設(shè)置為 RT_NULL )

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

    關(guān)注

    58

    文章

    4585

    瀏覽量

    143631
  • LED控制
    +關(guān)注

    關(guān)注

    0

    文章

    39

    瀏覽量

    16947
  • Wi-Fi技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    58

    瀏覽量

    8412
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1293

    瀏覽量

    40228
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    BL808 RT-Thread Wi-Fi 驅(qū)動(dòng)適配

    BL808 WiFi 屬于 SOC 單芯片型無線 MCU,片上集成 WiFi 功能,移植 RT-Thread 過程中,需要使用 RT-Thread wlan 框架。 RT-Thread wlan
    的頭像 發(fā)表于 12-02 11:06 ?1503次閱讀
    BL808 <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Wi-Fi</b> 驅(qū)動(dòng)<b class='flag-5'>適配</b>

    RT-ThreadC語言編碼規(guī)范

    這是一份 RT-Thread 開發(fā)人員的開發(fā)指引。RT-Thread 做為一份開源軟件,它需要由不同的人采用合作的方式完成,這份文檔是開發(fā)人員的一個(gè)指引。RT-Thread 的開發(fā)人員請(qǐng)遵守這樣
    的頭像 發(fā)表于 02-21 16:50 ?2498次閱讀

    BL808 RT-Thread Wi-Fi驅(qū)動(dòng)適配

    BL808 WiFi 屬于 SOC 單芯片型無線 MCU,片上集成 WiFi 功能,移植 RT-Thread 過程中,需要使用 RT-Thread wlan 框架。
    的頭像 發(fā)表于 12-04 11:38 ?908次閱讀

    【每日精選】開源鴻蒙系統(tǒng)DAYU200教程及Tina Wi-Fi模組移植

    大家好,今天推薦一些社區(qū)好帖,歡迎大家留言也推薦更多好帖子,推薦會(huì)有獎(jiǎng)勵(lì)哈!今日推薦:【網(wǎng)絡(luò)專題1】Tina Wi-Fi模組移植_實(shí)踐篇【網(wǎng)絡(luò)專題1】Tina Wi-Fi模組移植_理論篇 [經(jīng)驗(yàn)
    發(fā)表于 03-15 15:32

    RT-Thread實(shí)戰(zhàn)筆記資料匯總

    Cortex-M/R/A, MIPS, X86, Xtensa, C-Sky, RISC-V,幾乎支持市場(chǎng)上所有主流的 MCU 和 Wi-Fi 芯片。
    發(fā)表于 03-25 15:54

    【BPI-Pico-RP2040 開發(fā)板】+Pico運(yùn)行RT-Thread

    Type-C插座NorFlash存儲(chǔ)IC開發(fā)板腳位以及功能圖:拿到手焊接后的圖:使用過程本次在RT-Studio上進(jìn)行開發(fā),打開RT-Thread Studio,打開SDK Mana
    發(fā)表于 03-17 23:01

    嵌入式 | 如何在搭載了RT-Thread系統(tǒng)的STM32平臺(tái)上使用C++?

    本文描述了如何使用在搭載了 RT-Thread 系統(tǒng)的 STM32 平臺(tái)上使用 C++,包括 C++ 的配置和應(yīng)用等,并給出了在STM32F411 NUCLEO開發(fā)板上驗(yàn)證的代碼示例。
    的頭像 發(fā)表于 06-20 14:04 ?4498次閱讀

    如何使用在搭載了RT-Thread系統(tǒng)的STM32平臺(tái)上使用C++

    RT-Thread Components ---> C++ features ---> Support C++ features,如圖所示:
    的頭像 發(fā)表于 12-08 10:27 ?3842次閱讀
    如何使用在搭載了<b class='flag-5'>RT-Thread</b>系統(tǒng)的STM32平臺(tái)上使用<b class='flag-5'>C++</b>

    基于STM32F4和RT-Thread通用BootLoader使用經(jīng)驗(yàn)

    基于STM32F4、RT-Thread通用BootLoader使用經(jīng)驗(yàn)
    的頭像 發(fā)表于 02-27 17:23 ?6325次閱讀
    基于STM32F4和<b class='flag-5'>RT-Thread</b>通用BootLoader使用<b class='flag-5'>經(jīng)驗(yàn)</b>

    如何在搭載了RT-Thread系統(tǒng)的STM32平臺(tái)上使用C++

    本文描述了如何使用在搭載了 RT-Thread 系統(tǒng)的 STM32 平臺(tái)上使用 C++,包括 C++ 的配置和應(yīng)用等,并給出了在STM32F411 NUCLEO開發(fā)板上驗(yàn)證的代碼示例。
    發(fā)表于 02-10 10:43 ?3次下載
    如何在搭載了<b class='flag-5'>RT-Thread</b>系統(tǒng)的STM32平臺(tái)上使用<b class='flag-5'>C++</b>?

    2022 RT-Thread全球技術(shù)大會(huì):螢石EZIOT SDK對(duì)RT-Thread的支持

    2022 RT-Thread全球技術(shù)大會(huì):RT-Thread在攝像頭及IoT設(shè)備上的實(shí)踐經(jīng)驗(yàn)分享
    的頭像 發(fā)表于 05-27 11:08 ?1324次閱讀
    2022 <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):螢石EZIOT <b class='flag-5'>SDK</b>對(duì)<b class='flag-5'>RT-Thread</b>的支持

    RT-Thread全球技術(shù)大會(huì):螢石EZloT SDK對(duì)RT-Thread的支持以及多芯片平臺(tái)管理策略

    RT-Thread全球技術(shù)大會(huì):螢石EZloT SDK對(duì)RT-Thread的支持以及多芯片平臺(tái)管理策略 ? ? ? ? ? 審核編輯:彭靜 ?
    的頭像 發(fā)表于 05-27 11:55 ?1736次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):螢石EZloT <b class='flag-5'>SDK</b>對(duì)<b class='flag-5'>RT-Thread</b>的支持以及多芯片平臺(tái)管理策略

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread文檔_I2C 總線設(shè)備

    RT-Thread文檔_I2C 總線設(shè)備
    發(fā)表于 02-22 18:35 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_I2<b class='flag-5'>C</b> 總線設(shè)備

    經(jīng)驗(yàn)總結(jié)】一位近10年的嵌入式開發(fā)老手,到底是如何快速學(xué)習(xí)和使用RT-Thread的?

    經(jīng)驗(yàn)總結(jié)】一位近10年的嵌入式開發(fā)老手,到底是如何快速學(xué)習(xí)和使用RT-Thread的?
    的頭像 發(fā)表于 05-16 15:33 ?1100次閱讀
    【<b class='flag-5'>經(jīng)驗(yàn)總結(jié)</b>】一位近10年的嵌入式開發(fā)老手,到底是如何快速學(xué)習(xí)和使用<b class='flag-5'>RT-Thread</b>的?
    主站蜘蛛池模板: 午夜片神马影院福利| 玉林天天论坛| 日美欧韩一区二去三区| 秋霞电影网午夜鲁丝片| 日本伦理片 中文字幕| 双性大乳浪受噗呲噗呲h总| 午夜办公室在线观看高清电影| 色哟哟tv| 亚洲精品青青草原avav久久qv| 野花高清在线观看免费3中文| 在线观看永久免费网站| 97免费视频在线| 成人小视频在线观看| 国产精品人妻无码99999| 精品国产成a人在线观看| 旧里番6080在线观看| 翘臀少妇被扒开屁股日出水爆乳| 色尼姑久久超碰在线| 亚洲精品成人a| 在线观看国产亚洲| av老司机色爱区综合| 国产成A人片在线观看| 绞尽奶汁by菊花开| 伦理电影2499伦理片| 亚洲日韩国产精品乱-久| 无遮挡h肉3d动漫在线观看| 亚洲精品国产自在在线观看| 伊人久久综合网站| ebc5恐怖5a26房间| 色欲AV无码乱码精品国产| 无码专区无码专区视频网网址| 久久九九日本韩国精品| 日韩男明星| 最近中文字幕2019免费版日本| 国产成人综合在线视频| 免费国产精品视频| 亚洲qvod图片区电影| 超碰在线vip| 伦理片飘花手机在线| 亚洲国产精品无码AV久久久| 草莓视频在线看免费高清观看|