.syntax unified .cpu cortex-m23 ; 使用的处理器架构 .fpu softvfp ; 使用的是软件模拟浮点运算 .thumb ; 指示汇编使用thumb指令 .global Default_Handler ; 全局符号。链接器可引用。使其对外可见 /* necessary symbols defined in linker script to initialize data */ ; .word一般占用4个字节 .word _sidata ;Flash 中数据段(.data)的初始值起始地址(通常位于只读存储器)。 .word _sdata ;RAM 中数据段(.data)的起始地址。 .word _edata ;RAM 中数据段(.data)的结束地址。 .word _sbss ;RAM 中 BSS 段的起始地址。 .word _ebss ;RAM 中 BSS 段的结束地址。 .section .text.Reset_Handler ; 将此后的代码放入名为 .text.Reset_Handler 的节(section),通常位于 Flash。 .weak Reset_Handler ;声明 Reset_Handler 为弱符号,允许用户在同名强符号覆盖(如果用户定义了 Reset_Handler 则优先 .type Reset_Handler, %function ;指定该符号为函数类型,便于调试器识别。 /* reset Handler */ Reset_Handler: ldr r0, =_sp ; _sp栈顶指针拷贝到r0 mov sp, r0 ; 将 r0 的值赋给栈指针 SP,完成栈初始化。 /* copy the data segment into ram */ movs r1, #0 ; 将立即数 0 存入 r1,用作偏移量(从 0 开始) b DataInit ; 无条件跳转到 DataInit 标签(用于判断是否需要复制数据) CopyData: ;循环体标签。 ldr r3, =_sidata ;将.data起始地址加载到r3 ldr r3, [r3, r1] ;将.data+0的4字节数据加载到r3 str r3, [r0, r1] ;将r3的数据存到r0+r1 也就是ram的.data+r1 adds r1, r1, #4 ;r1=r1+4 ,每次偏移4字节 ; 执行完成后往下运行 DataInit: ;初始化,判断循环条件 ldr r0, =_sdata ;将ram的.data的起始地址加载到r0 ldr r3, =_edata ;将ram的.data的结束地址加载到r3 adds r2, r0, r1 ;r2 = r0 + r1 cmp r2, r3 ;比较r2是否小于r3 bcc CopyData ;如果小于,那么跳到copydata ldr r2, =_sbss ;将ram的bss起始地址加载到r2 b Zerobss ;跳转到zerobss FillZerobss: movs r3, #0 ; 0复制到r3 str r3,[r2] ; 将0赋值到r2指向的地址 adds r2, r2, #4 ; r2地址+4 Zerobss: ldr r3, = _ebss ; 加载ram的bss结束地址到r3 cmp r2, r3 ; 比较r2所在的地址小于r3那么跳到,bss清除的循环里 bcc FillZerobss ; 清除bss /* Call SystemInit function */ bl SystemInit ; 跳转到systeminit,bl 提前将pc+4的地址放到LR寄存器里 /* Call static constructors */ bl __libc_init_array ; 调用 C++ 静态构造函数或 C 库初始化(若有),用于初始化全局对象。 /*Call the main function */ bl main ; 跳转到用户的主函数 main,进入应用程序 bx lr ; 如果main返回,那么会跳转到LR所在地址,但并不会发生,main里是死循环。 .size Reset_Handler, .-Reset_Handler .section .text.Default_Handler,"ax",%progbits ;将默认异常处理函数放入 .text.Default_Handler 节,属性为“可分配、可执行”("ax"),内容为程序数据(%progbits) Default_Handler: Infinite_Loop: b Infinite_Loop ;无限循环 .size Default_Handler, .-Default_Handler ;设置这个标签的大小 .section .vectors,"a",%progbits ;创建 .vectors 节,属性为“可分配”("a"),无执行权限。 .global __gVectors ;声明 __gVectors 全局,供链接器识别为向量表起始地址 __gVectors: .word _sp /* Top of Stack */ .word Reset_Handler /* 1:Reset Handler */ .word NMI_Handler /* 2:NMI Handler */ .word HardFault_Handler /* 3:Hard Fault Handler */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word SVC_Handler /* 11:SVCall Handler */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word PendSV_Handler /* 14:PendSV Handler */ .word SysTick_Handler /* 15:SysTick Handler */ /* external interrupts handler */ .word WWDGT_IRQHandler /* 16:Window Watchdog Timer */ .word LVD_IRQHandler /* 17:LVD through EXTI Line detect */ .word RTC_IRQHandler /* 18:RTC through EXTI Line */ .word FMC_IRQHandler /* 19:FMC */ .word RCU_IRQHandler /* 20:RCU */ .word EXTI0_1_IRQHandler /* 21:EXTI Line 0 and EXTI Line 1 */ .word EXTI2_3_IRQHandler /* 22:EXTI Line 2 and EXTI Line 3 */ .word EXTI4_15_IRQHandler /* 23:EXTI Line 4 to EXTI Line 15 */ .word 0 /* Reserved */ .word DMA_Channel0_IRQHandler /* 25:DMA Channel 0 */ .word DMA_Channel1_2_IRQHandler /* 26:DMA Channel 1 and DMA Channel 2 */ .word DMA_Channel3_4_IRQHandler /* 27:DMA Channel 3 and DMA Channel 4 */ .word ADC_CMP_IRQHandler /* 28:ADC and Comparator */ .word TIMER0_BRK_UP_TRG_COM_IRQHandler /* 29:TIMER0 Break,Update,Trigger and Commutation */ .word TIMER0_Channel_IRQHandler /* 30:TIMER0 Channel Capture Compare */ .word 0 /* Reserved */ .word TIMER2_IRQHandler /* 32:TIMER2 */ .word TIMER5_IRQHandler /* 33:TIMER5 */ .word 0 /* Reserved */ .word TIMER13_IRQHandler /* 35:TIMER13 */ .word TIMER14_IRQHandler /* 36:TIMER14 */ .word TIMER15_IRQHandler /* 37:TIMER15 */ .word TIMER16_IRQHandler /* 38:TIMER16 */ .word I2C0_EV_IRQHandler /* 39:I2C0 Event */ .word I2C1_EV_IRQHandler /* 40:I2C1 Event */ .word SPI0_IRQHandler /* 41:SPI0 */ .word SPI1_IRQHandler /* 42:SPI1 */ .word USART0_IRQHandler /* 43:USART0 */ .word USART1_IRQHandler /* 44:USART1 */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word 0 /* Reserved */ .word I2C0_ER_IRQHandler /* 48:I2C0 Error */ .word 0 /* Reserved */ .word I2C1_ER_IRQHandler /* 50:I2C1 Error */ .size __gVectors, . - __gVectors .weak NMI_Handler ;定义了弱引用 .thumb_set NMI_Handler,Default_Handler ;如果用户没有实现中断,链接器会默认使用Default_Handler也就是死循环,防止未定义,中断发生时会进入死循环 .weak HardFault_Handler .thumb_set HardFault_Handler,Default_Handler .weak SVC_Handler .thumb_set SVC_Handler,Default_Handler .weak PendSV_Handler .thumb_set PendSV_Handler,Default_Handler .weak SysTick_Handler .thumb_set SysTick_Handler,Default_Handler .weak WWDGT_IRQHandler .thumb_set WWDGT_IRQHandler,Default_Handler .weak LVD_IRQHandler .thumb_set LVD_IRQHandler,Default_Handler .weak TAMPER_IRQHandler .thumb_set TAMPER_IRQHandler,Default_Handler .weak RTC_IRQHandler .thumb_set RTC_IRQHandler,Default_Handler .weak FMC_IRQHandler .thumb_set FMC_IRQHandler,Default_Handler .weak RCU_IRQHandler .thumb_set RCU_IRQHandler,Default_Handler .weak EXTI0_1_IRQHandler .thumb_set EXTI0_1_IRQHandler,Default_Handler .weak EXTI2_3_IRQHandler .thumb_set EXTI2_3_IRQHandler,Default_Handler .weak EXTI4_15_IRQHandler .thumb_set EXTI4_15_IRQHandler,Default_Handler .weak DMA_Channel0_IRQHandler .thumb_set DMA_Channel0_IRQHandler,Default_Handler .weak DMA_Channel1_2_IRQHandler .thumb_set DMA_Channel1_2_IRQHandler,Default_Handler .weak DMA_Channel3_4_IRQHandler .thumb_set DMA_Channel3_4_IRQHandler,Default_Handler .weak ADC_CMP_IRQHandler .thumb_set ADC_CMP_IRQHandler,Default_Handler .weak TIMER0_BRK_UP_TRG_COM_IRQHandler .thumb_set TIMER0_BRK_UP_TRG_COM_IRQHandler,Default_Handler .weak TIMER0_Channel_IRQHandler .thumb_set TIMER0_Channel_IRQHandler,Default_Handler .weak TIMER2_IRQHandler .thumb_set TIMER2_IRQHandler,Default_Handler .weak TIMER5_IRQHandler .thumb_set TIMER5_IRQHandler,Default_Handler .weak TIMER13_IRQHandler .thumb_set TIMER13_IRQHandler,Default_Handler .weak TIMER14_IRQHandler .thumb_set TIMER14_IRQHandler,Default_Handler .weak TIMER15_IRQHandler .thumb_set TIMER15_IRQHandler,Default_Handler .weak TIMER16_IRQHandler .thumb_set TIMER16_IRQHandler,Default_Handler .weak I2C0_EV_IRQHandler .thumb_set I2C0_EV_IRQHandler,Default_Handler .weak I2C1_EV_IRQHandler .thumb_set I2C1_EV_IRQHandler,Default_Handler .weak SPI0_IRQHandler .thumb_set SPI0_IRQHandler,Default_Handler .weak SPI1_IRQHandler .thumb_set SPI1_IRQHandler,Default_Handler .weak USART0_IRQHandler .thumb_set USART0_IRQHandler,Default_Handler .weak USART1_IRQHandler .thumb_set USART1_IRQHandler,Default_Handler .weak I2C0_ER_IRQHandler .thumb_set I2C0_ER_IRQHandler,Default_Handler .weak I2C1_ER_IRQHandler .thumb_set I2C1_ER_IRQHandler,Default_Handlergd32启动流程分析
张小明
前端开发工程师
轻量级通勤时间预测模型:用GNN+GPS轨迹复现路段级耗时预测
我注意到输入内容存在严重错位:标题是关于“Google Maps旅行时间预测算法的创造者”,但正文却是一篇推广Python依赖管理工具Poetry的技术博客,关键词仅为泛泛的“AI”,摘要也截断混乱。这明显不是一份可用的项目资料,而…
109、pytest 从入门到上瘾(三):mock、monkeypatch、fake——测试替身全家桶
109、pytest 从入门到上瘾(三):mock、monkeypatch、fake——测试替身全家桶 上周五晚上十一点,我盯着屏幕上那个诡异的测试失败日志,头皮发麻。一个支付模块的单元测试,明明逻辑没问题,却因为调用了真实的支付宝沙箱接口,网络超时导致整个CI流水线挂了。运维小哥在群里…
Bluekit PHaaS 平台 BitM 浏览器中间人钓鱼攻击机理与防御体系研究
摘要 传统代理型 AiTM 中间人钓鱼工具存在会话设备指纹不匹配、易被风险访问策略拦截的固有缺陷,新型 PHaaS 钓鱼平台 Bluekit 创新采用 Browser-in-the-Middle(BitM)浏览器中间人攻击架构,依托 rrweb 屏幕录制、WebSocket 实时数…
CX6 PFC / DCQCN sysfs 目录文件简述
CX6 PFC / DCQCN sysfs 目录文件简述1. PFC / QoS 相关目录路径:/sys/class/net/enp9s0f0np0/qos/当前文件:buffer_size maxrate prio2buffer tc_numprio2buffer描述 priority 到 buffer 的映射关系。示例:Priority Buffer 0 1 …
原神帧率解锁工具:打破60帧限制,开启丝滑游戏体验
原神帧率解锁工具:打破60帧限制,开启丝滑游戏体验 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 还在为原神60帧的画面卡顿而烦恼吗?这款原神帧率解锁…
Claude Sonnet 5 上线
Claude Sonnet 5 上线 Claude 把 Agent 模型打到更便宜,豆包继续补真实工作流,OpenAI 则把企业最头疼的内网工具接入问题拿出来单独解决。今天 AI 圈可以看的事不少,但真正值得普通读者停一下的,其实只有三件。 不是谁又发了一个小…