【问题标题】:Vectorcast using IAR compiler for RL78Vectorcast 使用 RL78 的 IAR 编译器
【发布时间】:2017-09-25 08:07:50
【问题描述】:

我刚刚开始为 RL78 编译器使用 Vectorcast 和 IAR。我想使用 IAR Compiler for RL78 Microcontroller 在 vectorcast 中构建环境。

用于测试的代码已在 RL78 的 IAR 嵌入式工作台中成功编译。

在为模块构建 vectorcast 环境时遇到以下错误。

错误:

40_MCAL\Memory\FDL\fdl_types.h", line 133: error:
          division by zero
  enum { R_FDLT02_ASSERT_LINE_133 = 1/(! !(sizeof(fdl_u16)==2)) };
                                     ^

40_MCAL\Memory\FDL\fdl_types.h", line 137: error:
          division by zero
  enum { R_FDLT02_ASSERT_LINE_137 = 1/(! !(sizeof(fdl_command_t)==1)) };
                                     ^

40_MCAL\Memory\FDL\fdl_types.h", line 138: error:
          division by zero
  enum { R_FDLT02_ASSERT_LINE_138 = 1/(! !(sizeof(fdl_status_t)==1)) };
                                     ^
40_MCAL\Memory\FDL\fdl_types.h", line 141: error:
          division by zero
  enum { R_FDLT02_ASSERT_LINE_141 = 1/(! !(sizeof(fdl_request_t)==8)) };
                                     ^


40_MCAL\Memory\FDL\fdl_types.h", line 142: error:
          division by zero
  enum { R_FDLT02_ASSERT_LINE_142 = 1/(! !(sizeof(fdl_descriptor_t)==10)) };
                                     ^   
5 errors detected in the compilation of "Flash.c".

源代码如下:

# define R_FDLT02_ASSERT_CONCAT_(a, b) a##b        

#define R_FDLT02_ASSERT_CONCAT(a, b) R_FDLT02_ASSERT_CONCAT_(a, b)    

#define R_FDLT02_STATIC_ASSERT(e) enum { R_FDLT02_ASSERT_CONCAT    
(R_FDLT02_ASSERT_LINE_, __LINE__) = 1/(!!(e)) }    

/* assertion if unsigned data type size is not correct, please evaluate compiler settings for integer types */

R_FDLT02_STATIC_ASSERT(sizeof(fdl_u08)==1);    

R_FDLT02_STATIC_ASSERT(sizeof(fdl_u16)==2);    

R_FDLT02_STATIC_ASSERT(sizeof(fdl_u32)==4);    


/* assertion if enumeration type size is not correct, please evaluate compiler settings for enumeration types */    

R_FDLT02_STATIC_ASSERT(sizeof(fdl_command_t)==1);    

R_FDLT02_STATIC_ASSERT(sizeof(fdl_status_t)==1);    

/* assertion if structure type size is not correct, please evaluate compiler settings for structure types */    

R_FDLT02_STATIC_ASSERT(sizeof(fdl_request_t)==8);    

R_FDLT02_STATIC_ASSERT(sizeof(fdl_descriptor_t)==10);    

【问题讨论】:

  • 如果你能分享产生错误的代码会容易得多。
  • 这些似乎是静态断言。他们的工作是确保您不会意外编译行为不正确的代码。也许您需要将此库(?)移植到您的编译器系统。
  • /* 断言如果无符号数据类型大小不正确,请评估整数类型的编译器设置 */ tdl_u08 需要为 1 字节,但在您的系统上显然不是。 u16 2 和 u32 4 同上。您尝试过哪些编译器设置来解决此问题?
  • 作为商业产品,我想供应商会提供技术支持。甚至是文档?

标签: c embedded


【解决方案1】:

如果指定类型的大小不符合库的要求,它们是旨在使编译失败的表达式。

您需要检查fdl_u16 等类型的定义是否适合您的目标。对于 IAR 的 RL78 编译器,基本类型具有以下大小:

bool               8 bits
char               8 bits 
signed char        8 bits
unsigned char      8 bits
signed short       16 bits
unsigned short     16 bits 
signed int         16 bits 
unsigned int       16 bits
signed long        32 bits 
unsigned long      32 bits
signed long long   32 bits
unsigned long long 32 bits 

但是,如果需要特定的大小来定义此类类型,例如 uint16_t,它通常更便携。

但是,考虑到 fdl_u8 或 fdl_u32 没有错误,但您没有提供该代码,很难想到大小不为 2 的 fdl_u16 的合理定义。

任何特定枚举的大小为 1 的明显期望是不安全的(例如,参见 What is the size of an enum in C?),尽管在 IAR RL78 编译器手册中它声明将使用可以容纳所有枚举常量的最小类型。

结构类型的失败很可能是 fdl_u16 失败的结果,但是如果没有这些类型的定义,就很难判断。

【讨论】:

  • 感谢您的宝贵时间。实际上它是一个解析错误,我得到了解决。
【解决方案2】:

对于像 VectorCAST 这样的测试工具,始终建议找出错误的来源是来自我们的源代码还是来自工具。例如,VectorCAST 使用预处理文件来解析代码,通过使用自己的解析器模仿正在使用的编译器来识别是否存在任何语法或语义错误。

通常,该工具的解析器配置为通用默认设置,如果使用非通用项目,则可能会出现错误。在 VectorCAST 中,可以使用 Test settings 选项来查找错误源是来自编译阶段还是解析阶段(测试工具端)。如果是解析器错误(如 user8270915 所示),请联系工具供应商支持团队以获取其他标志来解决此类问题。如果错误源自测试设置的编译阶段,那么在这种情况下,必须将测试环境中使用的设置与其实际项目进行比较。

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 2016-03-19
    • 1970-01-01
    • 2017-03-23
    • 2011-02-20
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多