哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

AWorksLP應用筆記:重定向printf函數

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

掃碼添加小助手

加入工程師交流群

printf函數作為標準庫定義的格式化輸出方式,本文將介紹其在AWorksLP下默認適配以及重映射至熱拔插設備端口的實現。

默認適配

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

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

注:若用戶未使能 stdio function 時,調用printf函數時,將不會有任何輸出。

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

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

與UART設備不同,USB設備為動態(tài)設備,因此重定向printf函數時,需要注意以下幾個關鍵步驟:

1.1 支持NEWLIB標準庫函數

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

08005670-8b29-11ee-9788-92fbcf53809c.png1.2 檢測動態(tài)設備

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

while true: access (device) delay()

1.3 關聯標準文件流

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

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

1.4 清理文件描述符

檢測到USB設備不存在時,需及時取消設備與標準文件流的關聯。即根據設備的打開情況,對文件描述符進行清理,以便之后重新關聯標準文件流。

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

2. 基礎配置在EPC6450-AWI平臺標有絲印為Type-C的接口處,插上Type-C線,將Type-C線的另一端USB口連接電腦。并在圖形化配置界面,將USB設備選擇為CDC串口設備。

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

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;
// 檢測動態(tài)設備 find = aw_access(AW_DYNAMIC_DEV_PATH, AW_F_OK);
if(find == AW_OK) { // 關聯標準文件流 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;
// 設置檢測周期 AW_TASK_DELAY(100); }
aw_kprintf("hello world, ZLG\n"); printf("hello world, ZLG\n");
return 0;}

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

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


07799d06-8b29-11ee-9788-92fbcf53809c.jpg 總結實現重定向printf函數時主要關注以下兩個關鍵點:

  1. 重寫NEWLIB標準庫中printf函數的底層實現;
  2. 將指定設備以標準文件流約定的文件描述符打開。


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

本文所演示平臺使用的是GCC編譯器,其對應C庫為NEWLIB標準庫。在AWorksLP中printf函數的底層輸出接口在AWorksLP中實現為_write_r 函數,其具體代碼實現如下所示。

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

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

工具鏈

標準庫

底層接口

GCC

NEWLIB

_write_r

ARMCC

ARMCLIB

_sys_write

ARMCLANG

ARMCLIB

_sys_write

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 設備
    +關注

    關注

    2

    文章

    4879

    瀏覽量

    73844
  • uart
    +關注

    關注

    22

    文章

    1319

    瀏覽量

    106941
  • 函數
    +關注

    關注

    3

    文章

    4421

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【RA-Eco-RA2E1-V1.0開發(fā)板試用】串口打印例程。

    本實驗基于瑞薩 RA 系列單片機完成UART 串口通信與printf 重定向功能實現,通過配置串口引腳、初始化驅動、編寫發(fā)送回調函數,實現了開發(fā)板與上位機之間的數據收發(fā),并可直接使用print
    的頭像 發(fā)表于 02-24 16:33 ?432次閱讀
    【RA-Eco-RA2E1-V1.0開發(fā)板試用】串口打印例程。

    將C庫的printf函數重定向到UART的過程

    printf (option LD Linker->Libraries->Small printf set to \'Yes\') calls __io_putchar
    發(fā)表于 01-21 07:14

    【乾芯QXS320F開發(fā)板試用】基于printf重定向的高速串口調試方案

    。 二、代碼分析 核心代碼的邏輯是通過重定向(Retarget) C語言標準庫的 printf 和 puts 函數,使得原本輸出到控制臺的內容,改由芯片的物理串口(SCI)發(fā)出。這一點以前做過
    發(fā)表于 01-07 17:30

    在ADS編譯器中,用標準的C庫函數printf()需要哪些設置呢?

    在ADS編譯器中,用標準的C庫函數printf()需要哪些設置呢?又在哪兒可以看到printf()輸出的信息呢?
    發(fā)表于 12-23 07:32

    【瑞薩RA6E2地奇星開發(fā)板試用】串口通信報錯:標準輸出流 stdout 未定義

    在跟著官方串口通信報錯: 問題可能是: 使用了 printf 或類似標準庫函數 但未實現重定向到串口所需的基礎設施 LLVM 工具鏈(Clang/LD)無法找到 stdout 的定義 已知在
    發(fā)表于 12-17 18:39

    請問CW32F003支持printf函數嗎?

    CW32F003支持printf函數嗎?
    發(fā)表于 11-21 07:48

    printf重定向之后無法運行是怎么回事?

    參考 CW32F003_StandardPeripheralLib_V1.6ExamplesUARTUART_Printf,在代碼中添加了#ifdef __GNUC__ /* With GCC
    發(fā)表于 11-13 08:07

    TI Driverlib 標準輸出完整重定向的改進方案

    探索出了一種用于TI Driverlib的完整輸出重定向方案
    的頭像 發(fā)表于 11-11 00:33 ?568次閱讀

    UART在5.2.0版本E2S中的重定向

    隨著FSP庫版本更新到5.2.0,在開發(fā)過程中就會發(fā)現4.0.0版本的串口重定義并不適用于最新版本。繼續(xù)使用原來的重定向代碼時,編譯器就會報錯。根據報錯的信息發(fā)現,缺少了幾個函數的定義,這里補全定義即可。
    的頭像 發(fā)表于 10-31 15:28 ?4137次閱讀
    UART在5.2.0版本E2S中的<b class='flag-5'>重定向</b>

    printf函數在hbird SDK中的應用

    在helloworld的例程中,使用到了printf函數,通過串口輸出了數據。 在Nuclei Studio中通過teminal窗口可以查看串口打印的信息。 這背后的原理是什么? 在嵌入式
    發(fā)表于 10-31 08:48

    【CPKCOR-RA8D1】+ 基礎串口打印測試

    printf函數到串口9 // 若遇到鏈接錯誤,需在項目屬性中勾選“Use MicroLIB”或自行實現其他重定向方式 int _write(int file, char *ptr, int len
    發(fā)表于 10-30 09:40

    e203仿真helloworld例程printf能在終端顯示的原理

    名是有特殊意義的,它會將printf的字符輸出重定向到這里,通過這個函數傳遞參數、輸出數據。 __WEAK表示這個函數是弱定義。如果我們想通過其他方式
    發(fā)表于 10-27 06:56

    【RA4E2開發(fā)板評測】FSP5.2之后的串口重定向問題解決方法

    代碼時,編譯器就會報錯。 根據報錯的信息發(fā)現,缺少了幾個函數的定義,這里補全定義即可。 【解決方法】 在野火的教程里有提到過如何處理的方法。 添加重定向函數內容如下: #if defined
    發(fā)表于 08-29 07:02

    MEMS定向短節(jié)在HDD中如何精準定向?

    ? 水平定向鉆孔作業(yè)時,常規(guī)傳感器在強電磁區(qū)等復雜環(huán)境中常常面臨地磁場失效導致方位基準崩塌、劇烈震動與沖擊破壞姿態(tài)測量、空間限制傳感器集成等一系列精度挑戰(zhàn),ER-MNS-09(下文稱為“09”)這款
    的頭像 發(fā)表于 07-08 14:46 ?632次閱讀

    GPDV6624C應用筆記1.0版

    電子發(fā)燒友網站提供《GPDV6624C應用筆記1.0版.pdf》資料免費下載
    發(fā)表于 06-06 17:20 ?0次下載
    石泉县| 安图县| 高淳县| 寿宁县| 杭锦后旗| 阳城县| 韩城市| 台山市| 阿尔山市| 蒲城县| 湖南省| 新巴尔虎左旗| 缙云县| 鲁甸县| 四子王旗| 贵阳市| 土默特右旗| 嘉峪关市| 厦门市| 比如县| 古交市| 缙云县| 汨罗市| 阿合奇县| 龙泉市| 钟祥市| 泸水县| 方山县| 云梦县| 凌云县| 临洮县| 昌平区| 曲沃县| 伊春市| 如东县| 许昌县| 田林县| 开江县| 咸阳市| 泾川县| 平罗县|