加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

【技術(shù)分享】AWorksLP應(yīng)用筆記:重定向printf函數(shù)

2023/11/26
2756
閱讀需 9 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

printf函數(shù)作為標(biāo)準(zhǔn)庫定義的格式化輸出方式,本文將介紹其在AWorksLP下默認(rèn)適配以及重映射至熱拔插設(shè)備端口的實(shí)現(xiàn)。

默認(rèn)適配

AWorksLP中默認(rèn)已經(jīng)對printf函數(shù)完成相關(guān)適配工作,且默認(rèn)被適配在UART設(shè)備。用戶可以在圖形化配置界面中使能 support the stdio functions ,并選擇期望UART設(shè)備進(jìn)行輸出,具體配置如下圖所示。

注:若用戶未使能 stdio function 時(shí),調(diào)用printf函數(shù)時(shí),將不會(huì)有任何輸出。

本文將使用 EPC6450-AWI 平臺(tái),選擇標(biāo)有絲印為DUART的調(diào)試串口(UART0設(shè)備)進(jìn)行printf功能演示測試。將TTL轉(zhuǎn)USB串口模塊的TXD與板子的RXD絲印連接,RXD與板子的TXD絲印,將另一端的USB口接入電腦。

啟動(dòng)串口調(diào)試助手,搜索并打開串口模塊的設(shè)備端口號后,在工程中調(diào)用printf函數(shù),根據(jù)下圖可知,printf函數(shù)適配UART0設(shè)備成功。


重定向至其他設(shè)備

嵌入式的諸多應(yīng)用在UART設(shè)備資源受限的情況下,可能存在將printf函數(shù)重定向到其他設(shè)備需求。為此,筆者將以EPC6450-AWI平臺(tái)的USB串口設(shè)備為例進(jìn)行說明。

1.?實(shí)施步驟

與UART設(shè)備不同,USB設(shè)備為動(dòng)態(tài)設(shè)備,因此重定向printf函數(shù)時(shí),需要注意以下幾個(gè)關(guān)鍵步驟:

1.1 支持NEWLIB標(biāo)準(zhǔn)庫函數(shù)

由于AWorksLP中利用posix file相關(guān)操作接口對printf函數(shù)進(jìn)行適配,故在重映射端口時(shí),需將 support libc file operations 使能,并取消默認(rèn)選擇UART設(shè)備作為printf函數(shù)的適配,具體如下圖所示。

1.2 檢測動(dòng)態(tài)設(shè)備

USB設(shè)備為動(dòng)態(tài)設(shè)備,因此需要持續(xù)檢測設(shè)備的是否存在情況??赏ㄟ^初始化一個(gè)動(dòng)態(tài)設(shè)備檢測任務(wù),對設(shè)備的是否存在情況進(jìn)行周期性檢測。

while true: ? ?access (device) ? ?delay()

1.3 關(guān)聯(lián)標(biāo)準(zhǔn)文件流

在檢測到USB設(shè)備存在時(shí),僅需將設(shè)備與標(biāo)準(zhǔn)文件流(stdio中的stdin、stdout、stderr,且在C庫中被假定為交互設(shè)備,并約定了這些設(shè)備的文件描述符依次為0、1、2)關(guān)聯(lián)起來。故在使用時(shí),我們僅需將描述符0、1、2與USB串口設(shè)備即可,其偽代碼如下所示。

while true:    if access (device):        0 = open (device)        duplicate 1 to 0        duplicate 2 to 0    delay()

1.4 清理文件描述符

檢測到USB設(shè)備不存在時(shí),需及時(shí)取消設(shè)備與標(biāo)準(zhǔn)文件流的關(guān)聯(lián)。即根據(jù)設(shè)備的打開情況,對文件描述符進(jìn)行清理,以便之后重新關(guān)聯(lián)標(biāo)準(zhǔn)文件流。

while true: ? ?if access (device): ? ? ? ?0 = open (device) ? ? ? ?duplicate 1 to 0 ? ? ? ?duplicate 2 to 0 ? ?else: ? ? ? ?close (device) ? ?delay()

2. 基礎(chǔ)配置

在EPC6450-AWI平臺(tái)標(biāo)有絲印為Type-C的接口處,插上Type-C線,將Type-C線的另一端USB口連接電腦。并在圖形化配置界面,將USB設(shè)備選擇為CDC串口設(shè)備。

3.?簡單示例

static int __dynamic_stdin_fd = -1;static aw_err_t __dynamic_stdout_ret = -AW_EBADF;static aw_err_t __dynamic_stderr_ret = -AW_EBADF;
aw_err_t aw_printf_redirect_dynamic_dev(void){ ? ?int find = -AW_ENODEV;
 ? ?// 檢測動(dòng)態(tài)設(shè)備 ? ?find = aw_access(AW_DYNAMIC_DEV_PATH, AW_F_OK);
 ? ?if(find == AW_OK) { ? ? ? ?// 關(guān)聯(lián)標(biāo)準(zhǔn)文件流 ? ? ? ?if(__dynamic_stdin_fd < 0) ? ? ? ?{ ? ? ? ? ? ?__dynamic_stdin_fd =  ? ? ? ? ? ? aw_open_at(AW_DYNAMIC_DEV_PATH,AW_O_RDWR,0,0); ? ? ? ? ? ?__dynamic_stdout_ret = aw_dup2(0, 1); ? ? ? ? ? ?__dynamic_stderr_ret = aw_dup2(0, 2); ? ? ? ? ? ?return AW_OK; ? ? ? ?} ? ?} ? ?else { ? ? ? ?// 清理文件描述符 ? ? ? ?if(__dynamic_stdin_fd >= 0) { ? ? ? ? ? ?aw_close(0); ? ? ? ? ? ?__dynamic_stdin_fd = -1; ? ? ? ?} ? ? ? ?if (__dynamic_stdout_ret == AW_OK) { ? ? ? ? ? ?aw_close(1); ? ? ? ? ? ?__dynamic_stdout_ret = -AW_EBADF; ? ? ? ?} ? ? ? ?if (__dynamic_stderr_ret == AW_OK) { ? ? ? ? ? ?aw_close(2); ? ? ? ? ? ?__dynamic_stderr_ret = -AW_EBADF; ? ? ? ?} ? ?}
 ? ?return -AW_ENODEV;}
int aw_main(void){ ? ?int ret;
 ? ?aw_kprintf("hello worldn"); ? ?printf("hello worldn");
 ? ?while(1) { ? ? ? ?ret = aw_printf_redirect_dynamic_dev(); ? ? ? ?if (AW_OK == ret) ? ? ? ? ? ?break;
 ? ? ? ?// 設(shè)置檢測周期 ? ? ? ?AW_TASK_DELAY(100); ? ?}
 ? ?aw_kprintf("hello world, ZLGn"); ? ?printf("hello world, ZLGn");
 ? ?return 0;}

啟動(dòng)串口調(diào)試助手,搜索并打開DEBUG UART設(shè)備與CDC串口設(shè)備的端口號后,運(yùn)行上文示例程序。根據(jù)下圖可知,USB設(shè)備枚舉后,printf函數(shù)成功重定向到了CDC串口設(shè)備。

總結(jié)

實(shí)現(xiàn)重定向printf函數(shù)時(shí)主要關(guān)注以下兩個(gè)關(guān)鍵點(diǎn):重寫NEWLIB標(biāo)準(zhǔn)庫中printf函數(shù)的底層實(shí)現(xiàn);將指定設(shè)備以標(biāo)準(zhǔn)文件流約定的文件描述符打開。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險(xiǎn)等級 參考價(jià)格 更多信息
KSZ8895MQI 1 Micrel Inc Ethernet Transceiver, CMOS, PQFP128, LEAD FREE, PLASTIC, QFP-128
$8.91 查看
KSZ8081RNAIA-TR 1 Microchip Technology Inc DATACOM, ETHERNET TRANSCEIVER, QCC24

ECAD模型

下載ECAD模型
$1.39 查看
KSZ8863MLLI-TR 1 Microchip Technology Inc DATACOM, LAN SWITCHING CIRCUIT
$5.95 查看
致遠(yuǎn)電子

致遠(yuǎn)電子

廣州致遠(yuǎn)電子股份有限公司成立于2001年,注冊資金5000萬元,國家級高新技術(shù)認(rèn)證企業(yè),廣州市高端工控測量儀器工程技術(shù)研究開發(fā)中心,Intel ECA全球合作伙伴和微軟嵌入式系統(tǒng)金牌合作伙伴。

廣州致遠(yuǎn)電子股份有限公司成立于2001年,注冊資金5000萬元,國家級高新技術(shù)認(rèn)證企業(yè),廣州市高端工控測量儀器工程技術(shù)研究開發(fā)中心,Intel ECA全球合作伙伴和微軟嵌入式系統(tǒng)金牌合作伙伴。收起

查看更多

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

ZLG官方賬號,一個(gè)匯聚500名工程師的研發(fā)測試分享平臺(tái),為您提供電子世界領(lǐng)先的產(chǎn)品技術(shù)與行業(yè)解決方案.