打印
[国产单片机]

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

[复制链接]
941|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dw772|  楼主 | 2024-2-21 16:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);                                             //
这句是定义一个局部变量 ...

定义函数指针

使用特权

评论回复
5
地瓜patch| | 2024-2-22 08:46 | 只看该作者
这个函数是在usb更新app完成后,从boot跳转到app程序中,从app首地址开始执行程序

使用特权

评论回复
6
dw772|  楼主 | 2024-2-22 10:06 | 只看该作者

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

使用特权

评论回复
7
ayb_ice| | 2024-2-23 09:23 | 只看该作者
本帖最后由 ayb_ice 于 2024-2-23 09:32 编辑
dw772 发表于 2024-2-22 10:06
//前面已经定义了一个全局的函数指针app_func  application; 为啥还要定义一个局部的同样名字的函数指针 ...

实际使用的是局部变量,那个两个定义实际不同一个返回void*,可以同名

使用特权

评论回复
8
dw772|  楼主 | 2024-2-23 15:07 | 只看该作者
ayb_ice 发表于 2024-2-23 09:23
实际使用的是局部变量,那个两个定义实际不同一个返回void*,可以同名

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

使用特权

评论回复
9
ayb_ice| | 2024-2-23 17:12 | 只看该作者
dw772 发表于 2024-2-23 15:07
谢谢,明白什么意思了。这两天专门搜了一下还有更逆天的写法
    ((void(*)())(*(u32*)(appxaddr+4)))(); ...

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

使用特权

评论回复
10
zwsam| | 2024-2-28 09:09 | 只看该作者

使用特权

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

本版积分规则

23

主题

388

帖子

1

粉丝