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

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

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

3天內不再提示

怎么在SOC驗證的C代碼中打印字符串呢?用printf?

sanyue7758 ? 來源:處芯積律 ? 2023-04-21 09:33 ? 次閱讀

學過C語言都知道,在程序中添加打印信息有助于我們追蹤程序執行的情況。特別是debug的時候,打印一些log信息對快速定位到問題非常有幫助。

怎么在SOC驗證的C代碼中打印字符串呢?用printf ?

我們來試一下:

c1820eda-dfcc-11ed-bfe3-dac502259ad0.png

執行結果:

c1971672-dfcc-11ed-bfe3-dac502259ad0.png

沒有出現 Hello world。這種結果是符合預期的。C code 通過GCC編譯生成bin文件然后送到CPU中按指令進行執行。我們看下這段代碼編譯出來的指令是什么?

c1a8bc7e-dfcc-11ed-bfe3-dac502259ad0.png

這里 printf 編譯出來是jump到一個puts的函數里面。puts函數又是什么呢?

c1c1ba80-dfcc-11ed-bfe3-dac502259ad0.png

puts 又跳到 _puts_r ,依次下去,由printf 編譯出了一系列的指令代碼。由于CPU最終綜合成版圖,因此在CPU的RTL代碼中不會存在讀到某條指令打印一個字符串的功能。所以單純的調用printf 并不會在log中打印字符串信息。

如何實現打?。?/p>

兩個思路,第一個思路,在SOC的TB里面增加一個CPU bus的monitor,我們在monitor中實現一個功能,當看到特定地址,特定數據的時候,開始收集要打印的字符串,當看到特定地址,另外一個特定數據的時候,結束字符串的收集,并將收集到字符串打印。

以下是我們在一個project中看到特殊數據 24’hdddd_11xx 開始收集字符串。

c1d336b6-dfcc-11ed-bfe3-dac502259ad0.png

以下是我們在一個project中看到特殊數據24’hdddd_eeee 時打印字符串。

c1e7ec1e-dfcc-11ed-bfe3-dac502259ad0.png

這樣,我們可以在c里面實現一個打印字符串的函數。

c1fb4d72-dfcc-11ed-bfe3-dac502259ad0.png

通過上面這種手段,我們巧妙的將C語言的打印和 verilog的$display 打印連接起來。我們來看看效果

c20e3a18-dfcc-11ed-bfe3-dac502259ad0.png

Hello World 打印出來了。

我們再看看 puts編譯后的代碼是什么?

c21ff974-dfcc-11ed-bfe3-dac502259ad0.png

這次 puts并沒有跳轉到_puts_r ,而是向特定地址發送特定數據表示開始,然后傳輸字符串,并以特定數據結束。當我們的monitor檢查到這些特殊的數據時就會打印出log信息。

上面打印的方式可以解決在SOC驗證環境中打印字符串的問題,但是在芯片流片回來之后,在C中調用上述函數還能打印嗎?顯然是不可以的,因為這個時候外部的monitor都沒有了,更別說不能綜合的display函數等。

下面介紹一種更加普遍的使用方法。我們在嵌入式硬件開發的過程中經常用到串口調試工具。

通過簡單的幾根線與電腦連接,然后用串口調試助手就能將SOC和電腦調試界面連接起來。

c2742fda-dfcc-11ed-bfe3-dac502259ad0.png

因此在我們SOC驗證環境中集成UART的slave device,在UART device收到數據后,打印出字符串信息是一個很好的選擇。

為此,我們通過向uart device寫字符串的形式,然后在UART device中實現打印功能。

c2941a48-dfcc-11ed-bfe3-dac502259ad0.png

我們來測試下用上面這種方式打印的效果,prints 是我們向uart 發送字符串的函數。

c2a9c6ae-dfcc-11ed-bfe3-dac502259ad0.png

下面是執行效果

c2bc2b0a-dfcc-11ed-bfe3-dac502259ad0.png

同樣實現了打印,而且這種打印方式在后續芯片流片回來之后可以通過串口調試 查看打印的信息。

看到這里,大家明白怎么在SOC中實現字符串打印了吧。





審核編輯:劉清

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

    關注

    1

    文章

    151

    瀏覽量

    19111
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140560
  • gcc編譯器
    +關注

    關注

    0

    文章

    78

    瀏覽量

    3670
  • Printf
    +關注

    關注

    0

    文章

    84

    瀏覽量

    14131

原文標題:SOC驗證C代碼中如何打印字符串?

文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    C++字符串string

    string是C++編程語言中的字符串。C++字符串處理可以使用
    的頭像 發表于 07-10 00:26 ?1923次閱讀
    <b class='flag-5'>C</b>++<b class='flag-5'>字符串</b>string

    rtt studio終端無法打印字符串是怎么回事?

    求助:rtt studio新創建的項目使用自帶終端可以打印字符串,但是將字符串輸出語句注釋掉再改回來終端就無法打印了,并且msh也未顯示也無法使用輸入,使用其他的串口調試助手看到了rtt的界面以及
    發表于 07-05 07:29

    想實現字符串a復制到b,然后打印字符串b,程序錯在哪...

    想實現字符串a復制到b,然后打印字符串b,程序錯在哪?。。?/div>
    發表于 12-22 21:11

    c語言中如何把字符串的ASCII碼通過printf函數打印字符串

    printf_cpsr: %scpsr= 0x%x \n\r",why,cpsr);}參數cpsr可以正常打印出來,但是why值就是字母usr始終無法正確顯示,請問問大家這該怎么處理printf函數
    發表于 01-22 23:16

    如何通過藍牙設備串行打印字符串?

    如何通過藍牙設備串行打印字符串,只有UARTPTCHAR選項。條件-我正在通過UART向藍牙設備發送一個單詞。同時,我希望從藍牙設備接收一個連續的字符串[大小n],而不會中斷傳輸數據。我PSUC上
    發表于 10-09 09:13

    怎樣將stm32口格式化打印字符串的函數進行封裝

    怎樣將stm32口格式化打印字符串的函數進行封裝?
    發表于 11-26 06:38

    怎樣printf()函數實現通過串口打印信息

    怎樣printf()函數實現通過串口打印信息?如何實現printf()函數打印字符串重定義到
    發表于 11-30 07:27

    怎樣使用printf函數將字符串打印到串口

    怎樣使用printf函數將字符串打印到串口?怎樣去重新定向printf函數?
    發表于 02-24 06:50

    C語言入門教程-字符串須知

    字符串須知 關于字符串常量假設您編寫并運行下面兩段代碼printf("%s ",s);} Fragment 2 {char s[100];strcpy(s,"hello
    發表于 07-29 14:19 ?1233次閱讀

    strings命令:用于打印文件打印字符串

    ? 1.命令簡介 strings 命令是二進制工具集 GNU Binutils 的一員,用于打印文件打印字符串,文件可以是文本文件(test.c),但一般用于
    的頭像 發表于 02-02 13:53 ?3261次閱讀
    strings命令:用于<b class='flag-5'>打印</b>文件<b class='flag-5'>中</b>可<b class='flag-5'>打印字符串</b>

    如何使用printf函數將字符串打印到串口

    如何使用printf函數將字符串打印到串口該函數名已經標準輸入輸出庫頭文 件 stdio.h 定義,原型為 int fputc(int
    發表于 01-12 18:53 ?1次下載
    如何使用<b class='flag-5'>printf</b>函數將<b class='flag-5'>字符串</b><b class='flag-5'>打印</b>到串口

    C語言字符串的引用方式

    C語言程序字符串是存放在字符數組的。 2. 用字符
    的頭像 發表于 03-10 14:57 ?2259次閱讀

    c語言字符串定義

    C語言是一種強大而廣泛使用的編程語言,字符串是其中一個非常重要的概念。C語言中,字符串是由一系列字符
    的頭像 發表于 11-24 10:02 ?2542次閱讀

    c語言怎么scanf輸入字符串

    C語言中,我們可以使用scanf函數來接收用戶的輸入。scanf函數有很多種用法,其中一種用法就是用來接收字符串。 要接收字符串,我們可以使用"%s"格式說明符。下面是一個簡單的示例
    的頭像 發表于 11-24 10:03 ?3506次閱讀

    字符串在編程的應用實例

    常以字符串的形式出現。例如,命令行程序,用戶輸入的命令和參數都是字符串。 輸出信息 :程序也經常需要向用戶顯示信息,這些信息同樣可以以字符串
    的頭像 發表于 01-07 15:33 ?637次閱讀
    主站蜘蛛池模板: 亚洲日本精品 | 深夜影院一级毛片 | 欧美影院一区 | 性欧美大战久久久久久久野外 | 精品视频在线观看视频免费视频 | 免费一区二区 | 国产精品久久久久影院色老大 | 1024手机看片日韩 | freesexvideo性残疾 | 精品久久久久久 | 久久99国产精品久久99 | 四虎精品成在线播放 | 久久综合九九亚洲一区 | 天天在线天天在线天天影视 | 国产精品福利在线观看免费不卡 | 亚洲成成品网站有线 | 狠狠色噜噜 | 色九| 日韩精品在线第一页 | 一色桃子juy774在线播放 | a成人毛片免费观看 | 花怜write. as| 波多野结衣久久国产精品 | 又黄又爽又猛午夜性色播在线播放 | 高清激情小视频在线观看 | 永久看日本大片免费 | 天天操夜夜操美女 | 国产精品色片 | 一级视频在线观看 | 天堂网站| 最新毛片网 | 91成人免费视频 | 俺去啦五月 | 天天躁狠狠躁夜夜躁2021 | 丁香亚洲综合五月天婷婷 | 久久在线播放 | 亚洲综合五月天 | 女a男o肉文 | 日本免费观看完整视频 | 免费边摸边吃奶边叫床视频gif | 四虎院影永久在线观看 |