打印
[技术问答]

弱弱的问下这个库函数返回值怎么读啊

[复制链接]
3104|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存储,变量重叠



int fun( int n)
{
        return n + 3;
}

void test1()
{
        int a;
        a = fun(4);
}

void test2()
{
        static int a;
        a = fun(4);
}

int a_test3;
void test3()
{
        a_test2 = fun(4);
}

void test4()
{
        int a;
        a = fun(4);
        if(a)
        {
                Gpio_SetHigh();
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

36

帖子

0

粉丝