在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認識你,還能領取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設備為動態設備,因此重定向printf函數時,需要注意以下幾個關鍵步驟:

1.1 支持NEWLIB標準庫函數

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

08005670-8b29-11ee-9788-92fbcf53809c.png1.2 檢測動態設備

USB設備為動態設備,因此需要持續檢測設備的是否存在情況。可通過初始化一個動態設備檢測任務,對設備的是否存在情況進行周期性檢測。

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;
// 檢測動態設備 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

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

    關注

    2

    文章

    4509

    瀏覽量

    70638
  • uart
    +關注

    關注

    22

    文章

    1235

    瀏覽量

    101395
  • 函數
    +關注

    關注

    3

    文章

    4331

    瀏覽量

    62618
收藏 人收藏

    評論

    相關推薦

    stdio.h實現了printf函數?

    我們平時包含的 stdio.h 頭文件,里面是不是實現了 printf 函數? 為什么會有這個疑問?因為每次使用 printf,就得包含 stdio.h ,這就導致很多同學誤以為,stdio.h
    的頭像 發表于 12-18 10:28 ?123次閱讀

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

    shell輸出重定向通常是指將執行命令的輸出信息從默認的標準輸出(即當前終端)重新定向到指定文件中。輸入重定向通常是指將命令所需的輸入數據的來源,從標準輸入(即當前終端)更改為從指定文件中獲取。輸出
    發表于 09-23 10:23

    重定向了fputc及putchar函數,但printf沒有輸出,為什么?

    重定向了fputc及putchar函數,但printf沒有輸出 刪除了drivers/drv_uart.c drv_uart.h 刪除了文件rt-thread\\components
    發表于 07-18 07:44

    esp32c3能不能將串口打印函數重定向到自己軟件模擬的uart上?

    模擬uart,用于打印日志;請問這種做法可以實現嗎?可以將打印函數重定向到該模擬uart嗎?如果可以,麻煩指導一下重定向需要修改哪幾個函數? ps:打印的
    發表于 06-20 06:32

    請問如何將printf使用的stdout重定向到asclin?

    /v4.9.3.0-infineon-1.0/docs/userguide.pdf 第 406 頁中關于 printf 的唯一說明是 stdout 重定向到模擬 io 調試器。 當然,您可以使用 Ifx_Console_print,但我想知道是否可以通過標準庫來實現。
    發表于 06-03 06:48

    芯海通用 MCU 應用筆記:在 MDK 開發環境下代碼重定向到 RAM 執行的幾種方法

    為 V5.37.0.0。本文檔介紹方法適用于芯海科技 MCU。*附件:應用筆記:在MDK開發環境下代碼重定向到RAM執行的幾種方法.pdf
    發表于 05-16 11:58

    芯海通用 MCU應用筆記 :在 IAR 及 MDK 開發環境下使用 printf 函數重定向移植差異指南

    printf 函數支持的差異。并在本應用筆記結尾處給出可以一鍵移植到 Keil、IAR8.x、IAR9.x 版本下的通用重定向代碼。 Keil 和 IAR 都是常用的開發工具 I
    發表于 05-16 11:56

    求助,關于HAL下的printf重定向輸出疑問求解

    (1)網上查了使用printf重定向,串口輸出,函數如下,使用HAL_UART_Transmit函數。 int fputc(int ch,FILE *f) { uint8_t tem
    發表于 05-10 06:04

    STM8S如何在STVD環境下重定向printf函數實現UART簡化輸出?

    printf(),網上IAR環境的重定向調通了,求STVD環境下的code。 3. 用STM8的官方例程UART1_Printf在STVD環境下編譯OK,但是debug時候報錯下載不了程序 4. 針對3
    發表于 04-30 08:29

    STM8L051片子使用重定向printf函數時總是報錯,沒辦法引用printf函數是什么原因?

    STM8L051片子使用重定向printf函數時總是報錯,沒辦法引用printf函數,不知道是什么原因,使用的是IAR編譯器,總是報內存不足
    發表于 04-28 08:05

    用keil仿真無法用printf打印怎么解決?

    用keil仿真 無法用printf打印.想用printf重定向到Usart1的方法,使printf打印信息能夠在UART#1的窗口打印出來. 硬件連接用的是SW(沒有連SWO引腳,只
    發表于 04-11 08:20

    STM32CubeIDE中打印重定向報錯怎么解決?

    HAL_UART_Transmit( huart1 , (uint8_t *) ch, 1, 0xFFFF);報錯 printf重定向 報錯../Core/Src/main.c:42:21: error: \'huart1\' undeclared 已添加stdio.h頭
    發表于 04-03 07:33

    H7平臺如何重定向sqrtf函數到RAM中運行?

    如題,H7平臺如何重定向sqrtf函數到RAM中運行,這個函數是庫函數,不能使用__ramfunc前綴,有什么方法或是例程,網上找了很多icf配置的方法,都不行,要不就是只放置到RAM
    發表于 03-27 06:40

    將動態指示段重定向到單獨的LED

    有時,除了數字指示器之外,還需要單獨的 LED。它們可以連接到微控制器的單獨引腳,但您也可以節省引腳。如果數字指示器具有從未使用過的段(例如,右邊數字中的一個點),則可以將它們重定向到外部 LED。
    發表于 02-02 16:49 ?594次閱讀
    將動態指示段<b class='flag-5'>重定向</b>到單獨的LED

    2分鐘搞懂輸出重定向

    視頻最后我們通過重定向把標準輸出寫到了文件中,但是錯誤輸出還是留在了屏幕上。
    的頭像 發表于 01-15 16:41 ?564次閱讀
    主站蜘蛛池模板: 国产精品区在线12p| 最近2018中文字幕免费看在线| 种子天堂bt磁力在线资源| 日本特黄色大片| 69er小视频| 涩涩高清无乱码在线观看| 天堂网在线www| 欧美精品videofree720p| 香蕉操| 在线观看一区二区三区四区| 狠狠色噜噜狠狠狠狠999米奇| 亚洲成人7777| 免费观看色视频| 99婷婷| 黄色xxxx| 人人做人人澡人人人爽| 午夜精品久久久久久91| yy4080午夜理论一级毛片| 情趣店上班h系列小说| 欧美就是色| 久久国产高清字幕中文| 在线国产你懂的| 国产馆精品推荐在线观看| 色综合亚洲| 中文字幕在线一区二区在线| 亚洲黄色三级| 又大又粗又爽黄毛片| 一级a级国产不卡毛片| 特级毛片aaaa免费观看| 国产欧美日韩电影| 久久精品国波多野结衣| 亚洲色图综合网| 韩国三级理在线视频观看| 免费jlzzjlzz在线播放视频| 日本边添边爱边摸边做边爱| 久久精品视频国产| 91无毒不卡| 午夜欧美成人久久久久久| 亚洲精品福利视频| 国模小丫大尺度啪啪人体| 国模精品视频|