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

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

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

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

sanyue7758 ? 來(lái)源:處芯積律 ? 2023-04-21 09:33 ? 次閱讀

學(xué)過(guò)C語(yǔ)言都知道,在程序中添加打印信息有助于我們追蹤程序執(zhí)行的情況。特別是debug的時(shí)候,打印一些log信息對(duì)快速定位到問(wèn)題非常有幫助。

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

我們來(lái)試一下:

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

執(zhí)行結(jié)果:

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

沒(méi)有出現(xiàn) Hello world。這種結(jié)果是符合預(yù)期的。C code 通過(guò)GCC編譯生成bin文件然后送到CPU中按指令進(jìn)行執(zhí)行。我們看下這段代碼編譯出來(lái)的指令是什么?

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

這里 printf 編譯出來(lái)是jump到一個(gè)puts的函數(shù)里面。puts函數(shù)又是什么呢?

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

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

如何實(shí)現(xiàn)打印?

兩個(gè)思路,第一個(gè)思路,在SOC的TB里面增加一個(gè)CPU bus的monitor,我們?cè)趍onitor中實(shí)現(xiàn)一個(gè)功能,當(dāng)看到特定地址,特定數(shù)據(jù)的時(shí)候,開(kāi)始收集要打印的字符串,當(dāng)看到特定地址,另外一個(gè)特定數(shù)據(jù)的時(shí)候,結(jié)束字符串的收集,并將收集到字符串打印。

以下是我們?cè)谝粋€(gè)project中看到特殊數(shù)據(jù) 24’hdddd_11xx 開(kāi)始收集字符串。

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

以下是我們?cè)谝粋€(gè)project中看到特殊數(shù)據(jù)24’hdddd_eeee 時(shí)打印字符串。

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

這樣,我們可以在c里面實(shí)現(xiàn)一個(gè)打印字符串的函數(shù)。

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

通過(guò)上面這種手段,我們巧妙的將C語(yǔ)言的打印和 verilog的$display 打印連接起來(lái)。我們來(lái)看看效果

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

Hello World 打印出來(lái)了。

我們?cè)倏纯?puts編譯后的代碼是什么?

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

這次 puts并沒(méi)有跳轉(zhuǎn)到_puts_r ,而是向特定地址發(fā)送特定數(shù)據(jù)表示開(kāi)始,然后傳輸字符串,并以特定數(shù)據(jù)結(jié)束。當(dāng)我們的monitor檢查到這些特殊的數(shù)據(jù)時(shí)就會(huì)打印出log信息。

上面打印的方式可以解決在SOC驗(yàn)證環(huán)境中打印字符串的問(wèn)題,但是在芯片流片回來(lái)之后,在C中調(diào)用上述函數(shù)還能打印嗎?顯然是不可以的,因?yàn)檫@個(gè)時(shí)候外部的monitor都沒(méi)有了,更別說(shuō)不能綜合的display函數(shù)等。

下面介紹一種更加普遍的使用方法。我們?cè)?a href="http://www.ttokpm.com/soft/data/21-22/" target="_blank">嵌入式硬件開(kāi)發(fā)的過(guò)程中經(jīng)常用到串口調(diào)試工具。

通過(guò)簡(jiǎn)單的幾根線與電腦連接,然后用串口調(diào)試助手就能將SOC和電腦調(diào)試界面連接起來(lái)。

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

因此在我們SOC驗(yàn)證環(huán)境中集成UART的slave device,在UART device收到數(shù)據(jù)后,打印出字符串信息是一個(gè)很好的選擇。

為此,我們通過(guò)向uart device寫字符串的形式,然后在UART device中實(shí)現(xiàn)打印功能。

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

我們來(lái)測(cè)試下用上面這種方式打印的效果,prints 是我們向uart 發(fā)送字符串的函數(shù)。

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

下面是執(zhí)行效果

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

同樣實(shí)現(xiàn)了打印,而且這種打印方式在后續(xù)芯片流片回來(lái)之后可以通過(guò)串口調(diào)試 查看打印的信息。

看到這里,大家明白怎么在SOC中實(shí)現(xiàn)字符串打印了吧。





審核編輯:劉清

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

    關(guān)注

    1

    文章

    147

    瀏覽量

    18718
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134152
  • gcc編譯器
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

    3297
  • Printf
    +關(guān)注

    關(guān)注

    0

    文章

    81

    瀏覽量

    13564

原文標(biāo)題:SOC驗(yàn)證C代碼中如何打印字符串?

文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C++字符串string

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

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

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

    想實(shí)現(xiàn)字符串a復(fù)制到b,然后打印字符串b,程序錯(cuò)在哪...

    想實(shí)現(xiàn)字符串a復(fù)制到b,然后打印字符串b,程序錯(cuò)在哪!!!
    發(fā)表于 12-22 21:11

    c語(yǔ)言中如何把字符串的ASCII碼通過(guò)printf函數(shù)打印字符串

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

    如何通過(guò)藍(lán)牙設(shè)備串行打印字符串?

    如何通過(guò)藍(lán)牙設(shè)備串行打印字符串,只有UARTPTCHAR選項(xiàng)。條件-我正在通過(guò)UART向藍(lán)牙設(shè)備發(fā)送一個(gè)單詞。同時(shí),我希望從藍(lán)牙設(shè)備接收一個(gè)連續(xù)的字符串[大小n],而不會(huì)中斷傳輸數(shù)據(jù)。我PSUC上
    發(fā)表于 10-09 09:13

    怎樣將stm32口格式化打印字符串的函數(shù)進(jìn)行封裝

    怎樣將stm32口格式化打印字符串的函數(shù)進(jìn)行封裝
    發(fā)表于 11-26 06:38

    怎樣printf()函數(shù)實(shí)現(xiàn)通過(guò)串口打印信息

    怎樣printf()函數(shù)實(shí)現(xiàn)通過(guò)串口打印信息?如何實(shí)現(xiàn)printf()函數(shù)打印字符串重定義到
    發(fā)表于 11-30 07:27

    怎樣使用printf函數(shù)將字符串打印到串口

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

    C語(yǔ)言入門教程-字符串須知

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

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

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

    如何使用printf函數(shù)將字符串打印到串口

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

    C語(yǔ)言總結(jié)_字符串函數(shù)封裝練習(xí)

    字符串函數(shù)重寫練習(xí):字符串比較、字符串拼接、字符串查找、字符串拷貝、內(nèi)存比較、內(nèi)存拷貝、內(nèi)存初始化、內(nèi)存比較、二維數(shù)組定義及基本使用、位運(yùn)算
    的頭像 發(fā)表于 08-14 09:42 ?891次閱讀

    C語(yǔ)言字符串的引用方式

    C語(yǔ)言程序,字符串是存放在字符數(shù)組的。 2. 用字符
    的頭像 發(fā)表于 03-10 14:57 ?1697次閱讀

    c語(yǔ)言字符串定義

    C語(yǔ)言是一種強(qiáng)大而廣泛使用的編程語(yǔ)言,字符串是其中一個(gè)非常重要的概念。C語(yǔ)言中,字符串是由一系列字符
    的頭像 發(fā)表于 11-24 10:02 ?1428次閱讀

    c語(yǔ)言怎么scanf輸入字符串

    C語(yǔ)言中,我們可以使用scanf函數(shù)來(lái)接收用戶的輸入。scanf函數(shù)有很多種用法,其中一種用法就是用來(lái)接收字符串。 要接收字符串,我們可以使用"%s"格式說(shuō)明符。下面是一個(gè)簡(jiǎn)單的示例
    的頭像 發(fā)表于 11-24 10:03 ?1858次閱讀