<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          讓你的嵌入式應(yīng)用快速集成RTT

          共 4463字,需瀏覽 9分鐘

           ·

          2024-04-03 01:19

             
              關(guān)注、星標(biāo)公眾號,直達精彩內(nèi)容
          來源 | 網(wǎng)絡(luò)

          RTT是一項新技術(shù),可以在嵌入式應(yīng)用中進行用戶IO交互。

          rtt-target是RTT(實時傳輸)I/O協(xié)議的目標(biāo)端實現(xiàn),RTT使用內(nèi)存環(huán)形緩沖區(qū)和內(nèi)存輪詢來實現(xiàn)調(diào)試探針的輸入和輸出。這使得能夠以最小的延遲和無阻塞的方式從微控制器進行調(diào)試日志記錄,使其即使在不能容忍半托管延遲的實時應(yīng)用中也可用。


          硬件支持


          該crate與平臺無關(guān),可以在任何支持通過其調(diào)試接口訪問后臺內(nèi)存的芯片上使用。打印宏是一個依賴于平臺的關(guān)鍵部分。可通過“Cortex-M”功能啟用內(nèi)置ARM Cortex-M支持,或通過“riscv”功能啟用RISC-V支持。


          要從主機使用RTT接口,需要調(diào)試探針,如ST鏈路或J-Link。正常的調(diào)試協(xié)議(例如SWD)用于訪問RTT,因此不需要額外的連接,例如SWO引腳。


          初始化


          RTT必須在程序開始時使用其中一個init宏進行初始化。有關(guān)詳細(xì)信息,請參見宏。


          初始化宏返回可用于寫入和讀取的通道對象。不同的通道對象可以安全地在不同的上下文中同時使用,而無需鎖定。在具有實時約束的基于中斷的應(yīng)用程序中,您可以為每個中斷上下文使用一個單獨的通道,以實現(xiàn)無鎖定日志記錄。


          通道和虛擬終端


          RTT支持雙向多個通道。上行通道從目標(biāo)到主機,下行通道從主機到目標(biāo)。每個通道都通過其方向和編號進行識別。


          按照慣例,通道0是為終端使用而保留的。在上行方向上,存在一組轉(zhuǎn)義序列,其進一步使得單個信道能夠被視為多達16個虛擬終端。這可以用于將不同類型的消息(例如,日志級別)彼此分離,而不必為多個緩沖區(qū)分配內(nèi)存。不利的一面是,即使使用不同的虛擬終端號,多個線程也無法同時寫入同一通道,因此訪問必須同步。下行通道0通常用于鍵盤輸入。


          注意:某些主機端程序默認(rèn)情況下只顯示通道0,因此要查看其他通道,您可能需要對其進行適當(dāng)配置。


          其他通道可以用于在不鎖定的情況下實現(xiàn)來自多個源的并發(fā)使用,或者用于在任一方向上發(fā)送例如二進制數(shù)據(jù)。


          通道0也可以用于任意數(shù)據(jù),但大多數(shù)工具都希望它是純文本。


          通道模式


          默認(rèn)情況下,通道以NoBlockSkip模式啟動,如果緩沖區(qū)已滿,則會丟棄數(shù)據(jù)。這使RTT在沒有連接調(diào)試探針或主機沒有讀取緩沖區(qū)時不會使應(yīng)用程序崩潰。但是,如果應(yīng)用程序的輸出速度快于主機的讀取速度(這很容易做到,因為寫入速度非常快),那么消息就會丟失。如果需要,可以將通道設(shè)置為阻塞模式,但是在這種情況下,如果沒有附加調(diào)試器,則當(dāng)緩沖區(qū)填滿時,應(yīng)用程序可能會凍結(jié)。


          通道模式也可以通過調(diào)試探針隨時更改。因此,在微控制器代碼中使用非阻塞模式,并在調(diào)試時根據(jù)需要設(shè)置阻塞模式可能是有利的。這樣,在沒有連接調(diào)試器的情況下,應(yīng)用程序?qū)⒂肋h不會凍結(jié)。


          打印


          為了方便輸出,提供了rprint和rprintln宏。它們使用在初始化時定義的單個下行通道和用于同步的關(guān)鍵部分,因此它們的工作方式與標(biāo)準(zhǔn)的println樣式宏完全相同。它們可以在任何上下文中使用。rtt_init_print宏提供初始化通道0上的打印功能。


          use rtt_target::{rtt_init_print, rprintln};

          fn main() -> ! { rtt_init_print!(); loop { rprintln!("Hello, world!"); }}


          調(diào)試


          要僅在調(diào)試構(gòu)建中使用rtt功能,請使用前綴為debug_*的宏。它們的功能與不進行調(diào)試的功能完全相同——唯一的區(qū)別是,當(dāng)使用--release構(gòu)建時,它們會被刪除。即使rtt是用rt_init而不是debug_rtt_init初始化的,也可以使用debug_rprintln和debug_rprint。


          在后臺,它使用[debug-assertions]標(biāo)志。將此標(biāo)志設(shè)置為true可將所有調(diào)試宏也包括在發(fā)布模式中。


          use rtt_target::{debug_rtt_init_print, debug_rprintln};

          fn main() -> ! { debug_rtt_init_print!(); // nop in --release loop { debug_rprintln!("Hello, world!"); // not present in --release }}


          宏還支持?jǐn)U展語法以打印到不同的RTT虛擬終端。


          請注意,由于使用了關(guān)鍵部分,打印到阻塞通道將導(dǎo)致應(yīng)用程序在緩沖區(qū)滿時阻塞和凍結(jié)。


          讀取


          以下示例顯示了如何設(shè)置RTT以讀取從主機發(fā)送到目標(biāo)的簡單輸入。


          use rtt_target::{rtt_init_default, rprintln};

          fn main() -> ! { let mode = loop { read = channels.down.0.read(&mut read_buf); for i in 0..read { match read_buf[i] as char { '0' => break 0, '1' => break 1, _ => {} } } };}

          默認(rèn)情況下,examples-cortex-m和panic測試板條箱附帶了古老的STM32F103C8xx的構(gòu)建文件,但可以很容易地適用于其它芯片,因為它們只包含最小的特定于平臺的運行時代碼,以便運行main函數(shù)。更多內(nèi)容請查看項目。


          Github地址:https://github.com/probe-rs/rtt-target


          ?
          版權(quán)聲明:本文來源網(wǎng)絡(luò),免費傳達知識,版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請聯(lián)系我進行刪除。

          ????????????????  END  ???????????????

               

          關(guān)注我的微信公眾號,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。

               

          點擊“閱讀原文”查看更多分享,歡迎點分享、收藏、點贊、在看。

          瀏覽 26
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  av噜噜国产在线观看 | 91天天爱天天射天天干天天 | 草逼国产| 日本网站在线播放 | 亚洲狼人综合网 |