智能卡上电后返回ATR(即复位应答)时间过长而无法返ATR的解决方案

关于智能卡片上电后返回ATR时间过长的问题,是在COS开发完成后的智能卡兼容性测试过程中发现的,不同读卡器厂商均应遵循ISO7816接触卡协议来设计接触型读卡器,理论上ATR响应时间是一样的,不过实测之后有一定的差距。这也导致了载入开发COS的智能IC卡在某些读卡器下工作正常,而在某些读卡器下出现无法响应的情况,即卡片上电复位后读卡器接收不到卡片发来的ATR数据。通过测试设备MPManager执行7816测试指令来分析波形,发现智能卡返回ATR时间过长。

为了解决这个问题,必须要缩短智能卡内部MCU上电后至执行发送ATR代码这个过程的执行时间。当时项目用的智能卡MCU内核是ARM的M0系列。分析发现MCU的启动代码中的__main 标号表示 C/C++标准实时库函数里的一个初始化子程序__main 的入口地址。该程序的一个主要作用是初始化堆栈,并初始化映像文件,最后跳转到 C 程序中的 main函数。如果全局变量定义数量比较多,那么这个初始化过程消耗的时间就比较长。通过在不影响系统整体功能的前提下可压缩全局变量数量达到缩短ATR响应时间的目的。经过测试各读卡器均能成功返回ATR。当然这只是其中一种解决方法,可能还会有其他方法,比如把一些前期初始化的东西放到后面执行返回ATR的代码后再执行等等。

具体MCU在执行main函数之前执行了什么,可以参考一位技术达人的文章看一下http://www.51hei.com/bbs/dpj-26892-1.html

下一篇文章会分享一下安富莱大神的STM32的启动代码讲解。

你可能感兴趣的:(智能IC卡)