一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

AWorksLP應(yīng)用筆記:重定向printf函數(shù)

ZLG致遠(yuǎn)電子 ? 2023-11-25 08:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

默認(rèn)適配

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

0745adc0-8b29-11ee-9788-92fbcf53809c.png

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

本文將使用 EPC6450-AWI 平臺(tái),選擇標(biāo)有絲印為DUART的調(diào)試串口(UART0設(shè)備)進(jìn)行printf功能演示測(cè)試。將TTL轉(zhuǎn)USB串口模塊的TXD與板子的RXD絲印連接,RXD與板子的TXD絲印,將另一端的USB口接入電腦。07591f5e-8b29-11ee-9788-92fbcf53809c.png啟動(dòng)串口調(diào)試助手,搜索并打開串口模塊的設(shè)備端口號(hào)后,在工程中調(diào)用printf函數(shù),根據(jù)下圖可知,printf函數(shù)適配UART0設(shè)備成功。076d89e4-8b29-11ee-9788-92fbcf53809c.png

重定向至其他設(shè)備嵌入式的諸多應(yīng)用在UART設(shè)備資源受限的情況下,可能存在將printf函數(shù)重定向到其他設(shè)備需求。為此,筆者將以EPC6450-AWI平臺(tái)的USB串口設(shè)備為例進(jìn)行說(shuō)明。077d1c56-8b29-11ee-9788-92fbcf53809c.png1.實(shí)施步驟

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

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

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

08005670-8b29-11ee-9788-92fbcf53809c.png1.2 檢測(cè)動(dòng)態(tài)設(shè)備

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

while true: access (device) delay()

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

在檢測(cè)到USB設(shè)備存在時(shí),僅需將設(shè)備與標(biāo)準(zhǔn)文件流(stdio中的stdin、stdout、stderr,且在C庫(kù)中被假定為交互設(shè)備,并約定了這些設(shè)備的文件描述符依次為0、1、2)關(guān)聯(lián)起來(lái)。故在使用時(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 清理文件描述符

檢測(cè)到USB設(shè)備不存在時(shí),需及時(shí)取消設(shè)備與標(biāo)準(zhǔn)文件流的關(guān)聯(lián)。即根據(jù)設(shè)備的打開情況,對(duì)文件描述符進(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è)備。

0812e6e6-8b29-11ee-9788-92fbcf53809c.png

3.簡(jiǎn)單示例

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;
// 檢測(cè)動(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 world\n"); printf("hello world\n");
while(1) { ret = aw_printf_redirect_dynamic_dev(); if (AW_OK == ret) break;
// 設(shè)置檢測(cè)周期 AW_TASK_DELAY(100); }
aw_kprintf("hello world, ZLG\n"); printf("hello world, ZLG\n");
return 0;}

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

0831239a-8b29-11ee-9788-92fbcf53809c.png


07799d06-8b29-11ee-9788-92fbcf53809c.jpg 總結(jié)實(shí)現(xiàn)重定向printf函數(shù)時(shí)主要關(guān)注以下兩個(gè)關(guān)鍵點(diǎn):

  1. 重寫NEWLIB標(biāo)準(zhǔn)庫(kù)中printf函數(shù)的底層實(shí)現(xiàn);
  2. 將指定設(shè)備以標(biāo)準(zhǔn)文件流約定的文件描述符打開。


07799d06-8b29-11ee-9788-92fbcf53809c.jpg 擴(kuò)展閱讀

本文所演示平臺(tái)使用的是GCC編譯器,其對(duì)應(yīng)C庫(kù)為NEWLIB標(biāo)準(zhǔn)庫(kù)。在AWorksLP中printf函數(shù)的底層輸出接口在AWorksLP中實(shí)現(xiàn)為_write_r 函數(shù),其具體代碼實(shí)現(xiàn)如下所示。

__attribute__((__used__)) _ssize_t_write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes){ return aw_write(fd,buf,nbytes);}

需要值得注意的是,上述適配方式僅兼容NEWLIB,若是其他編譯器,其實(shí)現(xiàn)以及接口不盡相同,下表僅給出部分以供參考,在使用時(shí)需根據(jù)實(shí)際情況進(jìn)行調(diào)整。

工具鏈

標(biāo)準(zhǔn)庫(kù)

底層接口

GCC

NEWLIB

_write_r

ARMCC

ARMCLIB

_sys_write

ARMCLANG

ARMCLIB

_sys_write

聲明:本文內(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)投訴
  • 設(shè)備
    +關(guān)注

    關(guān)注

    2

    文章

    4668

    瀏覽量

    71767
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1276

    瀏覽量

    103978
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64898
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    GPDV6624C應(yīng)用筆記1.0版

    電子發(fā)燒友網(wǎng)站提供《GPDV6624C應(yīng)用筆記1.0版.pdf》資料免費(fèi)下載
    發(fā)表于 06-06 17:20 ?0次下載

    無(wú)傳感器磁場(chǎng)定向控制

    控制,F(xiàn)OC 控制降低了轉(zhuǎn)矩脈動(dòng),從而消除了轉(zhuǎn)矩脈動(dòng)所產(chǎn)生的噪聲,降低了電機(jī)發(fā)熱,同時(shí)提高了系統(tǒng)效率,增大了最大轉(zhuǎn)矩。本應(yīng)用筆記討論了使用 JMT1808R 控制芯片對(duì)無(wú)刷直流電機(jī)(Brushless Direct Current Motor, BLDC)進(jìn)行無(wú)感 FOC 的算法控制。 點(diǎn)擊免費(fèi)下載~~~~
    發(fā)表于 03-14 16:26

    了解ISL28022的電流和功率計(jì)算應(yīng)用筆記

    本應(yīng)用筆記討論數(shù)字電源監(jiān)控器(DPM) ISL28022的內(nèi)部計(jì)算程序。它解釋了數(shù)據(jù)寄存器的位格式,并舉例說(shuō)明了內(nèi)部數(shù)學(xué)處理器從測(cè)得的分流和總線電壓導(dǎo)出電流和功率值的程序步驟。本應(yīng)用筆記是ISL28022數(shù)據(jù)手冊(cè)的摘要。
    的頭像 發(fā)表于 02-21 11:30 ?590次閱讀
    了解ISL28022的電流和功率計(jì)算應(yīng)<b class='flag-5'>用筆記</b>

    CDK應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《CDK應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 01-16 16:17 ?0次下載
    CDK應(yīng)<b class='flag-5'>用筆記</b>

    ES32VF2264應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《ES32VF2264應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 01-16 16:14 ?0次下載
    ES32VF2264應(yīng)<b class='flag-5'>用筆記</b>

    ES7P0214應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《ES7P0214應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 01-16 16:06 ?0次下載
    ES7P0214應(yīng)<b class='flag-5'>用筆記</b>

    ES7P0213應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《ES7P0213應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 01-16 15:26 ?0次下載
    ES7P0213應(yīng)<b class='flag-5'>用筆記</b>

    AT32F423 PWC應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《AT32F423 PWC應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 01-15 15:30 ?0次下載
    AT32F423 PWC應(yīng)<b class='flag-5'>用筆記</b>

    全面掌握Linux重定向技巧:讓命令行操作效率翻倍的秘密

    #1 linux輸出重定向 $ command > file 2>1 這里的 ,表示重定向的目標(biāo)不是一個(gè) 文件 ,而是一個(gè) 文件描述符 ,內(nèi)置的文件描述符如下 1 => stdout2
    的頭像 發(fā)表于 01-08 10:19 ?531次閱讀

    S32K3xxICU應(yīng)用筆記

    S32K3xxICU應(yīng)用筆記
    發(fā)表于 12-30 15:38 ?2次下載

    stdio.h實(shí)現(xiàn)了printf函數(shù)?

    我們平時(shí)包含的 stdio.h 頭文件,里面是不是實(shí)現(xiàn)了 printf 函數(shù)? 為什么會(huì)有這個(gè)疑問(wèn)?因?yàn)槊看问褂?printf,就得包含 stdio.h ,這就導(dǎo)致很多同學(xué)誤以為,stdio.h
    的頭像 發(fā)表于 12-18 10:28 ?616次閱讀

    應(yīng)用筆記1604:去補(bǔ)償運(yùn)算放大器

    電子發(fā)燒友網(wǎng)站提供《應(yīng)用筆記1604:去補(bǔ)償運(yùn)算放大器.pdf》資料免費(fèi)下載
    發(fā)表于 09-29 10:30 ?0次下載
    應(yīng)<b class='flag-5'>用筆記</b>1604:去補(bǔ)償運(yùn)算放大器

    嵌入式 學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-shell腳本編寫之輸入輸出重定向

    shell腳本編寫之輸入輸出重定向shell輸出重定向通常是指將執(zhí)行命令的輸出信息從默認(rèn)的標(biāo)準(zhǔn)輸出(即當(dāng)前終端)重新定向到指定文件中。輸入重定向通常是指將命令所需的輸入數(shù)據(jù)的來(lái)源,從標(biāo)
    發(fā)表于 09-24 10:06

    飛凌嵌入式ElfBoard ELF 1板卡-shell腳本編寫之輸入輸出重定向

    shell輸出重定向通常是指將執(zhí)行命令的輸出信息從默認(rèn)的標(biāo)準(zhǔn)輸出(即當(dāng)前終端)重新定向到指定文件中。輸入重定向通常是指將命令所需的輸入數(shù)據(jù)的來(lái)源,從標(biāo)準(zhǔn)輸入(即當(dāng)前終端)更改為從指定文件中獲取。輸出
    發(fā)表于 09-23 10:23

    TLC3702 TLC3704系列應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《TLC3702 TLC3704系列應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 09-20 09:14 ?0次下載
    TLC3702 TLC3704系列應(yīng)<b class='flag-5'>用筆記</b>