1

通过 Simulink 生成代码(MacOS 64 位上的 Matlab R2011A)我遇到了一个问题:它ceil在代码中使用了函数,但我的目标平台不支持它。我正在为 Arm Cortex 处理器(在赛普拉斯 PSoC 上)使用 ERT 生成。

有可能解决这个问题吗?

我尝试了解决方案但没有成功。同样在代码生成 - 接口中,我尝试禁用浮点数或非有限数......但这样我项目的每个信号都会引发一些错误(同样的行为也会改变它的数据类型)。

真的感谢任何人建议我可以尝试做什么

4

2 回答 2

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)并且它应该可以工作了。您也可以使用C 文件中的宏来执行此操作(请参阅任天堂的答案)。

编辑:我更正了我的代码以对 C 使用正确的类型转换语法。基本上,您使用该(int) number语法所做的是采用双值number变量并将其强制为整数。您可以在此处找到有关 C 中的数据类型的更多信息,或在 Google 中找到“类型转换 C”或“数据类型 C”以获取更多信息。

此外,可能需要一些额外的括号,比如return ((int) number) + 1;和类似的。我对我的 C 编程有点生疏,但希望这能让你找到一个可行的解决方案。

编辑2:我更正了我们自定义ceil函数的返回数据类型。你会希望它返回一个int, 或者也许long. 如果您不确定哪种数据类型适合您的应用程序,请再次查看有关 C 中数据类型的文档。如果您应用的值ceil不是很大(例如小于 +/- 2^15),那么int可能没问题。

于 2013-07-30T22:54:27.580 回答
1

好的...我解决了。

问题出在目标环境 (PSoC Creator) 中。如此处解释http://www.cypress.com/?id=4&rID=42838

转到项目 -> 构建设置 -> 链接器 -> 常规 -> 附加库。在附加库字段中键入 m。如果您不添加此附加库,那么您将收到以下构建错误“未定义对 `sqrt' 的引用”,其中 sqrt 是一个数学函数。

如果问题出在 sqrt() 或 ceil() 上,则没有任何变化,因为它们在同一个库 (math.h) 中。

PS:谢谢Engineer ...您的解决方案非常有用,其他人可以从我的问题(但在其他环境中)那里得到赞赏。

于 2013-07-31T08:23:32.810 回答