[技术问答] 弱弱的问下这个库函数返回值怎么读啊

[复制链接]
3417|3
 楼主| axman002 发表于 2021-6-22 09:28 | 显示全部楼层 |阅读模式
本帖最后由 axman002 于 2021-6-22 16:29 编辑

近来在使用华大的ARM库函数编程,其中碰到这样一个库函数(比较结果返回)
en_cmp_output_state_t CMP_GetOutputState(M4_CMP_TypeDef *CMPx)
{
    /* Check parameter */
    DDL_ASSERT(IS_VALID_CMP(CMPx));

    return (en_cmp_output_state_t)(CMPx->MON_f.OMON);
}

我需要读取该函数的返回值,查这个函数返回值类型en_cmp_output_state_t是这样定义的:
typedef enum en_cmp_output_state
{
    CmpOutputLow  = 0u,                         ///< Compare output Low "0"
    CmpOutputHigh = 1u,                         ///< Compare output High "1"
} en_cmp_output_state_t;

可见是个枚举类型。
可是问题来了,我程序定义一个变量是符合上述格式要求的枚举类型,但是硬件仿真始终无法正确获取函数返回值,只有直接调用该函数来判断才行。我就纳闷了,求教各位,这种函数返回值到底要用什么样的变量来获取啊?

 楼主| axman002 发表于 2021-6-22 09:56 | 显示全部楼层
反复尝试后自个解决了问题,原来要在定义变量时加上static限定符。不过说实话,我不是很理解为什么enum类型的返回值一定要用static变量才能读到
lenglx 发表于 2021-6-23 15:03 | 显示全部楼层
需要static修饰是表象, 十之**是优化选项的后果.
你可以尝试优化级别改成0试试.
McuPlayer 发表于 2021-6-24 13:21 | 显示全部楼层
变量作用域的问题

test1函数中的a是作用域本来是整个test1函数,但后面a没人使用,所以调试器认为作用域提前结束了
test2局部变量加了static,声明这是一个需要长久保持的局部变量,他的作用域虽限制在函数内,但生命周期和全局变量相同
test3直接用全局变量,作用域和声明周期,和整个程序相同
test4因为a在后面的if语句会用到,所以a的声明周期延续到if语句,没执行if语句前a仍有效

编译器把变量声明周期最短化,是为了尽可能的使多个变量使用同一个RAM存储,变量重叠



  1. int fun( int n)
  2. {
  3.         return n + 3;
  4. }

  5. void test1()
  6. {
  7.         int a;
  8.         a = fun(4);
  9. }

  10. void test2()
  11. {
  12.         static int a;
  13.         a = fun(4);
  14. }

  15. int a_test3;
  16. void test3()
  17. {
  18.         a_test2 = fun(4);
  19. }

  20. void test4()
  21. {
  22.         int a;
  23.         a = fun(4);
  24.         if(a)
  25.         {
  26.                 Gpio_SetHigh();
  27.         }
  28. }

您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

36

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部