从一开始就发生ARM中断(Cortex-M4)

71GA

我正在处理NXP的新型微控制器LPC4088。我需要2周的时间来研究和编写外围设备的工作示例:IOCONFIG,GPIO,TIMERS,PWM和ADC。请在这里查看我的存储库这就是您如何了解我的工作方式和技能水平的方式。

到现在为止,我只能禁用中断并在没有中断的情况下工作。现在我要处理需要中断的UART外围设备我从未编程过中断,但对ARM中断有所了解。可悲的是,从理论上讲目前,我正在研究以下两个文档:

对我来说很清楚,除了LPC4088微控制器之外,我还需要研究ARM Cortex-M4微处理器,这是我不知所措的。我知道我应该将ARM异常向量放在程序的开头-通常在启动代码中。但是我不知道该怎么做,因为我用微控制器得到的已经编译后的启动代码(目标文件),它大概定义了异常向量,复位处理程序为C设置了堆栈,然后跳转到C源代码中的main()函数用户编写的代码。

使用GCC ARM编译器编译程序后,我总是收到此提示,这一定是我不了解的线索,因为我对ARM mcpu的经验不足:

*****
***** You must modify vector checksum value in *.bin and *.hex files.
*****

我当时在考虑使用Segger Jlink反向启动启动代码并在其中修复异常向量,但是除了编写自己的开源启动代码外,还必须有其他方法...所以您有什么建议或示例,甚至对我来说更好。


添加:我真的很努力,没有启动代码的源代码。这就是我得到的:

在此处输入图片说明

因此,必须以某种方式操纵向量的唯一方法必须隐藏在链接描述文件中,这是仍然是源代码的唯一部分,它看起来像这样:

/* Linker script for mbed LPC1768 */

/* Linker script to configure memory regions. */
MEMORY
{
  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 512K
  RAM (rwx) : ORIGIN = 0x100000E8, LENGTH = (64K - 0xE8)

  USB_RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 16K
  ETH_RAM(rwx) : ORIGIN = 0x20004000, LENGTH = 16K
}

/* Linker script to place sections and symbol values. Should be used together
 * with other linker script that defines memory regions FLASH and RAM.
 * It references following symbols, which must be defined in code:
 *   Reset_Handler : Entry of reset handler
 * 
 * It defines following symbols, which code can use without definition:
 *   __exidx_start
 *   __exidx_end
 *   __etext
 *   __data_start__
 *   __preinit_array_start
 *   __preinit_array_end
 *   __init_array_start
 *   __init_array_end
 *   __fini_array_start
 *   __fini_array_end
 *   __data_end__
 *   __bss_start__
 *   __bss_end__
 *   __end__
 *   end
 *   __HeapLimit
 *   __StackLimit
 *   __StackTop
 *   __stack
 */
ENTRY(Reset_Handler)

SECTIONS
{
    .text :
    {
        KEEP(*(.isr_vector))
        *(.text*)

        KEEP(*(.init))
        KEEP(*(.fini))

        /* .ctors */
        *crtbegin.o(.ctors)
        *crtbegin?.o(.ctors)
        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
        *(SORT(.ctors.*))
        *(.ctors)

        /* .dtors */
        *crtbegin.o(.dtors)
        *crtbegin?.o(.dtors)
        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
        *(SORT(.dtors.*))
        *(.dtors)

        *(.rodata*)

        KEEP(*(.eh_frame*))
    } > FLASH

    .ARM.extab : 
    {
        *(.ARM.extab* .gnu.linkonce.armextab.*)
    } > FLASH

    __exidx_start = .;
    .ARM.exidx :
    {
        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    } > FLASH
    __exidx_end = .;

    __etext = .;

    .data : AT (__etext)
    {
        __data_start__ = .;
        Image$$RW_IRAM1$$Base = .;
        *(vtable)
        *(.data*)

        . = ALIGN(4);
        /* preinit data */
        PROVIDE (__preinit_array_start = .);
        KEEP(*(.preinit_array))
        PROVIDE (__preinit_array_end = .);

        . = ALIGN(4);
        /* init data */
        PROVIDE (__init_array_start = .);
        KEEP(*(SORT(.init_array.*)))
        KEEP(*(.init_array))
        PROVIDE (__init_array_end = .);


        . = ALIGN(4);
        /* finit data */
        PROVIDE (__fini_array_start = .);
        KEEP(*(SORT(.fini_array.*)))
        KEEP(*(.fini_array))
        PROVIDE (__fini_array_end = .);

        . = ALIGN(4);
        /* All data end */
        __data_end__ = .;

    } > RAM


    .bss :
    {
        __bss_start__ = .;
        *(.bss*)
        *(COMMON)
        __bss_end__ = .;
        Image$$RW_IRAM1$$ZI$$Limit = . ;
    } > RAM


    .heap :
    {
        __end__ = .;
        end = __end__;
        *(.heap*)
        __HeapLimit = .;
    } > RAM

    /* .stack_dummy section doesn't contains any symbols. It is only
     * used for linker to calculate size of stack sections, and assign
     * values to stack symbols later */
    .stack_dummy :
    {
        *(.stack)
    } > RAM

    /* Set stack top to end of RAM, and stack limit move down by
     * size of stack_dummy section */
    __StackTop = ORIGIN(RAM) + LENGTH(RAM);
    __StackLimit = __StackTop - SIZEOF(.stack_dummy);
    PROVIDE(__stack = __StackTop);

    /* Check if data + heap + stack exceeds RAM limit */
    ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")


    /* Code can explicitly ask for data to be 
       placed in these higher RAM banks where
       they will be left uninitialized. 
    */
    .AHBSRAM0 (NOLOAD):
    {
        Image$$RW_IRAM2$$Base = . ;
        *(AHBSRAM0)
        Image$$RW_IRAM2$$ZI$$Limit = .;
    } > USB_RAM

    .AHBSRAM1 (NOLOAD):
    {
        Image$$RW_IRAM3$$Base = . ;
        *(AHBSRAM1)
        Image$$RW_IRAM3$$ZI$$Limit = .;
    } > ETH_RAM
}

还有一个看起来像这样的makefile,它会在每次编译结束时提示我:

# This file was automagically generated by mbed.org. For more information, 
# see http://mbed.org/handbook/Exporting-to-GCC-ARM-Embedded

GCC_BIN = 
PROJECT = executaable
OBJECTS = ./main.o 
SYS_OBJECTS = ./mbed/TARGET_LPC4088/TOOLCHAIN_GCC_ARM/startup_LPC408x.o ./mbed/TARGET_LPC4088/TOOLCHAIN_GCC_ARM/retarget.o ./mbed/TARGET_LPC4088/TOOLCHAIN_GCC_ARM/system_LPC407x_8x_177x_8x.o ./mbed/TARGET_LPC4088/TOOLCHAIN_GCC_ARM/board.o ./mbed/TARGET_LPC4088/TOOLCHAIN_GCC_ARM/cmsis_nvic.o 
INCLUDE_PATHS = -I. -I./mbed -I./mbed/TARGET_LPC4088 -I./mbed/TARGET_LPC4088/TOOLCHAIN_GCC_ARM -I./mbed/TARGET_LPC4088/TARGET_NXP -I./mbed/TARGET_LPC4088/TARGET_NXP/TARGET_LPC408X -I./mbed/TARGET_LPC4088/TARGET_NXP/TARGET_LPC408X/TARGET_LPC4088 
LIBRARY_PATHS = -L./mbed/TARGET_LPC4088/TOOLCHAIN_GCC_ARM 
LIBRARIES = -lmbed 
LINKER_SCRIPT = ./mbed/TARGET_LPC4088/TOOLCHAIN_GCC_ARM/LPC4088.ld

############################################################################### 
AS      = $(GCC_BIN)arm-none-eabi-as
CC      = $(GCC_BIN)arm-none-eabi-gcc
CPP     = $(GCC_BIN)arm-none-eabi-g++
LD      = $(GCC_BIN)arm-none-eabi-gcc
OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy
OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump
SIZE    = $(GCC_BIN)arm-none-eabi-size

CPU = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer
CC_FLAGS += -MMD -MP
CC_SYMBOLS = -DTARGET_LPC4088 -DTARGET_M4 -DTARGET_CORTEX_M -DTARGET_NXP -DTARGET_LPC408X -DTOOLCHAIN_GCC_ARM -DTOOLCHAIN_GCC -D__CORTEX_M4 -DARM_MATH_CM4 -D__FPU_PRESENT=1 -DMBED_BUILD_TIMESTAMP=1429428454.91 -D__MBED__=1 

LD_FLAGS = $(CPU) -Wl,--gc-sections --specs=nano.specs -u _printf_float -u _scanf_float -Wl,--wrap,main
LD_FLAGS += -Wl,-Map=$(PROJECT).map,--cref
LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys

ifeq ($(DEBUG), 1)
  CC_FLAGS += -DDEBUG -O0
else
  CC_FLAGS += -DNDEBUG -Os
endif

all: $(PROJECT).bin $(PROJECT).hex 

clean:
    rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS)

.s.o:
    $(AS) $(CPU) -o $@ $<

.c.o:
    $(CC)  $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99   $(INCLUDE_PATHS) -o $@ $<

.cpp.o:
    $(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 -fno-rtti $(INCLUDE_PATHS) -o $@ $<


$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
    $(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS)
    @echo ""
    @echo "*****"
    @echo "***** You must modify vector checksum value in *.bin and *.hex files."
    @echo "*****"
    @echo ""
    $(SIZE) $@

$(PROJECT).bin: $(PROJECT).elf
    @$(OBJCOPY) -O binary $< $@

$(PROJECT).hex: $(PROJECT).elf
    @$(OBJCOPY) -O ihex $< $@

$(PROJECT).lst: $(PROJECT).elf
    @$(OBJDUMP) -Sdh $< > $@

lst: $(PROJECT).lst

size:
    $(SIZE) $(PROJECT).elf

DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
-include $(DEPS)
对这个网站太老实了

好,花了我几分钟 在此zip中签出项目之一有各种启动代码。顺便说一句:编写自己的并不是那么复杂。大多数时候,无论如何,对于“实际”项目,都必须对其进行修改。

压缩文件来自此页面第二个zip可能包含喜欢的文件,但可能不包含gcc(不过“ keil”可能是一个不错的开始)。但是您已经有一个开始。

我只是看了periph_blinky。请注意,启动始终必须与链接程序脚本相对应,因为其中有一些特殊的部分。为了阅读,我建议您查看binutils文档,当然还有gcc文档。

正如我在CMSIS函数注释中提到的库和MCU定义的标头中所述,还应该有一些库。CMSIS的内容也可以从ARM获取,但是可能需要一些调整才能适应实际的实现(MPU区域的数量等)。

哦,我建议不要使用供应商库进行外围设备访问。它们可能被称为“标准”,但实际上并非如此,但是大多数情况下都包含大量膨胀,如运行时初始化(对每个成员使用单独的写操作!),这些结构永远不会改变。不确定恩智浦,但是例如STM提供了我见过的最烂的“标准”库之一。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

代码执行利用 Cortex M4

来自分类Dev

代码执行利用 Cortex M4

来自分类Dev

ARM Cortex M4硬故障-浮点

来自分类Dev

Ocaml是否适用于ARM cortex M4?

来自分类Dev

了解Cortex M4上的周期计数

来自分类Dev

--host 为 cortex m4 编译时的 ./configure 标志

来自分类Dev

ARM Cortex M4和C,如何为特定的c文件指定RAM部分

来自分类Dev

ARM Cortex M4处理器的仿真

来自分类Dev

stmdb指令似乎无法正常工作-Cortex M4 / SAM4L

来自分类Dev

修改Comipler RT汇编代码以针对Arm Cortex M3 / M4进行编译(CPSR / APSR位操作)

来自分类Dev

用于Cortex M4的Bootloader-跳至已加载的应用程序

来自分类Dev

C ++初始化程序上的Cortex M4硬故障

来自分类Dev

为什么会出现未对齐的内存访问错误?[Cortex M4]

来自分类Dev

Barebox引导程序在cortex m4上可以工作吗?

来自分类Dev

CORTEX M4:关于 BX 和 BLX 指令以及 LR 的位 (0) 的混淆

来自分类Dev

如何在 Cortex M4 上设置辅助控制寄存器位

来自分类Dev

ARM Cortex M4处理器中经过时间的测试C代码中的错误SEGV

来自分类Dev

如何在M4宏中缩进一段文本

来自分类Dev

m4宏,使用可变数量的选项卡将一列对齐

来自分类Dev

M4 pushdef 在另一个宏上下文中

来自分类Dev

如何从一开始就在jquery中重复单击事件,好像什么也没发生

来自分类Dev

遍历M4的dumpdef

来自分类Dev

如何从一开始就启动vim?

来自分类Dev

组织结构图从一开始就崩溃了

来自分类Dev

从一开始的Objective-C启动循环

来自分类Dev

枚举每个组中从一开始的行

来自分类Dev

数组从一开始就不为空

来自分类Dev

点击提交后,网站从一开始就刷新

来自分类Dev

从一开始的Objective-C启动循环

Related 相关文章

热门标签

归档