最近看到一个从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();
}
} 这是BOOT的跳转到APP,启动文件第一个字是堆栈指针的值,第二个字是程序开始的地址 ayb_ice 发表于 2024-2-21 16:22
这是BOOT的跳转到APP,启动文件第一个字是堆栈指针的值,第二个字是程序开始的地址 ...
void* (*application)(void); //
这句是定义一个局部变量的指针还是把前面的全局指针强制转换? dw772 发表于 2024-2-21 16:26
void* (*application)(void); //
这句是定义一个局部变量 ...
定义函数指针 这个函数是在usb更新app完成后,从boot跳转到app程序中,从app首地址开始执行程序 ayb_ice 发表于 2024-2-21 16:53
定义函数指针
//前面已经定义了一个全局的函数指针app_funcapplication; 为啥还要定义一个局部的同样名字的函数指针 本帖最后由 ayb_ice 于 2024-2-23 09:32 编辑
dw772 发表于 2024-2-22 10:06
//前面已经定义了一个全局的函数指针app_funcapplication; 为啥还要定义一个局部的同样名字的函数指针 ...
实际使用的是局部变量,那个两个定义实际不同一个返回void*,可以同名 ayb_ice 发表于 2024-2-23 09:23
实际使用的是局部变量,那个两个定义实际不同一个返回void*,可以同名
谢谢,明白什么意思了。这两天专门搜了一下还有更逆天的写法
((void(*)())(*(u32*)(appxaddr+4)))(); dw772 发表于 2024-2-23 15:07
谢谢,明白什么意思了。这两天专门搜了一下还有更逆天的写法
((void(*)())(*(u32*)(appxaddr+4)))(); ...
省了中间步骤而已,多写几个步骤,容易看懂些,便于修改
页:
[1]