日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式大雜燴
[導(dǎo)讀]關(guān)注「Linux大陸」,星標(biāo)公眾號,一起進步!來源:CSDN1.前言玩過Linux的朋友,是不是對Linux無所不能的串口Shell命令控制臺羨慕不已,要是自己做的STM32F系列低檔次的MCU也有這種控制交互能力,會給調(diào)試/維護和配置省下多少麻煩事呀,比如啟動/關(guān)閉調(diào)試或自檢模...

關(guān)注「Linux大陸」,星標(biāo)公眾號,一起進步!

來源:CSDN

1. 前言

玩過Linux的朋友, 是不是對Linux無所不能的串口Shell命令控制臺羨慕不已, 要是自己做的STM32F系列低檔次的MCU也有這種控制交互能力, 會給調(diào)試/維護和配置省下多少麻煩事呀, 比如啟動/關(guān)閉調(diào)試或自檢模式, 打印調(diào)試信息, 配置系統(tǒng)參數(shù), 傳輸文件等等, 也有相當(dāng)多的朋友憑借自己出色的編程能力可以實現(xiàn)這些功能, 這里提出我的這個解決方案, 以作交流.

本平臺(xc_shell)具備以下性能特點:

  1. 大量主要代碼, 和具體硬件無關(guān), 移植性強,代碼文件少.

  2. 只有在處理用戶的輸入命令時, 才占用CPU資源, 且代碼可裁剪到1KB SRAM和4KB Flash;

  3. 用戶可以非常靈活的添加按模板編寫的命令腳本文件, 自定義擴張能力強.

  4. 支持操作系統(tǒng)和非操作系統(tǒng)兩種場景應(yīng)用.

  5. 支持Ymodem文件傳輸協(xié)議

  6. 支持將Flash的扇區(qū)開辟為參數(shù)區(qū), 可實現(xiàn)本地/遠程升級。

  7. 實用Led燈信號管理, 可將65535虛擬信號燈選擇輸出到1個實體LED燈上, 調(diào)試時序和狀態(tài)非常有用

  8. 擁有基礎(chǔ)的LED管理, 調(diào)試模式設(shè)置, 命令幫助指令, 復(fù)位指令等基礎(chǔ)功能

功能越多設(shè)計會越復(fù)雜, 為了解釋清楚代碼, 先向大家解釋一下以上功能的基礎(chǔ)實現(xiàn)原理, 并提供一個最小的的源碼工程。

2. xc_shell平臺介紹

2.1 如何實現(xiàn)硬件無關(guān)

類比Linux會發(fā)現(xiàn), 設(shè)備的硬件接口往往會被虛擬成一個文件(驅(qū)動), 而Linux內(nèi)核完全與硬件系統(tǒng)無任何字節(jié)關(guān)聯(lián), 不同平臺驅(qū)動不同而已, 故而本xc_shell的串口驅(qū)動也采用了相似的思路:

1) 串口驅(qū)動用一個結(jié)構(gòu)體描述, 這樣只需在xc_shell.c中用指針指向這個TTYx_HANDLE結(jié)構(gòu)體對象就可以將串口(tty)硬件與內(nèi)核聯(lián)系在一起, 聰明的朋友可能會想到, 假如我將帶網(wǎng)絡(luò)的開發(fā)板按此結(jié)構(gòu)體,虛擬一個TTY對象, 豈不是就可以實現(xiàn)一個網(wǎng)絡(luò)遠程控制臺了! ?這點確實是可以的!

2) 當(dāng)然諸如多TTY串口實現(xiàn)接口互換等, 都是一個指針和step2中的注入回調(diào)處理交換的問題。

3)用戶在使用api_TxdFrame或api_TxdByte時”bsp_ttyX.c“,會驅(qū)動具體MCU的串口將數(shù)據(jù)發(fā)送出去, 收到一幀數(shù)據(jù)后,若用戶設(shè)置了inj_RcvFrame回調(diào)處理方法,則會在中斷中執(zhí)行用戶的回調(diào)處理。

/*---------------------*?
*?????指正函數(shù)定義
*----------------------*/

typedef?void????(*pvFunDummy)(void);
?
//輸入整行,輸出邏輯
typedef?void????(*pvFunVoid)?(void);
typedef?void????(*pvFunBool)?(bool?????bVal);
typedef?void????(*pvFunChar)?(uint8_t??cVal);
typedef?void????(*pvFunShort)(uint16_t?sVal);
typedef?void????(*pvFunWord)?(uint32_t?wVal);
?
//輸入整行,輸出邏輯
typedef?bool????(*pbFunVoid)?(void);
typedef?bool????(*pbFunBool)?(bool?????bVal);
typedef?bool????(*pbFunChar)?(uint8_t??cVal);
typedef?bool????(*pbFunShort)(uint16_t?sVal);
typedef?bool????(*pbFunWord)?(uint32_t?wVal);
?
//輸入整形指針,輸出邏輯
typedef?bool????(*pbFun_pVoid)?(void?*?pVoid);
typedef?bool????(*pbFun_pChar)?(uint8_t??*?pStr);
typedef?bool????(*pbFun_pShort)(uint16_t?*?pShor);
typedef?bool????(*pbFun_pWord)?(uint32_t?*?pWord);
?
//輸入數(shù)據(jù)幀,輸出邏輯
typedef?bool????(*pbFun_Buffx)(void?*?pcBuff,?uint16_t?len?);
typedef?bool????(*pbFun_Bytex)(uint8_t?*?pcByte,?uint16_t?len?);
/*---------------------*?
*????TTYx?句柄結(jié)構(gòu)
*----------------------*/

typedef?struct?TTYx_HANDLE_STRUCT?
{

????const?char??*?const?name;???????//驅(qū)動器名
????const?uint16_t??????rxSize;?????//接收大小
????const?uint16_t??????txSize;?????//發(fā)送大小
????
????//------------------------------------------------------
????//step1:?用戶可用API
????const?pvFunWord?????init;???????????//初始化.
????const?pbFun_Bytex???api_TxdFrame;???//發(fā)送數(shù)據(jù)幀.?(發(fā)送幀)
????const?pbFunChar?????api_TxdByte;????//發(fā)送數(shù)據(jù)字節(jié)
????
????//------------------------------------------------------
????//step2:?注入回調(diào)函數(shù)
????pbFun_Bytex?????????inj_RcvFrame;???//(ISR)接收數(shù)據(jù)幀.?(接收幀)
????pvFunDummy??????????inj_TxdReady;???//(ISR)發(fā)送完畢回調(diào)
????
????//------------------------------------------------------
????//step3:?接收回調(diào)函數(shù)
????struct?TTYx_HANDLE_STRUCT?*?pvNext;?//連接到下一個指令?
}TTYx_HANDLE;
  1. 可注入的命令腳本(CLI)實現(xiàn)
命令CLI也是一個結(jié)構(gòu)體對象:

/*---------------------*?
*???????CLI指令
*----------------------*/

typedef?struct
{

?const?char?*?const??pcCmdStr;?????//指令字符串(只能為小寫字母)
?const?char?*?const??pcHelpStr;?????//指令描述,必須以:"\r\n結(jié)束".?比如:"help:?Returns?a?list\r\n".
?const?pFunHook??????pxCmdHook;?????//指向回調(diào)函數(shù)的指針,處理成功返回真否者返回0;
?uint8_t?????????????ucExpParam;?????//指令期望的參數(shù)個數(shù)
?const?MEDIA_HANDLE?*phStorage;??????//指向存儲介質(zhì),沒有的話填充NULL??
}Cmd_Typedef_t;

各位朋友可能會使用到非常多的自定義CLI命令, 格式諸如這個網(wǎng)卡的命令:

const?Cmd_Typedef_t?CLI_WizMsg=
{
????//識別關(guān)鍵字
????.pcCmdStr???=?"wiz",
????//幫助內(nèi)容
????.pcHelpStr??=
????"[WIZ?contorls]\r\n"
?"?wiz?help\r\n"
?"?wiz?rd?info\r\n"
?"?wiz?reset\r\n"
?"?wiz?wr?ip?...\r\n"
?"?wiz?wr?mask?...\r\n"
?"?wiz?wr?way?...\r\n"
?"?wiz?wr?mac?-

-

-

-

-

\r\n"
?"?wiz?wr?port????\r\n"
?"?wiz?wr?sip?...?\r\n"
?"?wiz?wr?cip?...?\r\n"
?"?wiz?load?default\r\n"
?"[WIZ?Test?mode]\r\n"
?"?wiz?loop?open\r\n"
?"?wiz?loop?close\r\n"
?"\r\n",
?
?//處理函數(shù)
?.pxCmdHook??=?
本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉