色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

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

安芯教育科技 ? 來源:裸機思維 ? 2023-04-12 10:21 ? 次閱讀

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

一、說在前面的話

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

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

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

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

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

高速通信,不影響芯片的實時響應

它的缺點也是明顯的:

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

你必須在工程中手動插入一段代碼

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

如果我告訴你,其實MDK中內置了一種非常簡單廉價的方式,可以讓你實現類似的功能,并具有以下特點:

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

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

點幾下鼠標就可以通過RTE完成部署

除了簡單的初始化函數外,無需手動插入代碼

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

你是否心動了呢?

二、部署從未如此簡單

2.1RTE配置

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

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

找到并展開Compiler選項卡,勾選Event Recorder,并確保Variant下拉列表選中的是默認的DAP。

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

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

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

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

雖然這里EventRecorderConf.h是一個可以編輯的狀態,但實踐中,我們基本不用去碰他——使用默認配置即可。

2.2服務初始化

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

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

在main()函數中添加對EventRecorder服務的初始化:

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

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

理論上,到這里,我們就已經完成了部署,可以在進入調試模式后,通過MDK的Debug (printf) View窗口來觀察printf的輸出結果了。比如,我們在main()函數中打印一個 "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
");
    ...
}

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

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

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

三、常見問題

如果你的工程中從未提供過對 ".bss.noinit"數據段的處理,那么很可能會發現通過上述方法實現的printf輸出似乎不是很穩定——時有時無——處于一種薛定諤的狀態。

這是由于EventRecorder有一段數據放置在了 “.bss.noinit” section中——以求芯片復位后不會破壞其中原有的內容。

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

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

即:

Warning: Event Recorder not located in uninitialized memory!

如果遇到這種情況應該怎么辦呢?

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

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

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

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

我們會看到,MDK基于當前的Memory Layout,為我們在Out目錄下生成了一個與工程同名的鏈接腳本(比如圖中的工程名叫example,因此生成的鏈接腳本為example.sct)。

單擊Edit按鈕,可以看到腳本的內容:

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

先別著急半路開香檳——該文件是系統自動生成的,如果我們不移動它的位置,那么只要哪次手抖勾選了“Use Memory Layout from Target Dialog”,它的內容就會立即被覆蓋掉——意味著我們在后續步驟中所做的修改就會付諸東流。

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

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

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

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

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

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

重新打開工程配置窗口:

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

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

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

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

效果大約類似這樣:

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

保存后重新編譯,再次進入 Debug 模式,問題就應該解決了。

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

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

值得強調的是:如果你的MDK版本太老,為了確保最佳的用戶體驗,還是推薦盡快升級吧。您可以在關注【裸機思維】公眾號后發送關鍵字【MDK】來獲取其最新的網盤鏈接。

四、說在后面的話

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

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

最后強調一下哦,EventRecorder只在調試階段有意義,如果我們需要在產品的正常工作模式下使用printf,還是老老實實把Compiler->IO->STDOUT配置為User:

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

實現stdout_putchar()函數——用它來發送字符到具體的外設吧,比如:

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;
}

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

    關注

    60

    文章

    7977

    瀏覽量

    265529
  • 串口
    +關注

    關注

    14

    文章

    1557

    瀏覽量

    76841
  • MDK
    MDK
    +關注

    關注

    4

    文章

    209

    瀏覽量

    32120
  • J-Link
    +關注

    關注

    0

    文章

    84

    瀏覽量

    22173
  • Printf
    +關注

    關注

    0

    文章

    83

    瀏覽量

    13692

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

文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    要學習protel了,不知道該學習是99還是***,更不知道在哪里找

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

    電子萬能試驗機與液壓萬能試驗機的區別

    ,而紅山出來的試驗機廠家多采用減速機。關于其優缺點,還有待探討,但都不影響用戶使用。在測力上電子萬能試驗機均采用負荷 傳感器。  液壓萬能材料試驗機,采用高壓液壓源為動力源。采用手動閥
    發表于 07-04 16:06

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

    提供一個屬性為UNINIT的專屬execution region。  在領會精神的情況,如果你的工程原本就使用了scatter script也可以如法炮制。俗話說解鈴還須系鈴人,如果你還是不知道
    發表于 03-21 11:57

    winxp萬能聲卡驅動,程序下載

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

    xpu盤萬能驅動,下載

    xpu盤萬能驅動下載
    發表于 04-30 15:07 ?230次下載
    xp<b class='flag-5'>下</b>u盤<b class='flag-5'>萬能</b>驅動,下載

    萬能空調遙控器操作使用方法

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

    萬能電視遙控器使用方法

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

    不知道電動車電池的型號怎么辦?

    不知道電動車電池的型號怎么辦?  近一年來給很多人換過電動車電池了,我發現大多數人都不知道自己的電動車電池是什么型號的,
    發表于 11-11 08:56 ?3455次閱讀

    萬能遙控器設置方法_萬能遙控器代碼

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

    萬能轉換開關選型_萬能轉換開關使用

    本文主要介紹了萬能轉換開關選型方法萬能轉換開關的使用。
    發表于 12-09 10:30 ?4444次閱讀

    關于人工智能的日常應用很多人都不知道

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

    關于你可能不知道printf

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

    怎樣調整地磅萬能遙控器的四角誤差

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

    萬能材料試驗機,如何進行整機檢定?

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

    萬能遙控器的設置和使用方法

    萬能遙控器是一種能夠控制不同品牌電器的設備,它可以將多個遙控器的功能整合到一個遙控器上,方便用戶操作。在本文中,我將詳細介紹萬能遙控器的設置和使用方法。 設置
    的頭像 發表于 01-24 10:57 ?1.6w次閱讀
    主站蜘蛛池模板: 全免费A敌肛交毛片免费懂色AV | 4438全国免费观看| 中文无码不卡的岛国片国产片| 超碰 无码 中文字幕| 挤奶门事件完整照片| 日本邪恶全彩工囗囗番海贼王| 无码一区国产欧美在线资源| 2019久久这里只精品热在线观看| 国产精品视频成人| 欧美色图一区二区三区| 怡红院美国分院一区二区| 国产精品手机在线视频| 秋霞电影院兔费理论观频84mb| 孕妇泬出白浆18P| 国产在线精品国自产拍影院午夜| 琪琪午夜福利免费院| 最新国自产拍 高清完整版| 国产一区内射最近更新| 色久悠悠无码偷拍自怕| 999久久久无码国产精蜜柚| 精品无人区麻豆乱码无限制| 午夜福利小视频400| 邓奴的视频IVK| 欧美三级黄色大片| 2018高清国产一区二区三区| 九九电影伦理片| 亚洲AV久久婷婷蜜臀无码不卡| 国产A级毛片久久久久久久| 欧美另类极品videosbest| 最近日本MV字幕免费观看视频| 国内精品久久影视免费| 神马影院午夜理论二| 成人永久免费视频| 日本xxxx69动漫| x69老师x日本| 欧美一区二区日韩一区二区| 97在线视频免费播放| 老司机福利在视频在ae8| 在线视频久久只有精品第一日韩| 黑人巨大交牲老太| 亚洲日本欧美国产在线视|