通过 Simulink 生成代码(MacOS 64 位上的 Matlab R2011A)我遇到了一个问题:它ceil
在代码中使用了函数,但我的目标平台不支持它。我正在为 Arm Cortex 处理器(在赛普拉斯 PSoC 上)使用 ERT 生成。
有可能解决这个问题吗?
我尝试了解决方案但没有成功。同样在代码生成 - 接口中,我尝试禁用浮点数或非有限数......但这样我项目的每个信号都会引发一些错误(同样的行为也会改变它的数据类型)。
真的感谢任何人建议我可以尝试做什么
通过 Simulink 生成代码(MacOS 64 位上的 Matlab R2011A)我遇到了一个问题:它ceil
在代码中使用了函数,但我的目标平台不支持它。我正在为 Arm Cortex 处理器(在赛普拉斯 PSoC 上)使用 ERT 生成。
有可能解决这个问题吗?
我尝试了解决方案但没有成功。同样在代码生成 - 接口中,我尝试禁用浮点数或非有限数......但这样我项目的每个信号都会引发一些错误(同样的行为也会改变它的数据类型)。
真的感谢任何人建议我可以尝试做什么
您可以编写自己的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)
并且它应该可以工作了。您也可以使用C 文件中的宏来执行此操作(请参阅任天堂的答案)。
编辑:我更正了我的代码以对 C 使用正确的类型转换语法。基本上,您使用该(int) number
语法所做的是采用双值number
变量并将其强制为整数。您可以在此处找到有关 C 中的数据类型的更多信息,或在 Google 中找到“类型转换 C”或“数据类型 C”以获取更多信息。
此外,可能需要一些额外的括号,比如return ((int) number) + 1;
和类似的。我对我的 C 编程有点生疏,但希望这能让你找到一个可行的解决方案。
编辑2:我更正了我们自定义ceil
函数的返回数据类型。你会希望它返回一个int
, 或者也许long
. 如果您不确定哪种数据类型适合您的应用程序,请再次查看有关 C 中数据类型的文档。如果您应用的值ceil
不是很大(例如小于 +/- 2^15),那么int
可能没问题。
好的...我解决了。
问题出在目标环境 (PSoC Creator) 中。如此处解释http://www.cypress.com/?id=4&rID=42838:
转到项目 -> 构建设置 -> 链接器 -> 常规 -> 附加库。在附加库字段中键入 m。如果您不添加此附加库,那么您将收到以下构建错误“未定义对 `sqrt' 的引用”,其中 sqrt 是一个数学函数。
如果问题出在 sqrt() 或 ceil() 上,则没有任何变化,因为它们在同一个库 (math.h) 中。
PS:谢谢Engineer ...您的解决方案非常有用,其他人可以从我的问题(但在其他环境中)那里得到赞赏。