通过Simulink生成代码(MacOS 64位上的Matlab R2011A)
我遇到了一个问题:它在代码中使用ceil
函数,但我的目标平台不支持它。
我正在使用ERT,用于Arm Cortex处理器(在赛普拉斯PSoC上)。
有可能解决这个问题吗?
我尝试了解决方案但没有成功。 同样在Code Generation - Interface中,我试图禁用浮点数或非限定数......但是这样我项目的每个信号都会产生一些错误(同样的行为也会改变它的数据类型)。
非常感谢任何人建议我可以尝试做什么
答案 0 :(得分:2)
您可以编写自己的ceil
函数,并将其包含在目标设备的输出代码中。假设您正在生成C代码,该函数将类似于:
int ceil (double number) {
if (number == 0)
return 0;
if (number > 0) {
if (number - (int) number > 0)
return (int) number + 1;
else
return (int) number;
}
else {
if (number - (int) number < 0)
return (int) number - 1;
else
return (int) number;
}
}
在头文件中使用原型,如:
int ceil (double);
现在您的C代码可以调用integerValuedNumber = ceil(doubleValuedNumber)
,它应该可以正常工作。您也可以使用macros in the C-file执行此操作(请参阅任天堂的回答)。
编辑:我更正了我的代码,为C使用了正确的类型转换语法。基本上,您使用(int) number
语法执行的操作是使用双值number
变量并强制它是一个整数。您可以找到有关data types in C here或Google“类型转换C”或“数据类型C”的详细信息,以获取更多信息。
此外,可能还需要一些额外的括号,例如return ((int) number) + 1;
和类似的。我的C编程有点生疏,但希望这能让你找到一个可行的解决方案。
编辑2:我更正了自定义ceil
函数的返回数据类型。您希望此返回int
或long
。如果您不确定哪种数据类型适合您的应用程序,请再次查看C中数据类型的文档。如果您应用ceil
的值不是很大(例如,小于+/- 2 ^ 15),那么int
可能就好了。
答案 1 :(得分:1)
好的......我解决了。
问题出在目标环境(PSoC Creator)中。 正如此处http://www.cypress.com/?id=4&rID=42838所解释的那样:
转到项目 - &gt;构建设置 - &gt;链接器 - &gt;一般 - &gt;其他图书馆。在Additional Libraries字段中输入m。 如果您没有添加此附加库,那么您将收到以下构建错误&#34;未定义的引用`sqrt&#39;&#34;其中sqrt是一个数学函数。
如果问题出在sqrt()或ceil()上,则没有任何变化,因为它们位于同一个库(math.h)中。
PS:谢谢Engineero ...你的解决方案非常实用,可以从我的问题中得到其他人的认可(但在其他环境中)。