ag真人平台
  • 13168阅读
  • 60回复

[ARM]玩arm单片机,从此不再用串口调试:首创开发 jlink RTT  ARDUINO库 [复制链接]

上一主题 下一主题
离线huaweiwx
 

发帖
1358
M币
2660
专家
66
粉丝
265
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-12-27
— 本帖被 青柠 设置为精华,作者+3000M币+5专家(2018-12-27) —
        序:许多官方开发板都带有板载调试器,对于没有带板载调试的,也要感谢业余高手,公开了山寨stlink/jlink的技术,能让我们以白菜的价格买鱼翅鲍鱼,更有1元pos也能改个jlink用用,让幸运的坛友有的能手头囤积上百片甚是羡慕;这里我开发了一个通信库,针对 arm 内核,能够在arduino中通过jlink的jtag或swd 口来模拟一个串口 , 在pc端 则使用 jink 提供一个app :jlinkRTT作为终端显示信息;

一  串口调试:
        现在许多调试器如: JLINKV2.1/STLINKV2.1已经 带有usb转串口(CDC),我们调试程序,最常用也是最方便的手段,就是用串口来输出一些信息;这是个在 单片机上的真实串口,通过调试器的usb口在pc上虚拟个串口,再由pc串口终端显示信息,完成整个通信链路;也可以用其他usb转串口来连接单片机。

二 特点:
      1 通用易用,几乎每个单片机都会有个串口(uart),而且无论哪个 arduino 的版本,都是一样用 Serial.begin(boud) 初始化,然后就可以用Serial.print(...)来输出信息了;
      2 除了应用程序输出信息外,开发时我们也可以用串口来输出一些调试信息,并通过一个宏变量控制在发行版(release)屏蔽调试/错误捕捉等信息了,如STM32用 USE_FULL_ASSERT控制,标准c 用 DEBUG/NDEBUG;
      3 大多数mcu都不止一个uart外设, 甚至我们可以用不同的串口来输出不同的信息,标准C输出输入库就支持三个输入输出设备:STDIN,STDOUT,STDERR,还可以重定向到文件;在 C++ 中进一步强化的这部份的功能,一句
     COUT <<  "hello  mydigit" << endl;
     从 mcu 到pc上显示出来,其全部内容和技术细节写本书都说不完;但我们根本不需要去了解这是如何实现的,而且只要知道如何调用其中最基本的那么几个函数来输出我们需要的那些信息就可以了。

三 单片机串口通讯方式:
    1  查询,通过查询串口输入或输出端口的标志来一个一个数据接收或发送,直到完成整个数据的传送;
    2 中断, 串口外设每完成一个数据的接收或发送就产生一个中断,这样mcu 既不要定时查询有无数据到端口,因此不存在丢接受数据的问题,也不需要等待上个数据发送完毕,再取下个数据发送,节约了处理器的时间;
    3 中断+直接存取(DMA),这种方式更快,输出数据时,mcu将数据放入缓冲区,然后由DMA模块负责将其搬运到串口输出;

四 使用uart(usart)的限制和不足:
    1  毕竟要多用两根线 tx/rx,在单片机20脚以下的小片子上,当pin的资源不足时,造成我们要选用拥有更多脚的片子;
    2 串口设置通常需要在系统时钟初始化以后设置,而有时我们想在系统初始化,时钟确立过程中的输出信息包括错误捕捉就不方便了。
    3 甚至有些模块在系统初始化(sysInit)前就需要执行部份初始化,如c++ 类实例副本的建立;此时也是无法使用串口;
    4 如果串口使用中断和dma,则无法在比串口或dma中断更高优先级的中断中使用,这是因为在高级中断中不会触发优先级较低的中断,因此,在诸如:
        HardFault/MemManage/BusFault/UsageFault 这类系统错误中断中想打印错误信息, 需要两条件:一是串口不使用中断/dma方式,而是系统时钟等初始化已经完成;

五  arduino  JlinkRTT  使用:
    1 测试程序:
  1. /*
  2.    jlinkRTT.ino use J-Link RTT Viewer Terminals by huaweiwx@sina.com 2018.11.25
  3.    1 jlinkRTT is pre-define instance of JLINKRTT  class.
  4.    2 Serial communication Menu option selected JlinkRTT to set default Serial use jlnkRTT.
  5.    3 run the JLinkRTTViewer.exe  from the path:C:\Program Files\SEGGER\JLink_V614b\JLinkRTTViewer.exe
  6.    4 at Transmit Text window you can keyin string and click 'Enter' for send
  7. */
  8. #include "JlinkRTT.h"
  9. #define mySerial jlinkRTT
  10. void setup() {
  11.   /put your setup code here, to run once:
  12.   pinMode(LED_BUILTIN, OUTPUT);
  13.   Serial.begin(115200);
  14.   
  15.   /mySerial6c94begin(); /*compatible with Serial , jlinkRTT do nothing */
  16.   setStdPrintDev(&mySerial, STDERR_FILENO); /* debug and error output infomation  redirect from Serial to mySerial */
  17. }
  18. int count = 0;
  19. void loop() {
  20.   Serial.print("This is Serial output! count = ");
  21.   Serial.println(count++);
  22.   mySerial.print("This is jlinkRTT output! count = ");
  23.   mySerial.println(count++);
  24.   
  25.   digitalToggle(LED_BUILTIN);
  26.   delay(1000);
  27. }
   说明:
      10  装入库头文件;以后我将会把该库并入核心部分(core),将可略去该行;
      11  jlnkRTT 是 该库的类定义 JLINKRTT 的 预定义实例,和Serial 一样都是基于stream类型;因此以后用jlinkRTT, 就像用Serial一样,我们用define为它起个别名;反之在所有用到Serial的地方,都可以用jlinkRTT或其别名来替换;
      17 我们仍然可以用begin(115200),就像SerialUSB一样,但这里波特率参数是没有意义的,保留这样的格式和语句是为了重定向的方便,以后只需要修改11行就可以将其他串口信息重定向到调试口,或将调试口信息重定向到其他串口或usb虚拟口, 该行已经注释掉,是因为beging函数内部什么也没干,类实例建立时已经初始化好了,所以可以用在main前甚至systemInit前的任何位置(在arm reset后 首先初始化堆栈,接着就是初始化变量,然后初始化c库和c++lib,然后才是systemInit和main),
      18 在我的arduino版本中为兼容于c/c++ std库,支持三个预定义标准设备STDOUT/STDIN/STDERR,内部缺省这三个设备均是arduino确省输出输入设备:Serial,这个示例仅将标准错误输出设备定向到调试器jlink的RTT观察窗口;但这里不会显示任何信息,这是因为:1 这个简单的示例没有错误发生,所以不会有错误信息;2 是输出错误调试信息只在debug模式,而在release模式,所有参数检查和调试信息代码已经屏蔽,这里只是提前给使用者示例出这个实现方法,以后会详细讨论和说明,你在测试时也可以注释掉这行;
      22~23 向当前缺省串口,输出信息;
      25~26 向jlink RTT 块写信信息;

六   jlink RTT  viewer
      1  我们知道 arm 内核都有个调试模块,该模块通过硬件访问arm全部寄存器和存储器(其实 所有寄存器都映射到一个固定的地址),如果该地址是可写入的,调试器可以写该地址;
      2 工作原理: 应用程序建立一个先进先出(fifo)输出缓冲区, 输出时比较头尾指针,只有缓冲区不满,就写入信息,并修改尾指针;而jink则通过arm 硬件调试模块读取该缓冲区头尾指针看是否有信息,如有则取出信息,并修改头指针; 输入则和输出正好相反;jlink 读取修改这些寄存器/地址的数据是不需要mcu干预的,是由调试模块根据jlink指令独立完成的,和muc并行操作;
      3 从上可见,用调试器进行通信,速度比串口快的多,比 三(3) USART 中断加DMA还快,对mcu来说,写到缓冲区就完成了,既不需要中断,也不需要发送;arm的调试口完全是和内核并行的,读写不占用mcu时间,至于通信速率,则取决于调试器的硬件速率,专业级的可达数百M;即使是我们用stm32F103这样低端山寨jlink也可轻松达到数M速率;

七   jlink RTT  viewer 使用实例:
     1 编译上传该示例程序:
  
2 打开 arduino 串口终端,可以看到22/23行的输出信息:



3 打开 jlinkRTTviewer,并正确选择相关选项:



4 完成设置后点 ok,进入 JLINK RTT Viewer:



5 选择 all terminal  或 terminal  0,这是两个输出窗口的截图:



附加说明:
jlink rtt arduino 库 支持全部 arm ,stm32/efm32/nuvoton 都可以使用,从此开始,用jlink的地方,就可以扔掉 usb转串口线/解放 mcu RX/TX脚,知道无奈的死机 HardFault/MemManage/BusFault/UsageFault 那些非法位置;


注:库代码上传  github 要稍后抽空写个文档后再上传,这里先打包个全部程序源代码:  jlinkRTT.rar
需要解释的是,所谓全部代码也只是arduino lib部分,因此所有其他 arduino官方和非官方移植都不支持,因为还需要内核支持才行,只有在我github的已公开的stm32/efm32/nuvoton arduino才已经增强到内核支持该库!

本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共21条打赏M币+290专家+4
jpdd521 M币 +30 老哥威武! 01-08
zzy_85569381 M币 +13 謝謝分享 01-02
w7767896789 M币 +30 可惜像我这种STM8和32一起用的还是要STlink 01-02
malonger M币 +10 精彩回帖 01-01
dlsys M币 +30 優秀文章 2018-12-31
newnet1234 M币 +20 謝謝分享,優秀文章。似乎是用ARM的调试口取代了UART 2018-12-29
snowrose2000 专家 +1 謝謝分享 2018-12-28
snowrose2000 M币 +13 謝謝分享 2018-12-28
巴闭 M币 +13 - 2018-12-28
zhuqing-1920 M币 +13 虽然不懂,但是感觉很厉害。 2018-12-27
离线nb267213667

发帖
6307
M币
8524
专家
3
粉丝
41
只看该作者 1楼 发表于: 2018-12-27
去年还能亮几个灯,今年全忘了
本帖最近打赏记录:共1条打赏M币+13
huaweiwx M币 +13 arduino 真的方面,一般内容都能找到代码,修改下就可以用; 2018-12-27
离线温力口

发帖
60241
M币
183852
专家
568
粉丝
872
只看该作者 2楼 发表于: 2018-12-27
谢谢分享,ARM玩家的福音。。。。
本帖最近打赏记录:共1条打赏M币+13
huaweiwx M币 +13 希望大家能喜欢。 2018-12-27
离线cao57508

发帖
2238
M币
4271
专家
9
粉丝
81
只看该作者 3楼 发表于: 2018-12-27
auduino 在这里玩的人不多,喜欢玩的,又不愿深入发展,向大神这样执着的玩的人太少了。
本帖最近打赏记录:共1条打赏M币+13
ag真人平台huaweiwx M币 +13 只有深度开发,才能有提高,自我感觉对arm的理解已经差不多了。 2018-12-27
离线2545889167

发帖
13259
M币
21073
专家
301
粉丝
4721
只看该作者 4楼 发表于: 2018-12-27
支持大佬。确实比串口方便太多了
本帖最近打赏记录:共1条打赏M币+20
huaweiwx M币 +20 单片机太好玩了, 弄得像发疯似的,空下来满脑子都是那些代码,本来想玩一个阶段就玩别的了,结果几年了 2018-12-27
离线yiyun2000

发帖
151
M币
58
专家
1
粉丝
3
只看该作者 5楼 发表于: 2018-12-27
Re:玩arm 单片机,从此不再用串口调试:首创开发 jlink RTT  ARDUINO库
佩服楼主,研究的这么透彻,帖子思路顺畅!
本帖最近打赏记录:共1条打赏M币+13
huaweiwx M币 +13 - 2018-12-27
离线huaweiwx

发帖
1358
M币
2660
专家
66
粉丝
265
只看该作者 ag真人平台6楼 发表于: 2018-12-27
回 cao57508 的帖子
cao57508:auduino 在这里玩的人不多,喜欢玩的,又不愿深入发展,向大神这样执着的玩的人太少了。 (2018-12-27 12:10) 回 cao57508 的帖子

自我感觉玩 arduino  arm  一不小心已经玩进国际顶级业余玩家行列了,有些内容搜遍google/github都找不到丁点信息。也是苦恼;
本帖最近打赏记录:共2条打赏M币+10
ag真人平台铁皮屋 M币 +1 给大神跪了,arduino+arm确实有很大潜力啊 2018-12-27
q562379863 M币 +9 给大神跪了,arduino+arm确实有很大潜力啊 2018-12-27
离线huaweiwx

发帖
1358
M币
2660
专家
66
粉丝
265
只看该作者 7楼 发表于: 2018-12-27
arduino 真的方便,一般内容都能找到代码,修改下就可以用;
[ 此帖被huaweiwx在2018-12-27 13:50重新编辑 ]
本帖最近打赏记录:共1条打赏M币+5
newnet1234 M币 +5 認真發帖。arduino 发展真快 2018-12-29
离线huaweiwx

发帖
1358
M币
2660
专家
66
粉丝
265
只看该作者 8楼 发表于: 2018-12-27
希望大家能喜欢。
ag真人平台
离线huaweiwx

发帖
1358
M币
2660
专家
66
粉丝
265
只看该作者 9楼 发表于: 2018-12-27
只有深度开发,才能有提高,自我感觉对arm的理解已经差不多了。
本帖最近打赏记录:共1条打赏M币+20
ag真人平台2545889167 M币 +20 恭喜被加精 2018-12-27
沃尔玛惠选超市要扎根社区 成败关键要看生鲜 印度北部暴雨导致至少27人死亡 12人受伤 杭州越野车失控致4死13伤 女司机被采取强制措施 韩政府:将通过书面磋商确定朝鲜艺术团演出细节 大胜后尤纳斯“挑毛病”:防守篮板球丢太多 中国做的这件大事 让美国人服气印度人眼红 揭秘区块链手机:黑科技还是伪概念? 深圳“问题牛百叶案”涉案35人被一审判决 人民日报谈美国公立学校困境:减税导致经费削减 AI决赛绝艺5:0力压星阵 刘小光罗洗河笑观棋局 币安深夜被疑遭黑客袭击中止提现 比特币大跌10% 阿富汗安全部队平息喀布尔洲际酒店袭击事件
政协委员:建议农民素质教育工作纳入党委政府考核 政协委员:“雾霾”说法不准确 建议改为“灰霾” 美元连涨四日重上90 反弹能否延续需看贸易摩擦脸色 新华社调查网约车资质乱象:300元就可解决审核问题 日本一季度经济萎缩 结束28年来最长一轮增长 中兴通讯:成立董事会出口合规委员会 郎平昔日爱徒任日本女排教练 曾随恒大夺联赛冠军 反传销“一哥”捞1人收费15000元:事前不收一分钱 印尼塞兰海发生5.9级地震 震源深度20千米 盒马鲜生张国宏:重新定义门店与顾客成半熟人的关系 公安部副部长孟宏伟不再担任部党委委员(图) 俄媒评中国打造创新经济论坛:为全球化舔砖加瓦
台当局宣布新措施留人才? 学者一句话道出真相 外媒:腾讯继百度与阿里后获准在深圳测试自驾车 王思聪欲甩卖熊猫直播 作价30亿元多轮谈判未果 三星移动部门总裁证实:Galaxy S10要改名了 俄罗斯代表团完成平昌冬残奥会登记 由72人组成 蜂鸟般大小!史前一亿年的琥珀中的古鸟登上杂志封面 美对华贸易狠招还在后面?专家:不能迁就必须反制 都夸霍金成就大为何他拿不到诺贝尔奖? 答案在这 美国猪农谈中国关税报复:以为中美只是吵吵架 台媒赞解放军远训创记录:空军换装轰6 有8套战法 2018超级杯时间敲定 恒大申花2.26虹口决胜 亚太股市收盘普跌 沪指一枝独秀 中国空警600将成舰载预警机 俄媒:装备第三艘航母 ag真人平台