【问题标题】:Simulink generate code with unsupported istruction (ceil)Simulink 使用不受支持的指令 (ceil) 生成代码
【发布时间】:2013-07-31 01:52:30
【问题描述】:

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

这个问题能解决吗?

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

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

【问题讨论】:

  • 你确定你没有ceil……你在matlab界面上试过ceil(2.3)吗? matalb 上没有 ceil 对你来说很奇怪……
  • 问题是 ceil() 是在我的 ARM 代码中生成的……它不支持该指令……

标签: matlab code-generation simulink


【解决方案1】:

您可以编写自己的 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 可能没问题。

【讨论】:

  • 谢谢您的回答...但不存在ceil(),也不存在int()... :(
  • @PierpaoloCira 抱歉,我的语法有误。我更正了我的答案以包含正确的 C 类型转换语法。我不保证我的代码正是您所需要的,但它可能会让您走上正确的道路。
  • 谢谢:这很有用。顺便说一句,我找到了一个不同的解决方案,它使用 ceil() 本机实现(在 math.h 库中)。
  • 啊,是的,math.h。现在为什么我没有想到呢?我敢肯定,这是最好的解决方案。
【解决方案2】:

好的...我解决了。

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

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

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

PS:谢谢 Engineero...您的解决方案非常有用,其他人也可以欣赏我的问题(但在其他环境中)。

【讨论】:

    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 2017-07-06
    • 2018-08-29
    • 2013-12-19
    • 2020-04-29
    • 2017-03-15
    • 2012-07-06
    • 2014-02-01
    相关资源
    最近更新 更多