首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

静态库中定义的IRQ符号不会覆盖ARM/GCC启动时的弱IRQ定义

静态库中定义的IRQ符号不会覆盖ARM/GCC启动时的弱IRQ定义。这是因为在链接过程中,静态库中的符号会被链接器解析并与目标文件中的符号进行匹配。当静态库中的符号与目标文件中的符号冲突时,链接器会选择目标文件中的符号作为最终的定义。

在ARM/GCC启动时,通常会定义一些弱IRQ符号,这些符号的定义是为了提供默认的中断处理函数。当静态库中也定义了相同的IRQ符号时,链接器会选择目标文件中的弱IRQ定义,而不会使用静态库中的定义。

静态库是一种包含预编译的目标文件的归档文件,它可以被链接到应用程序中以提供额外的功能。静态库中的符号可以被应用程序使用,但不会覆盖目标文件中的符号定义。

静态库的优势在于它可以提供代码的重用性和模块化,可以减少代码的冗余和维护成本。它适用于需要频繁使用的功能模块,可以提高开发效率和代码的可维护性。

对于静态库中定义的IRQ符号,其应用场景通常是在嵌入式系统或操作系统开发中,用于处理硬件中断。通过定义IRQ符号,可以实现对硬件中断的处理和响应。

腾讯云提供了一系列与云计算相关的产品和服务,包括云服务器、云数据库、云存储、人工智能等。具体推荐的产品和产品介绍链接地址可以根据具体需求和场景进行选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【嵌入式开发】ARM 异常向量表 ( 异常概念 | 异常处理流程 | 异常向量 | 汇编代码 )

; 使用 _start: 标明程序的入口标号是 _start; 5.定义标号( 类似于函数名 ) : 定义自定义标号, 格式 标号:, 例如 irq:; ( 1 ) 定义标号执行的指令 : 标号下面定义要执行的指令...nop 表示 什么操作都不执行; 7.定义标号 ( 类似于变量 ) : 定义一个标号, 在标号中存放 32 位的值, 定义格式 标号: .word 存储值的内容; ( 1 ) 示例 : _irq...: .word irq, 定义 _irq 标号, .word 表示该标号存储的是 32 位值, 这个值的大小就是 irq 地址; 8.分支指令 : 当异常发生的时候, 需要跳转到对应的异常处理指令中;...装载 到 寄存器中; ( 2 ) 代码示例 : a.定义标号 ( 函数 ) : 定义要执行的指令的标号 irq , 即跳转到该标号处, 就开始执行标号下面的指令, irq : nop ; b....定义标号 ( 变量 ) : 定义一个标号 _irq , 用于存放一个 32 位的值, 这里用于存放 上面 定义的标号 地址, _irq .word irq c.装载地址到 pc 寄存器 : ldr pc

3.7K10

ARM(十三).WatchDog1

选项卡中确保时钟频率和板载一致 正确设定内存(只读栈和读写栈,也就是代码区与数据区的大小) 选择H-JTAG ARM 模式 选择正确的模式 使用外部工具 代码示例 wtd.s 这是主汇编程序,定义了中断向量表...;GET伪指令将startup_head.s包含到此文件中,startup_head.s是初始化配置 IMPORT main ;IMPORT伪指令指示编译器当前的符号不是在本源文件中定义的...,而是在其它源文件中定义的,在本源文件中可能引用该符号,main定义在c源文件中 AREA RESET, CODE, READONLY ;定义一个名为RESET的只读代码段 CODE32...可以被其它文件引用,[WEAK] 指定该选项后,如果symbol在所有的源程序中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该标号 SUB...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR

78640
  • ARM(十).RTC and TICK(1)

    GET startup_head.s ;GET伪指令将startup_head.s包含到此文件中,startup_head.s是初始化配置 IMPORT main ;IMPORT伪指令指示编译器当前的符号不是在本源文件中定义的...,而是在其它源文件中定义的,在本源文件中可能引用该符号,main定义在c源文件中 IMPORT handle_tick ;handle_tick定义在c源文件中 AREA RESET...[WEAK] ;EXPORT声明一个符号IRQ_Handler可以被其它文件引用,[WEAK] 指定该选项后,如果symbol在所有的源程序中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被...INCLUDE进来的库中去查找该标号 SUB LR, LR, #4 ;LR连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR

    87230

    ARM(九).RTC and ALARM(1)

    GET startup_head.s ;GET伪指令将startup_head.s包含到此文件中,startup_head.s是初始化配置 IMPORT main ;IMPORT伪指令指示编译器当前的符号不是在本源文件中定义的...,而是在其它源文件中定义的,在本源文件中可能引用该符号,main定义在c源文件中 IMPORT arlar_int_fun ;arlar_int_fun定义在c源文件中 AREA RESET...[WEAK] ;EXPORT声明一个符号IRQ_Handler可以被其它文件引用,[WEAK] 指定该选项后,如果symbol在所有的源程序中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被...INCLUDE进来的库中去查找该标号 SUB LR, LR, #4 ;LR连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR

    83310

    ARM(六).TIMER and IRQ(1)

    ;GET伪指令将startup_head.s包含到此文件中,startup_head.s是初始化配置 IMPORT kain ;IMPORT伪指令指示编译器当前的符号不是在本源文件中定义的,...而是在其它源文件中定义的,在本源文件中可能引用该符号,Main定义在c源文件中 IMPORT Handle_Timer0 ;Handle_EINT0定义在c源文件中 AREA RESET...[WEAK] ;EXPORT声明一个符号IRQ_Handler可以被其它文件引用,[WEAK] 指定该选项后,如果symbol在所有的源程序中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被...INCLUDE进来的库中去查找该标号 SUB LR, LR, #4 ;LR连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR

    65830

    ARM(五).EINT and IRQ(1)

    GET startup_head.s ;GET伪指令将startup_head.s包含到此文件中,startup_head.s是初始化配置 IMPORT Main ;IMPORT伪指令指示编译器当前的符号不是在本源文件中定义的...,而是在其它源文件中定义的,在本源文件中可能引用该符号,Main定义在c源文件中 IMPORT Handle_EINT0 ;Handle_EINT0定义在c源文件中 IMPORT Handle_EINT1...[WEAK] ;EXPORT声明一个符号IRQ_Handler可以被其它文件引用,[WEAK] 指定该选项后,如果symbol在所有的源程序中都没有被定义,编译器也不会产生任何错误信息...,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该标号 SUB LR, LR, #4 ;LR连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到

    58730

    ARM(七).TIMER and PWM(1)

    GET startup_head.s ;GET伪指令将startup_head.s包含到此文件中,startup_head.s是初始化配置 IMPORT main ;IMPORT伪指令指示编译器当前的符号不是在本源文件中定义的...,而是在其它源文件中定义的,在本源文件中可能引用该符号,Main定义在c源文件中 IMPORT hander_timer0 ;hander_timer0定义在c源文件中 AREA RESET...[WEAK] ;EXPORT声明一个符号IRQ_Handler可以被其它文件引用,[WEAK] 指定该选项后,如果symbol在所有的源程序中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被...INCLUDE进来的库中去查找该标号 SUB LR, LR, #4 ;LR连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR

    39530

    ARM(十四).WatchDog with IRQ

    (只读栈和读写栈,也就是代码区与数据区的大小) 选择H-JTAG ARM 模式 选择正确的模式 使用外部工具 代码示例 wtd_irq.s 这是主汇编程序,定义了中断向量表,进行了各种初始化 GET...包含到此文件中,startup_head.s是初始化配置 IMPORT main ;IMPORT伪指令指示编译器当前的符号不是在本源文件中定义的,而是在其它源文件中定义的,在本源文件中可能引用该符号...[WEAK] ;EXPORT声明一个符号IRQ_Handler可以被其它文件引用,[WEAK] 指定该选项后,如果symbol在所有的源程序中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被...INCLUDE进来的库中去查找该标号 SUB LR, LR, #4 ;LR连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR

    99640

    ARM(十二).ADC with IRQ1

    Target not created 选择H-JTAG ARM 模式 选择正确的模式 使用外部工具 代码示例 adc_irq.s 这是主汇编程序,定义了中断向量表,进行了各种初始化 GET s3c2410...包含到此文件中,startup_head.s是初始化配置 IMPORT main ;IMPORT伪指令指示编译器当前的符号不是在本源文件中定义的,而是在其它源文件中定义的,在本源文件中可能引用该符号...[WEAK] ;EXPORT声明一个符号IRQ_Handler可以被其它文件引用,[WEAK] 指定该选项后,如果symbol在所有的源程序中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被...INCLUDE进来的库中去查找该标号 SUB LR, LR, #4 ;LR连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR

    76220

    ARM(三).UART with FIFO(2)

    是初始化配置 IMPORT main ;IMPORT伪指令指示编译器当前的符号不是在本源文件中定义的,而是在其它源文件中定义的,在本源文件中可能引用该符号,main定义在c源文件中 IMPORT...代表禁止所有中断,使用ARM模式,进入中断模式) LDR SP, =IRQStack_BASE ;IRQStack_BASE在另一个文件中定义,将中断模式中的堆栈指针SP指到IRQStack_BASE...[WEAK] ;EXPORT声明一个符号IRQ_Handler可以被其它文件引用,[WEAK] 指定该选项后,如果symbol在所有的源程序中都没有被定义,编译器也不会产生任何错误信息...,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该标号 SUB LR, LR, #4 ;LR连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到

    30210

    高通平台8953 Linux DTS(Device Tree Source)设备树详解之三(高通MSM8953 android7.1实例分析篇)

    =; }; }; 2.1,其中compatible属性标识的名字是与驱动程序中名字相匹配的 2.2,其中reg属性及@符号后的十六进制数字标识了该设备iqs263...的i2c地址为0x44 2.3,&i2c_8前的&表明此处仅仅是对i2c_8节点的补充,我们可以找到该节点定义的地方 kernel\arch\arm64\boot\dts\qcom\msm8953.dtsi...,可以看到定义了该i2c接口的时钟源、中断格式等。...-0 属性指向了表明其io口属性的节点为iqs263_irq_config,相关代码也在2.3.1指示的msm8953-pinctrl.dtsi文件中。...其中定义了iqs263的中断IO脚为Gpio48 2.5,iqs263节点中的vdd-supply,vio-supply属性指示了表明iqs263芯片供电的引脚的节点pm8953_l5,代码如下 kernel

    1.9K60

    ARM(十一).ADC(1)

    选项卡中确保时钟频率和板载一致 正确设定内存(只读栈和读写栈,也就是代码区与数据区的大小) 选择H-JTAG ARM 模式 选择正确的模式 使用外部工具 代码示例 adc.s 这是主汇编程序,定义了中断向量表...;GET伪指令将startup_head.s包含到此文件中,startup_head.s是初始化配置 IMPORT main ;IMPORT伪指令指示编译器当前的符号不是在本源文件中定义的...,而是在其它源文件中定义的,在本源文件中可能引用该符号,main定义在c源文件中 AREA RESET, CODE, READONLY ;定义一个名为RESET的只读代码段 CODE32...,[WEAK] 指定该选项后,如果symbol在所有的源程序中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该标号 SUB LR, LR, #4...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR

    54940

    ARM(八).RTC(1)

    包含到此文件中,startup_head.s是初始化配置 IMPORT main ;IMPORT伪指令指示编译器当前的符号不是在本源文件中定义的,而是在其它源文件中定义的,在本源文件中可能引用该符号...代表禁止所有中断,使用ARM模式,进入中断模式) LDR SP, =IRQStack_BASE ;IRQStack_BASE在另一个文件中定义,将中断模式中的堆栈指针SP指到IRQStack_BASE...;B Default_IRQ_ISR代表啥都不干(因为上面对Default_IRQ_ISR中的操作定义就是啥都没干) EINT1_Handle B Default_IRQ_ISR...,[WEAK] 指定该选项后,如果symbol在所有的源程序中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该标号 SUB LR, LR, #4...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR

    1.2K30

    【嵌入式开发】ARM 看门狗 Watchdog ( 看门狗概念 | 看门狗原理 | 时钟控制寄存器 | 定时器数据寄存器 | 定时器计数寄存器 | 定时器中断清理寄存器 | 关闭看门狗代码编写 )

    计数 超时时间 ; 2.WTCNT 超时时间设置 : WTDAT 寄存器的值 不会自动被加载到 看门狗 定时器 计数器中 ; 3.默认初始值 : 使用 0x8000 作为计时器 默认的 超时时间,...; 2.初始值设置 : 当看门狗 计时器 最初工作时, WTDAT 寄存器中的值 不会自动装载入 WTCNT 寄存器中, WTCNT 寄存器 在开始工作前必须设置一个初始值; ---- 4....0x7E004000 ; 2.定义调用标号 : 在 汇编 代码中定义 一个标号, 用于 标记关闭看门狗的指令 地址 , 使用 bl 指令 跳转到该标号处, 即可执行 关闭看门狗的操作, 代码 disable_watchdog...: C 代码编译成同名的 .o 文件, %.o : %.c , 产生过程是 arm-linux-gcc -g -c $^ ; 3.设置最终目标 : 使用 all: 设置最终编译目标; ( 1...o : %.S #通用规则, 如 start.o 是由 start.S 编译来的, -c 是只编译不链接 arm-linux-gcc -g -c $^ %.o : %.c #通用规则

    4.1K40

    ARM(十五).IIC with IRQ

    Target not created 选择H-JTAG ARM 模式 选择正确的模式 使用外部工具 代码示例 iic_irq.s 这是主汇编程序,定义了中断向量表,进行了各种初始化 GET s3c2410...包含到此文件中,startup_head.s是初始化配置 IMPORT main ;IMPORT伪指令指示编译器当前的符号不是在本源文件中定义的,而是在其它源文件中定义的,在本源文件中可能引用该符号...[WEAK] ;EXPORT声明一个符号IRQ_Handler可以被其它文件引用,[WEAK] 指定该选项后,如果symbol在所有的源程序中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被...INCLUDE进来的库中去查找该标号 SUB LR, LR, #4 ;LR连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR

    99220

    第1阶段——uboot分析之硬件初始化start.S(4)

    // .globl定义一个全局符号"_start",表明_start这个符号要被链接器用到 2 _start: //_start:系统复位设置,以下共...声明全局符号_start,在 board/100ask24x0/u-boot.lds中ENTRY(_start)这里用到 其中符号保存的地址都在顶层目录/system.map中列出来了 system.map...将中断IRQ所对应的是R14_irq寄存器并放入到 PC 中,如下图,中断IRQ所对应的是R14_irq寄存器,执行MOVS R14_svc . ? b....8.清bss段(未初始的全局/静态变量) 9.跳转到start_armboot函数(位于u-boot-1.1.6/lib_arm/borad.c,用来实现第2阶段硬件相关的初始化) 本章小结: uboot...8.清bss段(未初始的全局/静态变量) 9.跳转到start_armboot函数(位于u-boot-1.1.6/lib_arm/borad.c,用来实现第2阶段硬件相关的初始化) 接下来开始分析uboot

    1.2K80

    start_kernel函数部分分析

    start_kernel函数分析 1. set_task_stack_end_magic(&init_task); 抽取关键部分 //找到栈顶位置并设置个魔术字,防止堆栈 将 thread_info 的数据覆盖...smp_on_up; #else return true; #endif } 我的是imx6ull板子,不是对称多处理器,这里宏没定义,直接返回false。...所以mpidr 为0 3. local_irq_disable 暂时禁止本地中断, 设置完相关的东西后再开启 // 禁止本地中断 local_irq_disable raw_local_irq_disable...set_cpu_online set_cpu_active set_cpu_present set_cpu_possible 5.page_address_init 初始化高端内存线性地址中永久映射的全局变量...version 4.9.4 (Linaro GCC 4.9-2017.01) " 7. setup_arch 初始化体系相关的部分,实现与体系和芯片有关 // 初始化体系相关的部分,实现与体系和芯片有关

    35110

    第014课 Jz2400_ARM异常与中断体系详解

    ,那么我就不需要保存 系统/用户模式下的R8 ~ R12这几个寄存器,在FIQ模式下有自己专属的R8 ~ R12寄存器,省略保存寄存器的时间,加快处理速度 但是在Linux中并不会使用FIQ模式 2 处理...-c -o led.o led.c arm-linux-gcc -c -o uart.o uart.c arm-linux-gcc -c -o init.o init.c arm-linux-gcc...arm-linux-gcc -c -o init.o init.c arm-linux-gcc -c -o main.o main.c arm-linux-gcc -c -o start.o...,可以百度搜索 arm-linux-gcc 汇编 定义字符串 * *官方的说明文档 *http://web.mit.edu/gnu/doc/html/as_7.html .string "str" Copy...中定义函数指针数组 typedef void(*irq_func)(int); 定义一个数组,我们来卡看下这里有多少项,一共32位,我们想把每一个中断的处理函数都放在这个数组里面来,当发生中断时

    1.6K20

    linux性能工具--ftrace框架

    模式: 在生产者已经把Ring Buffer空间写满的情况下,如果没有消费者来读数据free空间,生产者会覆盖写入,最老的数据会被覆盖; 其次,从架构图中,我们面对有很多的写者,对于同一个per cpu...读操作不会中断写操作,但是写操作会中断读操作 支持两种模式的读操作:简易读,也叫iterator读,在读取时会关闭写入,且读完不会破坏数据可以重复读取,实例见"/sys/kernel/debug/tracing...在gcc使用了"-gp“选项以后,会在每个函数入口插入以下的语句 每个函数入口处插入对_mcount()函数的调用,就是gcc提供的插桩机制,我们可以重新定义_mcount()函数中的内容,调用想要执行的内容...对于tracer自身而言,是不是需要-pg选项,因此在kernel/tracing/Makefile中将-pg选项中由我们自己定义 2.1.1 静态插桩 我们来看看ARM64如何处理的,其代码路径为arch...event,上面学习了function,本节是学习event,其也离不开如下流程 trace event的插桩使用的是tracepoint机制,该机制是一种静态的插桩方法,它需要静态的定义桩函数,并且在插桩位置显式调用

    1.1K10

    RTOS内功修炼记(三)—— 内核到底是如何管理中断的?

    NVIC在 ARM Conrtex-M 内核中,用一个 8 位的寄存器来配置,总共可以配置 级中断,但是 ST 公司在生产 STM32 的时候,发现一个小小的单片机根本用不了这么多,纯属浪费,所以将该寄存器的低...STM32 HAL库的中断处理 STM32提供的HAL库中提供了默认的中断处理函数,在stm32l4xx_it.c中,以外部中断为例: ?...通过HAL库的实现机制,最终会调用到弱定义的回调函数: __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { UNUSED(GPIO_Pin...① 变量的定义 TencentOS-tiny中用来记录这一数值的全局变量在tos_global.c中定义: k_nesting_t k_irq_nest_cnt...总结一下就是: 「RTOS的中断处理程序不会返回原来被中断的任务,而是返回到系统中存在的最高优先级任务,只有中断处理程序的编写,与裸机程序有两点不同,其余一模一样」: ① 在进入之后调用一次tos_knl_irq_enter

    2.4K21
    领券