ag真人平台
爱科技/爱创意/爱折腾;电子/数码爱好者的家!欢迎访问新版数码之家网站
  • 17242阅读
  • 61回复

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

上一主题 下一主题
离线huaweiwx
 

发帖
1369
M币
2702
专家
66
粉丝
269
只看楼主 倒序阅读 我要置顶 楼主  发表于: 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

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

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

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

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

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

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

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

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

发帖
1369
M币
2702
专家
66
粉丝
269
只看该作者 8楼 发表于: 2018-12-27
希望大家能喜欢。
离线huaweiwx

发帖
1369
M币
2702
专家
66
粉丝
269
只看该作者 9楼 发表于: 2018-12-27
只有深度开发,才能有提高,自我感觉对arm的理解已经差不多了。
本帖最近打赏记录:共1条打赏M币+20
2545889167 M币 +20 恭喜被加精 2018-12-27
快速回复
限80 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个
      恒大逆转远未到稳出线之时 还得死磕济州90分钟 特朗普新首席经济顾问啥来头?又一个“跨界人” 哈工大威海校区现学霸班:全班22人全部考上研究生 孙杨:从100米游到1500米 除了我没有人能做到 马德里赛波特罗遭NO.95逆转 两位新星制造冷门 种业安、粮仓稳 我国大宗作物用种全部实现自主选育 新京报:粉丝追星导致飞机延误 法律规制宜有突破 美3D打印枪支将合法设计图也可下载 21州起诉反对 象甲联赛第二阶段8月南昌开幕 六轮大赛即将上演 传陌陌将收购探探 价格或超5亿美元 西班牙名宿迎中国执教首秀 塞尔吉:相信会打出漂亮开局 代表:公共场所控烟条例尽快出台 与世卫公约一致
      障碍不止一点!伍兹落后五杆争帕尔默邀请赛第九冠 北京城区下冰雹?中央气象台:那是霰粒 需提交资质证书 跨境电商支付企业门槛抬高 餐馆女老板闯入课堂打伤女生 校方:不严重没报警 行业已至水深处 腾讯的梦想与隐忧互现 株洲侦破维卡币特大网络传销案:涉案150亿抓获119人 准备了16年,爱因斯坦广义相对论的预测终获验证 北京首批获积分落户资格者年内办理落户 石宇奇:场馆还未100%适应 若面林丹会打出冲劲 詹姆斯又被逮到眼神防守!他这次是没劲了吗 济南市民彻夜排队销分 交警发紧急通告解读新政 一图读懂最高检工作报告
      居民自有住房没纳入中国GDP核算?统计局否认 这省8位地市党政一把手拟同时调整 她是唯一女性 老人扫院烧杨柳絮引燃乐器厂 犯失火罪获刑2年 利群股份16.65亿元收购乐天玛特华东72家门店等资产 道达尔将退出世界最大气田项目 中石油不会接手 曝阿森纳切尔西都放弃前巴萨主帅!嫌他傲慢自大 宋楚瑜迟迟未表态 台湾参加APEC峰会也将生变? 大众汽车二季度税后利润33.1亿欧元 章文发声明称没强奸 受害人:我有当时物证 不怕他 西南新贵2年合同续签防守悍将 他曾是詹皇侍卫 Apple Music美国订阅用户增速约5% 今夏或超… 特斯拉的艰难时刻:卖一辆亏一辆 野蛮生长遭质疑 台湾附近发生4.6级左右地震 ag真人平台