STM32(Cortex-M3)开发,RVDS和MDK谁优谁劣?
目前针对Cortex-M3的开发示例大都以MDK的工程来提供,所以MDK更适合Cortex-M3的开发才对,难到几万元的RVDS其开发表现不如万元左右的MDK开发工具吗,实际情况又如何呢?
开发板:EM-STM3210E 和 EM-STM3210E-EVAL
CPU:STM32F103ZE
目标源码:Microsoft .Net Micro Framework v4.0 for Cortex-M3
一、编译
编译模式 |
Debug |
Release |
RTM | |
MDK |
RAM |
正常 |
异常 |
异常 |
FLASH |
正常 |
异常 |
异常 | |
RVDS |
RAM |
异常 |
正常 |
异常 |
FLASH |
异常 |
异常 |
异常 |
所谓异常,其实问题很简单,就是CRC计算的代码出了问题,相关代码如下:
UINT32 SUPPORT_ComputeCRC( const void* rgBlock ,int nLength , UINT32 crc)
{
const UINT8* ptr = (const UINT8*)rgBlock;
while(nLength-- > 0)
{
crc = c_CRCTable[ ((crc >> 24) ^ (*ptr++)) & 0xFF ] ^ (crc << 8);
}
return crc;
}
在出现异常的版本中,代码运行到crc = c_CRCTable[ ((crc >> 24) ^ (*ptr++)) & 0xFF ] ^ (crc << 8);时,程序即出现异常,并且是rgBlock地址在外扩SRAM或片内FLASH时才出现这个问题,有时执行多个循环才会出现这种情况(为了锁定和捕捉该错误,花了我许久的时间才定位到此处)。STM32F103ZE包含CRC计算功能,但是以4个字节为计算单位,所以不太适用。
从以上表现来看,MDK和RVDS的编译结果还是有比较大的区别的,所以建议嵌入式开发者要多测试几款工具,才能真正定位自己的问题。
二、调试
由于目前EM-STM3210E 和 EM-STM3210E-EVAL开发板并没有提供一款直接初始化片外SRAM的软件,所以要调试RAM版本的程序,MDK或RVDS都需要编写调试脚本(如何编写调试脚本?请参见:http://blog.csdn.net/yefanqiu/archive/2010/01/07/5151463.aspx)
用MDK调试Cortex-M3和调试ARM9或ARM7平台一样,直接调试即可。但是用RVDS调试却有不同,为了能正常调试,还是费了不少周折的。
在用RVDS调试Cortex-M3时,要确保上图所示的 [State]中的“t”为“T”。
有意思的是,这个选项和BOOT的启动选项有很大关系,如果设为“系统启动”模式,则上图的“t”自动为“T”,可以直接进行调试,其它两种模式“用户启动”和“RAM启动”都默认为“t”,需要手动切换为“T”。
此外RVDS显示的指令地址有些问题(最低位并不为1),而MDK却一切正常。
三、其它
ARM开发板,其中基于STM32F103ZE CPU的开发板有三款
从我目前的调试经验来看,如果调试基于ARM7或ARM9的开发板,RVDS还是非常强大的,不过如果要调试基于Cortex-M3的开发板(特别是STM32系列),我倒是建议采用MDK来进行调试,不仅价格便宜,综合表现也不错。
最近一段时间,.Net Micro Framework for Cortex-M3除了USB驱动移植成功外,还开发了一个轻量级TinyGUI,在低内存的Cortex-M3开发板上有不俗的表现,我在后续的博文中会进行相关的介绍。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?