一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲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)不再提示

MDK下99%用戶都不知道的萬能printf方法

安芯教育科技 ? 來源:裸機(jī)思維 ? 2023-04-12 10:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本篇將介紹MDK下99%用戶都不知道的萬能printf方法。

一、說在前面的話

你聽說過J-Link的RTT么?官方的宣傳是這樣的:

63c967e4-d8d7-11ed-bfe3-dac502259ad0.jpg

簡(jiǎn)單來說,只要擁有了J-Link,你就可以享受以下的便利:

無需占用USART或者USB轉(zhuǎn)串口工具,將printf重定位到一個(gè)由J-LINK提供的虛擬串口上;

支持任何J-LINK聲稱支持的芯片

高速通信,不影響芯片的實(shí)時(shí)響應(yīng)

它的缺點(diǎn)也是明顯的:

你必須擁有一個(gè)J-Link,如果你使用的是 CMSIS-DAP或者ST-Link之類的第三方調(diào)試工具,就無法享受這一福利;

你必須在工程中手動(dòng)插入一段代碼

曾幾何時(shí),J-Link的這一福利讓多少非J-Link用戶羨慕嫉妒恨,看看手中的ST-Link、ULINKpro和各類廉價(jià)的CMSIS-DAP板載調(diào)試器——“隔壁鄰居的小孩都饞哭了”

如果我告訴你,其實(shí)MDK中內(nèi)置了一種非常簡(jiǎn)單廉價(jià)的方式,可以讓你實(shí)現(xiàn)類似的功能,并具有以下特點(diǎn):

支持所有的調(diào)試仿真器,哪怕自己手搓的CMSIS-DAP都行

MDK原生功能,連CMSIS-Pack都不用安裝

點(diǎn)幾下鼠標(biāo)就可以通過RTE完成部署

除了簡(jiǎn)單的初始化函數(shù)外,無需手動(dòng)插入代碼

可以將你的printf輸出直接打印在MDK的Debug (printf) View窗口中

你是否心動(dòng)了呢?

二、部署從未如此簡(jiǎn)單

2.1RTE配置

依次通過菜單 Project->Manage->Run-Time Environment 打開RTE配置窗口:

64312050-d8d7-11ed-bfe3-dac502259ad0.jpg

找到并展開Compiler選項(xiàng)卡,勾選Event Recorder,并確保Variant下拉列表選中的是默認(rèn)的DAP。

644b642e-d8d7-11ed-bfe3-dac502259ad0.jpg

展開Compiler下的I/O,勾選STDOUT,并在Variant下拉列表中選擇 EVR——這里EVR是Event Recorder的縮寫。單擊確定后,我們會(huì)在工程管理器中看到以下的內(nèi)容:

64735330-d8d7-11ed-bfe3-dac502259ad0.jpg

至此,所需的工具都已經(jīng)成功地加入到工程中了。

雖然這里EventRecorderConf.h是一個(gè)可以編輯的狀態(tài),但實(shí)踐中,我們基本不用去碰他——使用默認(rèn)配置即可。

2.2服務(wù)初始化

在包含main()函數(shù)的C代碼文件中,按照如下的格式添加對(duì)頭文件的包含:

#include 
#if defined(RTE_Compiler_EventRecorder)
#   include 
#endif

在main()函數(shù)中添加對(duì)EventRecorder服務(wù)的初始化:

void main(void)
{
    ...
#if defined(RTE_Compiler_EventRecorder) 
 && defined(RTE_Compiler_IO_STDOUT_EVR)
    EventRecorderInitialize(0, 1);
#endif
    ...
}

如果你從未使用過EventRecorder也不必驚慌,這段代碼的主要作用是為printf專門開啟一個(gè)數(shù)據(jù)通道。

理論上,到這里,我們就已經(jīng)完成了部署,可以在進(jìn)入調(diào)試模式后,通過MDK的Debug (printf) View窗口來觀察printf的輸出結(jié)果了。比如,我們?cè)趍ain()函數(shù)中打印一個(gè) "hello world ":

#include 

#include 
#if defined(RTE_Compiler_EventRecorder)
#   include 
#endif

void main(void)
{
    ...
#if defined(RTE_Compiler_EventRecorder) 
 && defined(RTE_Compiler_IO_STDOUT_EVR)
    EventRecorderInitialize(0, 1);
#endif
    ...

    printf("Hello World
");
    ...
}

編譯,一切順利的話,進(jìn)入調(diào)試模式后通過菜單View->Serial Windows->Debug (printf) View打開窗口:

648ae8ba-d8d7-11ed-bfe3-dac502259ad0.jpg

運(yùn)行后,可以在Debug (printf) View窗口中看到如下的結(jié)果:

三、常見問題

如果你的工程中從未提供過對(duì) ".bss.noinit"數(shù)據(jù)段的處理,那么很可能會(huì)發(fā)現(xiàn)通過上述方法實(shí)現(xiàn)的printf輸出似乎不是很穩(wěn)定——時(shí)有時(shí)無——處于一種薛定諤的狀態(tài)。

這是由于EventRecorder有一段數(shù)據(jù)放置在了 “.bss.noinit” section中——以求芯片復(fù)位后不會(huì)破壞其中原有的內(nèi)容。

如果你的工程沒有專門針對(duì) “.bss.noinit” 的處理,那么就會(huì)在進(jìn)入調(diào)試模式后,從Command窗口中看到類似如下的信息:

64c850ec-d8d7-11ed-bfe3-dac502259ad0.jpg

即:

Warning: Event Recorder not located in uninitialized memory!

如果遇到這種情況應(yīng)該怎么辦呢?

打開工程配置窗口“Options for Target”,切換到“Linker”選項(xiàng)卡:

64dc63e8-d8d7-11ed-bfe3-dac502259ad0.jpg

首先,一定要確保你勾選了圖中的“Use Memory Layout from Target Dialog”選項(xiàng)。在這一前提下,再次取消對(duì)它的勾選:

64eec3f8-d8d7-11ed-bfe3-dac502259ad0.jpg

我們會(huì)看到,MDK基于當(dāng)前的Memory Layout,為我們?cè)贠ut目錄下生成了一個(gè)與工程同名的鏈接腳本(比如圖中的工程名叫example,因此生成的鏈接腳本為example.sct)。

單擊Edit按鈕,可以看到腳本的內(nèi)容:

65003e8a-d8d7-11ed-bfe3-dac502259ad0.jpg

先別著急半路開香檳——該文件是系統(tǒng)自動(dòng)生成的,如果我們不移動(dòng)它的位置,那么只要哪次手抖勾選了“Use Memory Layout from Target Dialog”,它的內(nèi)容就會(huì)立即被覆蓋掉——意味著我們?cè)诤罄m(xù)步驟中所做的修改就會(huì)付諸東流。

為了避免該問題,應(yīng)該將它從Object目錄中移動(dòng)到工程目錄下。具體步驟為:右鍵單擊腳本文件名:

653b570e-d8d7-11ed-bfe3-dac502259ad0.jpg

選擇“Open Container Folder”來打開文件所在目錄:

655d868a-d8d7-11ed-bfe3-dac502259ad0.jpg

找到Scatter Script腳本文件后,將其拷貝到上一級(jí)目錄下(也就是工程目錄):

657a52e2-d8d7-11ed-bfe3-dac502259ad0.jpg

重新打開工程配置窗口:

6590af24-d8d7-11ed-bfe3-dac502259ad0.jpg

確保我們“沒有”選中“Use Memory Layout from Target Dialog”選項(xiàng),并在Scatter File文本框中直接填寫我們剛剛拷貝出來的腳本文件名(由于我們直接放在工程目錄下,因此這里直接用相對(duì)路徑"./example.scat"或者"example.scat"就行)。單擊OK保存配置。

打開example.sct,在RW_IRAM1后面追加如下的代碼:

        ZI_RAM_UNINIT +0 UNINIT {
        .ANY (.bss.noinit)
    }

效果大約類似這樣:

65a42838-d8d7-11ed-bfe3-dac502259ad0.jpg

保存后重新編譯,再次進(jìn)入 Debug 模式,問題就應(yīng)該解決了。

這里步驟的核心思想是在scatter script內(nèi)緊接著為RW和ZI的execution region為.bss.noinit提供一個(gè)屬性為UNINIT的專屬execution region。

在領(lǐng)會(huì)精神的情況下,如果你的工程原本就使用了scatter script也可以如法炮制。俗話說解鈴還須系鈴人,如果你還是不知道怎么處理,那么就去找 你工程中scatter script的作者吧。

值得強(qiáng)調(diào)的是:如果你的MDK版本太老,為了確保最佳的用戶體驗(yàn),還是推薦盡快升級(jí)吧。您可以在關(guān)注【裸機(jī)思維】公眾號(hào)后發(fā)送關(guān)鍵字【MDK】來獲取其最新的網(wǎng)盤鏈接。

四、說在后面的話

總的來說,MDK通過EventRecorder為我們提供了一個(gè)通用便捷的方式來重定向printf——無論你使用什么調(diào)試仿真器,甚至是FVP,都可以享受來自“MDK”的陽光普照。

對(duì)很多有分發(fā)自己工程作為模板的小伙伴來說,使用該方法后將不再限制用戶必須使用J-Link之類的工具,而是可以放開手腳,獲得了“開袋即食”的調(diào)試體驗(yàn)。

最后強(qiáng)調(diào)一下哦,EventRecorder只在調(diào)試階段有意義,如果我們需要在產(chǎn)品的正常工作模式下使用printf,還是老老實(shí)實(shí)把Compiler->IO->STDOUT配置為User:

65c2b4c4-d8d7-11ed-bfe3-dac502259ad0.jpg

實(shí)現(xiàn)stdout_putchar()函數(shù)——用它來發(fā)送字符到具體的外設(shè)吧,比如:

int stdout_putchar(int ch)
{
    if ('
' == ch) {
        int temp = '
';
        while(Driver_USART0.Send(&temp, 1) != ARM_DRIVER_OK);
    }
    
    if (Driver_USART0.Send(&ch, 1) == ARM_DRIVER_OK) {
        return ch;
    }
    
    return -1;
}

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    8158

    瀏覽量

    271699
  • 串口
    +關(guān)注

    關(guān)注

    15

    文章

    1586

    瀏覽量

    79562
  • MDK
    MDK
    +關(guān)注

    關(guān)注

    4

    文章

    211

    瀏覽量

    32590
  • J-Link
    +關(guān)注

    關(guān)注

    0

    文章

    88

    瀏覽量

    22667
  • Printf
    +關(guān)注

    關(guān)注

    0

    文章

    84

    瀏覽量

    14180

原文標(biāo)題:MDK下99%用戶都不知道的萬能printf方法

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    要學(xué)習(xí)protel了,不知道該學(xué)習(xí)是99還是***,更不知道在哪里找

    要學(xué)習(xí)protel了,不知道該學(xué)習(xí)是99還是***,更不知道在哪里找到適合win7的版本,高手 大蝦幫忙啊
    發(fā)表于 03-15 02:07

    電子萬能試驗(yàn)機(jī)與液壓萬能試驗(yàn)機(jī)的區(qū)別

    ,而紅山出來的試驗(yàn)機(jī)廠家多采用減速機(jī)。關(guān)于其優(yōu)缺點(diǎn),還有待探討,但都不影響用戶使用。在測(cè)力上電子萬能試驗(yàn)機(jī)均采用負(fù)荷 傳感器?! ∫簤?b class='flag-5'>萬能材料試驗(yàn)機(jī),采用高壓液壓源為動(dòng)力源。采用手動(dòng)閥
    發(fā)表于 07-04 16:06

    MDK99%用戶都不知道萬能printf方法

    提供一個(gè)屬性為UNINIT的專屬execution region?! ≡陬I(lǐng)會(huì)精神的情況,如果你的工程原本就使用了scatter script也可以如法炮制。俗話說解鈴還須系鈴人,如果你還是不知道
    發(fā)表于 03-21 11:57

    winxp萬能聲卡驅(qū)動(dòng),程序下載

    winxp萬能聲卡驅(qū)動(dòng) 尊敬的用戶,本萬能驅(qū)
    發(fā)表于 04-21 19:23 ?538次下載
    winxp<b class='flag-5'>萬能</b>聲卡驅(qū)動(dòng),程序下載

    xpu盤萬能驅(qū)動(dòng),下載

    xpu盤萬能驅(qū)動(dòng)下載
    發(fā)表于 04-30 15:07 ?230次下載
    xp<b class='flag-5'>下</b>u盤<b class='flag-5'>萬能</b>驅(qū)動(dòng),下載

    萬能空調(diào)遙控器操作使用方法

    萬能空調(diào)遙控器操作使用方法
    發(fā)表于 08-01 15:24 ?4.4w次閱讀
    <b class='flag-5'>萬能</b>空調(diào)遙控器操作使用<b class='flag-5'>方法</b>

    萬能電視遙控器使用方法

    萬能電視遙控器使用方法 常用的萬能遙控器有眾合、科朗等,一般設(shè)置編碼有以下兩種方式:1、不需要對(duì)
    發(fā)表于 08-01 16:38 ?8.5w次閱讀

    不知道電動(dòng)車電池的型號(hào)怎么辦?

    不知道電動(dòng)車電池的型號(hào)怎么辦?  近一年來給很多人換過電動(dòng)車電池了,我發(fā)現(xiàn)大多數(shù)人都不知道自己的電動(dòng)車電池是什么型號(hào)的,
    發(fā)表于 11-11 08:56 ?3565次閱讀

    萬能遙控器設(shè)置方法_萬能遙控器代碼

    電視是每個(gè)家庭必不可少的家用電器,所以我們?cè)谑褂眠b控器的時(shí)間也會(huì)比較多。但如果遙控器換了怎么辦,很多人都會(huì)想到配一個(gè)萬能遙控器,那么萬能遙控器怎么設(shè)置,它的萬能
    發(fā)表于 09-14 18:08 ?19w次閱讀
    <b class='flag-5'>萬能</b>遙控器設(shè)置<b class='flag-5'>方法</b>_<b class='flag-5'>萬能</b>遙控器代碼

    萬能轉(zhuǎn)換開關(guān)選型_萬能轉(zhuǎn)換開關(guān)使用

    本文主要介紹了萬能轉(zhuǎn)換開關(guān)選型方法萬能轉(zhuǎn)換開關(guān)的使用。
    發(fā)表于 12-09 10:30 ?5045次閱讀

    關(guān)于人工智能的日常應(yīng)用很多人都不知道

    到目前為止,幾乎每個(gè)人都對(duì)人工智能有所了解,但是大多數(shù)人都不是技術(shù)專家,而且許多人可能還不知道人工智能的影響有多大。
    發(fā)表于 12-28 11:27 ?2784次閱讀

    關(guān)于你可能不知道printf

    你可能不知道printf
    的頭像 發(fā)表于 02-05 12:28 ?2929次閱讀
    關(guān)于你可能<b class='flag-5'>不知道</b>的<b class='flag-5'>printf</b>

    怎樣調(diào)整地磅萬能遙控器的四角誤差

    不知道大家在使用地磅萬能遙控器的時(shí)候,出現(xiàn)過一些問題,特別是這種遙控器,它的四角要是出現(xiàn)誤差的話,那就非常不利于對(duì)地磅萬能遙控器的使用。這時(shí),是需要來調(diào)整一遙控器的四角,免得對(duì)遙控器
    發(fā)表于 03-26 11:23 ?3847次閱讀

    萬能材料試驗(yàn)機(jī),如何進(jìn)行整機(jī)檢定?

    ?在前文,試驗(yàn)機(jī)老二給大家分享了萬能材料試驗(yàn)機(jī)的分類、操作步驟和校正方法,不知道各位對(duì)萬能材料試驗(yàn)機(jī)是否有了初步的認(rèn)識(shí)?為了加深各位朋友對(duì)萬能
    的頭像 發(fā)表于 10-16 16:42 ?1191次閱讀
    <b class='flag-5'>萬能</b>材料試驗(yàn)機(jī),如何進(jìn)行整機(jī)檢定?

    萬能遙控器的設(shè)置和使用方法

    萬能遙控器是一種能夠控制不同品牌電器的設(shè)備,它可以將多個(gè)遙控器的功能整合到一個(gè)遙控器上,方便用戶操作。在本文中,我將詳細(xì)介紹萬能遙控器的設(shè)置和使用方法。 設(shè)置
    的頭像 發(fā)表于 01-24 10:57 ?2.1w次閱讀