使用pylink訪問SEGGER RTT

關(guān)于SEGGER RTT

具體的描述還是看官網(wǎng)的介紹吧,點(diǎn)這里仅仆。一般只用來輸出調(diào)試日志,偶爾也需要通過它來配置一些參數(shù)蛔糯。雖然segger官方提供了RTT Viewer來查看輸出數(shù)據(jù),也可以發(fā)送數(shù)據(jù)窖式,類似于精簡版的串口調(diào)試助手蚁飒,但畢竟過于簡單。某些場景萝喘,比如生產(chǎn)測試工具淮逻,還是差了不少。本文主要是通過一個例子說明如何訪問RTT阁簸,從而開發(fā)自己需要工具爬早。

關(guān)于pylink

pylink是一個用python寫的jlink操作庫。通過這個庫强窖,可以很方便的通過jlink訪問目標(biāo)芯片凸椿,從而實(shí)現(xiàn)自己的想法。這個庫的安裝翅溺、使用方法脑漫,點(diǎn)這里

訪問RTT的例子

這個例子通過將寫入的數(shù)據(jù)讀回來說明如何訪問RTT咙崎,這個是需要芯片端程序支持的优幸,固件需要將down buffer里的數(shù)據(jù)寫到up buffer。

import pylink

jlink = pylink.JLink()
jlink.open()
jlink.set_tif(pylink.enums.JLinkInterfaces.SWD) 
jlink.connect('AMAPH1KK-KBR') 

jlink.rtt_start()

print('Please enter rtt write data and click ENTER:')
writedata = input()
jlink.rtt_write(0, [ord(x) for x in list(writedata)])

print()
print('Echo data:')
readdata = ''.join([chr(x) for x in jlink.rtt_read(0, len(writedata))])
print(readdata)

jlink.rtt_stop()

jlink.close()

步驟說明:

  • 1褪猛、先open网杆,連接上jlink;
  • 2伊滋、設(shè)置連接目標(biāo)芯片的接口碳却,一般是SWD,如果缺少這一步笑旺,連接目標(biāo)芯片時很容易失斨缙帧;
  • 3筒主、通過名字連接目標(biāo)芯片关噪,這個名字可以在jlink的工具里找到,比如
  • 4乌妙、操作RTT前使兔,需要使用rtt_start開啟RTT,不開啟的話藤韵,后續(xù)對RTT的操作都是無效的虐沥;
  • 5、通過rtt_write將需要的數(shù)據(jù)寫入RTT泽艘,第一個參數(shù)是RTT的down buffer的索引置蜀,第二參數(shù)就是要寫的數(shù)據(jù)奈搜,單次寫的數(shù)據(jù)量取決于下位機(jī)中down buffer的最大值。這部分設(shè)置是在芯片程序上配置的盯荤,默認(rèn)是有3個down buffer馋吗,最大16個bytes;
    這里著重講一下[ord(x) for x in list(writedata)]
    • (1)秋秤、list(writedata)是將要發(fā)送的數(shù)據(jù)轉(zhuǎn)成列表宏粤,比如發(fā)送數(shù)據(jù)為"test",那就轉(zhuǎn)為['t', 'e', 's', 't']灼卢∩馨ィ可以把這個看作C語言的數(shù)組,每個元素就是一個byte鞋真,所以['test']是會報(bào)錯的崇堰;
    • (2)、[ord(x) for x in list(writedata)]將前面列表中的每個元素轉(zhuǎn)為對應(yīng)的ascii碼涩咖,[116, 101, 115, 116]海诲,直接寫['t', 'e', 's', 't']是會報(bào)錯的;
    • (3)檩互、因?yàn)?code>rtt_write第二個參數(shù)要求是一個列表特幔,所以帶了[]
  • 6闸昨、通過rtt_read讀取RTT中的數(shù)據(jù)蚯斯,第一個參數(shù)是up buffer的索引,第二個參數(shù)是要讀回來的數(shù)據(jù)量饵较,如果buffer中的數(shù)據(jù)小于這個值拍嵌,那就讀完回來了。''.join([chr(x) for x in jlink.rtt_read(0, len(writedata))])的操作正好跟上一步的寫數(shù)據(jù)相反循诉,[chr(x) for x in jlink.rtt_read(0, len(writedata))]將讀到的數(shù)據(jù)轉(zhuǎn)為字符横辆,再通過''.join將字符拼接為字符串。
  • 7打洼、操作結(jié)束后,通過rtt_stop停止RTT逆粹;
  • 8募疮、最后通過close斷開與jlink的連接,同時也斷開了與目標(biāo)芯片的連接僻弹。
讀寫接口

前面的例子可以看到阿浓,pylink提供的讀寫接口只是單純的讀寫數(shù)據(jù),需要我們自己進(jìn)行字符串到列表或者列表到字符串的轉(zhuǎn)換蹋绽。下面是自己封裝的讀寫接口芭毙,其中BUFFER_SIZE_UP需要根據(jù)自己的實(shí)際情況定義筋蓖。

def RTT_write_string(link, string, end=b'\r\n'):
    """寫字符串到RTT down buffer
    Args:
        link: the ``JLink`` instance
        string: 待寫入的字符串
        end: 字符串的結(jié)尾,默認(rèn)使用windows格式退敦,可選項(xiàng)
    Returns:
        成功寫入的字節(jié)數(shù)
    """
    writedata = list(bytearray(string, "utf-8") + end)
    writeindex = 0
    bytes_written = 0
    try:
        if link.target_connected():
            while writeindex < len(writedata):
                bytes_written = link.rtt_write(0, writedata[writeindex:])
                writeindex = writeindex + bytes_written
                time.sleep(0.03)
        return bytes_written
    except pylink.errors.JLinkException:
        return -1


def RTT_read_string(link):
    """從RTT up buffer讀取字符串
    Args:
        link: the ``JLink`` instance

    Returns:
        讀到的字符串
    """
    try:
        if link.target_connected():
            readdata = link.rtt_read(0, BUFFER_SIZE_UP)
            if len(readdata) > 0:
                readdata = ''.join(map(chr, readdata))
        else:
            readdata = []
    except pylink.errors.JLinkException:
        readdata = []
        pass

    return readdata
其它

pylink要求jlink的驅(qū)動版本>= 6.0b粘咖,該版本的jlink SDK原生提供了RTT的訪問。如果使用5.xx或者更低版本的驅(qū)動侈百,可以通過在內(nèi)存中搜索_SEGGER_RTT并解析它瓮下,從而實(shí)現(xiàn)RTT的操作。這里分享一個例子钝域。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讽坏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子例证,更是在濱河造成了極大的恐慌路呜,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件织咧,死亡現(xiàn)場離奇詭異胀葱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)烦感,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門巡社,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人手趣,你說我怎么就攤上這事晌该。” “怎么了绿渣?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵朝群,是天一觀的道長。 經(jīng)常有香客問我中符,道長姜胖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任淀散,我火速辦了婚禮右莱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘档插。我一直安慰自己慢蜓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布郭膛。 她就那樣靜靜地躺著晨抡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耘柱,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天如捅,我揣著相機(jī)與錄音,去河邊找鬼调煎。 笑死镜遣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的汛蝙。 我是一名探鬼主播烈涮,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窖剑!你這毒婦竟也來了坚洽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤西土,失蹤者是張志新(化名)和其女友劉穎讶舰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體需了,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跳昼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肋乍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹅颊。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖墓造,靈堂內(nèi)的尸體忽然破棺而出堪伍,到底是詐尸還是另有隱情,我是刑警寧澤觅闽,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布帝雇,位于F島的核電站,受9級特大地震影響蛉拙,放射性物質(zhì)發(fā)生泄漏尸闸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一孕锄、第九天 我趴在偏房一處隱蔽的房頂上張望吮廉。 院中可真熱鬧,春花似錦畸肆、人聲如沸丁稀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沛贪。三九已至逞盆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間把将,已是汗流浹背焰枢。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留徽级,地道東北人气破。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像餐抢,于是被迫代替她去往敵國和親现使。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359