最近处理一款安全芯片的系统通讯的时候发现一些问题,说明如下:
1. 一系列功能分布在 S1 S2两个部分, S1在CPU RAM中执行, S2在DDR中执行, S2运行过程中调用 S1 的部分code.
2. S2用 网上通用 arm-cross-toolchain 编译, S1用 arm 公司的 RVDS 4.1 编译。
3. S2 和 S1之间通讯使用结构体, 结构体内含有 enum 域成员。
问题出在两款编译器对 enum的默认处理上, 在 arm-cross-toolchain 上 enum的 默认 sizeof() = 4 即默认为 int 类型, 而 rvds 的 sizeof(enum) = 1 即默认为 char 类型。 如果要兼容必须在 rvds 编译时指定 --enum_is_int 选项。
由此想到以前看过的某老外的文章,言道 嵌入式 C 开发中应当尽量少使用 enum 类型 和 inline 的限定,而同类功能尽量使用宏来代替。优点如下:
1. 不同编译器对 enum 和 inline 的处理不同,造成不同编译器出来的程序交互数据有影响。(enum 如上, inline 好像是参数顺序关系的问题)
2. 速度快。 enum 使用数组类型结构存储,执行时有地址的跳转寻获, 宏是直接编译时代码替换。inline同样,但是inline似乎多占用更多的代码空间,这个要具体衡量。
3. 还有其他,记不清了, 好像在 网站上有, 刚才似乎找不到了。
网上说 rvds 才是正宗啊, 看来要找个时间看看 armcc 的用法了。
阅读(3769) | 评论(2) | 转发(0) |