前段时间,我们在bring up一块Cortex-A5主控的芯片时,发现在跑FreeRTOS时, 系统总是crash. 通过GDB定位到一旦RFE指令执行结束后,系统便进入data abort mode. <图一> 一旦执行RFE便进入data abort <图二>, FreeRTOS中RFE相关代码片段 RFE指令如其字面含义, return from exception. 它的主要作用是: 从栈中弹出值分别赋值给cpsr和pc. 这条指令在恢复现场时,具有不可替代的作用(如果用其他指令来代替同样的功能, 自然就污染其他寄存器了). RFE指令在ARM v7 spec中的伪码: <图三>,RFE指令的伪码 曾经一度怀疑是Cortex-A5的errata,但是CPU指令级别的仿真测试对于RFE指令是没有问题的。而且,之前在FPGA上做预开发的时候,在FPGA平台上也没有发现此类问题。所以,一度陷入到困局中,没有思路。 如果整个FreeRTOS来让SOC仿真,那么仿真的时间会比较久,因此我们写了下面一段比较小的代码来进行仿真测试。但是仿真下来并没有发现问题。 _start: ldr r0, =vectors mcr p15, 0, r0, c12, c0, 0 // PLD Capablity mrc p15, 0, r0, c0, c2, 2 //MAIN IDR mrc p15, 0, r0, c0, c0, 0 // CCSIDR mrc p15, 1, r0, c0, c0, 0 cps #0x17 ldr r0, =0x30009000 str r0, [r0] ldr r0, =0x10009000 mov sp, r0 cps #0x1f ldr r0, =0x10008000 mov sp, r0 mrs r0...
标准委员会决定为包装了std的那部分标准库构件创建新的头文件名。生成新头文件的方法仅仅是将现有C++头文件名中的 .h 去掉,方法本身不重要,正如最后产生的结果不一致也并不重要一样。所以变成了,变成了,等等。对于C头文件,采用同样的方法,但在每个名字前还要添加一个c。所以C的变成了,变成了,等等。最后一点是,旧的C++头文件是官方所反对使用的(即,明确列出不再支持),但旧的C头文件则没有(以保持对C的兼容性)。实际上,编译器制造商不会停止对客户现有软件提供支持,所以可以预计,旧的C++头文件在未来几年内还是会被支持。
回复删除所以,实际来说,下面是C++头文件的现状:
・ 旧的C++头文件名如将会继续被支持,尽管它们不在官方标准中。这些头文件的内容不在名字空间std中。
・ 新的C++头文件如包含的基本功能和对应的旧头文件相同,但头文件的内容在名字空间std中。(在标准化的过程中,库中有些部分的细节被修改了,所以旧头文件和新头文件中的实体不一定完全对应。)
・ 标准C头文件如继续被支持。头文件的内容不在std中。
・