本文介绍IoT_SDK V2.0在高通MDM9206平台上移植用户遇到过的问题原因说明。
编译问题
- ArmCC不支持C语言中变量定义和逻辑语句混杂,声明段落必须在逻辑段落之前完整结束。
- ArmCC不支持用花括号
{}
的方式定义匿名结构体实例作为右值。 - ArmCC处理枚举类型时,gcc及其变种按照int处理,而armcc有严格的编译时检查,多按unsigned int处理。
- ArmCC不支持在if、while、for逻辑的判断语句中有变量赋值。
- 函数内多分支情况,ArmCC对不可达分支处的return语句严格报错导致编译失败。
- ArmCC不支持返回值被声明为枚举类型的函数,实际上返回值是int等gcc所认为的等价数据类型。
- 标准库的头文件内容有差异。gcc编译时可以找到的定义如size_t、 typeof等,在armcc上没有。
- ArmCC不支持GNU风格扩展函数, 如vasnprintf、asprintf。
- ArmCC不支持GNU风格扩展数据结构,如匿名结构体、结构体匿名成员赋值等。
运行问题
- 使用标准库函数tolower(),需要对应引用头文件ctype.h,否则运行会出现卡死情况。
- 使用高通的串口打印函数,不能用
%s
格式打印0长度的字符串。 - HTTP Client的代码中,如
src/utils/misc/utils_httpc.c
,使用了C标准库函数sscanf(), 由于高通的C库问题,这些代码运行到时会卡死。