首页 > 解决方案 > C语言函数的内存地址

问题描述

我正在使用 ARM Cortex M3 处理器进行睡眠模式。我必须为此填写一些结构。

这里是其中之一

struct sleep_mode_init_env_tag
{
    /* Wake up configuration */
    uint32_t wakeup_cfg;

    /* Wake up restore address */
    uint32_t wakeup_addr;

    /* Wake up application start address */
    uint32_t app_addr;

    /* Memory power configuration for wake-up */
    uint32_t mem_power_cfg_wakeup;

    /* Clock source for RTC */
    uint8_t rtc_ctrl;

    /* DMA channel used to save/restore RF registers
     * in each sleep/wake-up cycle */
    uint8_t DMA_channel_RF;
};

当我在主循环中进入睡眠模式时,我想在 1 分钟后再次返回主循环。所以你可以看到我必须在这里写唤醒函数的内存地址;

uint32_t app_addr;

还有我的返回函数;

void Turn_Wake_up(void) {

    Sys_PowerModes_Wakeup();

    Sys_Watchdog_Refresh();

    Device_Config();
    
    memory_access();

    main_loop();

}

制造商公司创建了这个 .S 文件 (wake_up.S) 并包含在项目中,用于唤醒功能的内存地址;

  .thumb_func

    .section .app_wakeup_asm
    .globl Turn_Wake_up_asm
    .extern __stack, 4

/* ----------------------------------------------------------------------------
 * Function      : void Turn_Wake_up_asm()
 * ----------------------------------------------------------------------------
 * Description   : Initialize stack pointer and continue execution
 * Inputs        : None
 * Outputs       : None
 * Assumptions   : None
 * ------------------------------------------------------------------------- */
Turn_Wake_up_asm:
    movw r0, #:lower16:__stack
    movt r0, #:upper16:__stack
    msr msp, r0

/* ----------------------------------------------------------------------------
 * File end
 * ------------------------------------------------------------------------- */
    .end

他们已经这样做了;

(uint32_t) (&Turn_Wake_up_asm) 

所以,我只是使用了这个;

(uint32_t) (&Turn_Wake_up);

而且我没有任何错误,但它没有用。所以我的主要问题是;

“ (uint32_t) (&Turn_Wake_up); 和 (uint32_t) (&Turn_Wake_up_asm) 有什么不同?”

注意:

*** 我没有任何关于 .S 文件内容的信息...

谢谢...

标签: carmmemory-address

解决方案


推荐阅读