Simulink生成具有不受支持的istruction(ceil)的代码

时间:2013-07-30 18:56:35

标签: matlab code-generation simulink

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

有可能解决这个问题吗?

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

非常感谢任何人建议我可以尝试做什么

2 个答案:

答案 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函数的返回数据类型。您希望此返回intlong。如果您不确定哪种数据类型适合您的应用程序,请再次查看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 ...你的解决方案非常实用,可以从我的问题中得到其他人的认可(但在其他环境中)。