dw772 发表于 2024-2-21 16:11

最近看到一个从USB启动的函数,一直没看懂,有人帮分析一下吗

typedef void (*app_func) (void);
app_func application;
uint32_t app_address;


void jump_to_app(uint32_t addr)
{
        uint32_t app_address;                                    
        void* (*application)(void);                                             //
       
        /* test if user code is programmed starting from address */
        if (((*(__IO uint32_t*)addr) & 0x2FFE0000) == 0x20000000)
        {
                app_address = *(__IO uint32_t*) (addr + 4);
                application = (void* (*)(void)) app_address;

                /* initialize user application's stack pointer */
                __set_MSP(*(__IO uint32_t*) addr);
               
                rcu_deinit();
               
                /* jump to user application */
                application();
        }
}

ayb_ice 发表于 2024-2-21 16:22

这是BOOT的跳转到APP,启动文件第一个字是堆栈指针的值,第二个字是程序开始的地址

dw772 发表于 2024-2-21 16:26

ayb_ice 发表于 2024-2-21 16:22
这是BOOT的跳转到APP,启动文件第一个字是堆栈指针的值,第二个字是程序开始的地址 ...

void* (*application)(void);                                             //
这句是定义一个局部变量的指针还是把前面的全局指针强制转换?

ayb_ice 发表于 2024-2-21 16:53

dw772 发表于 2024-2-21 16:26
void* (*application)(void);                                             //
这句是定义一个局部变量 ...

定义函数指针

地瓜patch 发表于 2024-2-22 08:46

这个函数是在usb更新app完成后,从boot跳转到app程序中,从app首地址开始执行程序

dw772 发表于 2024-2-22 10:06

ayb_ice 发表于 2024-2-21 16:53
定义函数指针

//前面已经定义了一个全局的函数指针app_funcapplication; 为啥还要定义一个局部的同样名字的函数指针

ayb_ice 发表于 2024-2-23 09:23

本帖最后由 ayb_ice 于 2024-2-23 09:32 编辑

dw772 发表于 2024-2-22 10:06
//前面已经定义了一个全局的函数指针app_funcapplication; 为啥还要定义一个局部的同样名字的函数指针 ...
实际使用的是局部变量,那个两个定义实际不同一个返回void*,可以同名

dw772 发表于 2024-2-23 15:07

ayb_ice 发表于 2024-2-23 09:23
实际使用的是局部变量,那个两个定义实际不同一个返回void*,可以同名

谢谢,明白什么意思了。这两天专门搜了一下还有更逆天的写法
    ((void(*)())(*(u32*)(appxaddr+4)))();

ayb_ice 发表于 2024-2-23 17:12

dw772 发表于 2024-2-23 15:07
谢谢,明白什么意思了。这两天专门搜了一下还有更逆天的写法
    ((void(*)())(*(u32*)(appxaddr+4)))(); ...

省了中间步骤而已,多写几个步骤,容易看懂些,便于修改

zwsam 发表于 2024-2-28 09:09

页: [1]
查看完整版本: 最近看到一个从USB启动的函数,一直没看懂,有人帮分析一下吗