历史上的今天
返回首页

历史上的今天

今天是:2025年01月17日(星期五)

正在发生

2019年01月17日 | LPC2013 中的启动文件cstartup.s 详解

2019-01-17 来源:eefocus

操作系统:ucos-ii 2.52


编译器:IAR 5.4 

处理器: LPC2103




cstartup.s 与 在LPC2103上跑裸机的启动代码 lpc2xxx_cstartup.s 基本上一样,只是改了一些标号而已。




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;

;; Part one of the system initialization code,

;; contains low-level

;; initialization.

;;

;; Copyright 2006 IAR Systems. All rights reserved.

;;

;; $Revision: 21638 $

;;


        MODULE  ?cstartup


        ;; Forward declaration of sections.

        

        ;定义各种模式STACK,具体大小位置是由linker文件(相当于ADS中的分散加载)

        ;决定的,这些STACK都定义在内部RAM中

        SECTION IRQ_STACK:DATA:NOROOT(3)  ;jtk  NOROOT表示如果这个段里的标号没引用就被linker舍弃,ROOT则一定不舍弃

        SECTION ABT_STACK:DATA:NOROOT(3)  ;jtk  (1)表示字节对齐数,为2的幂,(2)表示4字节对齐,(3)表示8字节对齐

        SECTION SVC_STACK:DATA:NOROOT(3)

        SECTION UND_STACK:DATA:NOROOT(3)

        SECTION FIQ_STACK:DATA:NOROOT(3)

        SECTION CSTACK:DATA:NOROOT(3)


;

; The module in this file are included in the libraries, and may be

; replaced by any user-defined modules that define the PUBLIC symbol

; __iar_program_start or a user defined start symbol.

;

; To override the cstartup defined in the library, simply add your

; modified version to the workbench project.


;jtk 通常INTVEC段被连接到0地址,应该在.icf文件中有定义

        SECTION .intvec:CODE:NOROOT(2)


        PUBLIC  __vector  ;jtk PUBLIC声明可以被外部引用的标号

        PUBLIC  __vector_0x14

        PUBLIC  __iar_program_start

        EXTERN undef_handler, prefetch_handler, data_handler,

        EXTERN irq_handler, fiq_handler



        ARM

__vector:  

        ;jtk 绝对跳转,跳转到相应的异常处理程序,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节

        ;jtk 所以LDR PC, [PC,#24]跳转到24+8=32字节后

        ldr   pc,[pc,#+24]              ;; Reset jtk 跳转到__iar_program_start

        ldr   pc,[pc,#+24]              ;; Undefined instructions

        B   .                           ;; Software interrupt (SWI/SVC)

        ldr   pc,[pc,#+24]              ;; Prefetch abort

        ldr   pc,[pc,#+24]              ;; Data abort

__vector_0x14

        DC32  0                         ;; RESERVED

        ldr   pc,[pc,#+24]              ;; IRQ

        ldr   pc,[pc,#+24]              ;; FIQ

;jtk 上面的中断向量跳转到这里来,如果在c语言中有定义,

;下面的标号如果在c语言中有相应的处理程序,那么一旦有中断产生就会跳到相应的中断函数去

        DC32  __iar_program_start       ;; Reset

        DC32  undef_handler             ;; Undefined instructions

        DC32  0                         ;; Software interrupt (SWI/SVC)

        DC32  prefetch_handler          ;; Prefetch abort

        DC32  data_handler              ;; Data abort

        DC32  0                         ;; RESERVED

        DC32  irq_handler               ;; IRQ

        DC32  fiq_handler               ;; FIQ



; --------------------------------------------------

; ?cstartup -- low-level system initialization code.

;

; After a reser execution starts here, the mode is ARM, supervisor

; with interrupts disabled.

;




        SECTION .text:CODE:NOROOT(2)


;        PUBLIC  ?cstartup   ;jtk  ?xxx表示仅能由汇编访问的外部标号

        EXTERN  ?main

        ;REQUIRE强制__vector被引用,这样__vector就一定会被link了

        REQUIRE __vector     ;jtk  __xxx 表示可由C语言访问/定义的外部标号


        ARM


__iar_program_start:  ;jtk系统复位后从__iar_program_start开始执行

?cstartup:   ;jtk 这个不知道有什么用


;

; Add initialization needed before setup of stackpointers here.

;


; Errata  MAM.1Incorrect read of data from SRAM after Reset and MAM

; is not enabled or partially enabled.

; Work-around: User code should enable the MAM after Reset and before

; any RAM accesses

MAMCR    DEFINE  0xE01FC000     ; MAM Control Register

MAMTIM   DEFINE  0xE01FC004     ; MAM Timing register


        ldr     r0,=MAMCR

        ldr     r1,=MAMTIM

        ldr     r2,=0

        str     r2,[r0]   ;jtk 改变MAM定时值时先向MAMCR写入0来关闭MAM

        ldr     r2,=3     ; 1 < 20 MHz; 20 MHz < 2 < 40 MHz; 40MHz > 3

        str     r2,[r1]

        ldr     r2,=2     ;MAM功能全部使能

        str     r2,[r0]


; Initialize the stack pointers.

; The pattern below can be used for any of the exception stacks:

; FIQ, IRQ, SVC, ABT, UND, SYS.

; The USR mode uses the same stack as SYS.

; The stack segments must be defined in the linker command file,

; and be declared above.

;

; --------------------

; Mode, correspords to bits 0-5 in CPSR

MODE_BITS DEFINE  0x1F    ; Bit mask for mode bits in CPSR

USR_MODE  DEFINE  0x10    ; User mode

FIQ_MODE  DEFINE  0x11    ; Fast Interrupt Request mode

IRQ_MODE  DEFINE  0x12    ; Interrupt Request mode

SVC_MODE  DEFINE  0x13    ; Supervisor mode

ABT_MODE  DEFINE  0x17    ; Abort mode

UND_MODE  DEFINE  0x1B    ; Undefined Instruction mode

SYS_MODE  DEFINE  0x1F    ; System mode



;初始化堆栈指针

        MRS     r0, cpsr                ; Original PSR value


        BIC     r0, r0, #MODE_BITS      ; Clear the mode bits jtk 将r低5位清零

        ORR     r0, r0, #ABT_MODE       ; Set ABT mode bits

        MSR     cpsr_c, r0              ; Change the mode   jtk cpsr_c代表cpsr中的低8位,也就是控制位

        LDR     sp, =SFE(ABT_STACK)     ; End of ABT_STACK ;取ABT_STACK的末地址给sp


        BIC     r0, r0, #MODE_BITS      ; Clear the mode bits

        ORR     r0, r0, #SVC_MODE       ; Set SVC mode bits

        MSR     cpsr_c, r0              ; Change the mode

        LDR     sp, =SFE(SVC_STACK)     ; End of SVC_STACK


        BIC     r0, r0, #MODE_BITS      ; Clear the mode bits

        ORR     r0, r0, #UND_MODE       ; Set UND mode bits

        MSR     cpsr_c, r0              ; Change the mode

        LDR     sp, =SFE(UND_STACK)     ; End of UND_STACK


        BIC     r0, r0, #MODE_BITS      ; Clear the mode bits

        ORR     r0, r0, #FIQ_MODE       ; Set FIQ mode bits

        MSR     cpsr_c, r0              ; Change the mode

        LDR     sp, =SFE(FIQ_STACK)     ; End of FIQ_STACK


        BIC     r0, r0, #MODE_BITS      ; Clear the mode bits

        ORR     r0, r0, #IRQ_MODE       ; Set IRQ mode bits

        MSR     cpsr_c, r0              ; Change the mode

        LDR     sp, =SFE(IRQ_STACK)     ; End of IRQ_STACK


        BIC     r0 ,r0, #MODE_BITS      ; Clear the mode bits

        ORR     r0 ,r0, #SYS_MODE       ; Set System mode bits

        MSR     cpsr_c, r0              ; Change the mode

        LDR     sp, =SFE(CSTACK)        ; End of CSTACK


#ifdef __ARMVFP__

        ;; Enable the VFP coprocessor.


        MOV     r0, #0x40000000         ; Set EN bit in VFP

        FMXR    fpexc, r0               ; FPEXC, clear others.


;

; Disable underflow exceptions by setting flush to zero mode.

; For full IEEE 754 underflow compliance this code should be removed

; and the appropriate exception handler installed.

;


        MOV     r0, #0x01000000         ; Set FZ bit in VFP

        FMXR    fpscr, r0               ; FPSCR, clear others.

#endif


;

; Add more initialization here

;


; Continue to ?main for C-level initialization.


        LDR     r0, =?main

        BX      r0


        END

推荐阅读

史海拾趣

AUK Contractors Co Ltd公司的发展小趣事

近年来,电子行业面临着原材料成本上升、环保要求提高等多重挑战。AUK Contractors Co Ltd积极应对这些挑战,通过优化生产流程、采用环保材料等方式降低成本、提高效益。同时,公司还加大了对新能源、智能制造等领域的研发投入,实现了从传统电子制造向高科技领域的转型升级。

Cellergy公司的发展小趣事

为了进一步扩大市场份额,Cellergy公司积极寻求与其他电子企业的战略合作。通过与一家知名电子产品制造商的合作,Cellergy公司的电容器产品得以进入更广阔的市场。双方共同研发新产品,共享技术和市场资源,实现了互利共赢。这一合作不仅提升了Cellergy公司的知名度,也为其带来了更多的商业机会。

全志(Allwinner)公司的发展小趣事

2010年,平板电脑市场的崛起为全志科技带来了巨大的发展机遇。全志迅速调整产品策略,推出了AP处理器A系列,成功抓住了这一市场风口。其芯片产品在平板电脑领域的应用,不仅提升了公司的市场份额,也为公司的未来发展奠定了坚实的基础。

敦泰(FOCALTECH)公司的发展小趣事
电冰箱不制冷可能由多种电路问题引起,如电源线路故障(如插头未插紧、插座无电等)、压缩机启动电路故障(如启动器损坏、压缩机线圈断路等)、温控电路故障(如温控器失灵、温度传感器损坏等)或制冷系统电路故障(如制冷剂泄漏、毛细管堵塞等)。建议首先检查电源是否正常,然后逐步排查压缩机、温控器和制冷系统电路。
DL Instruments LLC公司的发展小趣事

DL Instruments LLC的前身是Ithaco Corporation的精密仪器部门。在Edgar Seymour总裁的领导下,这个部门于1995年被出售给当时担任Ithaco Corporation质量总监的David Woolston先生。这一决定标志着公司从一个大型企业的一个部门,转型为一个独立的、专注于精密仪器制造的新实体——DL Instruments LLC。

CDI-DIODE公司的发展小趣事

随着市场竞争的加剧,CDI-DIODE公司意识到传统的营销方式已经无法满足市场需求。于是,公司开始尝试新的营销策略,如线上推广、社交媒体营销等。这些创新的营销方式不仅提升了公司的知名度,也增强了与客户的互动和联系,进一步提升了品牌影响力。

问答坊 | AI 解惑

色环电阻计算工具

色环电阻计算工具…

查看全部问答>

请教版主:“你有新短消息”

我只要点击“你有新短消息”,页面立即退到登陆页面,说我还没有登陆,这是为什么?…

查看全部问答>

请教pxa270+WIFI8686!!!

用的PXA270和USI的无线网卡 8686芯片组 接口用的SPI 通过打印信息看总是在读取芯片ID时候出错: Chip(exp, val)= (000bh), ffffh)   //期望是000B ,实际FFFF pxa_gspi_Init is fault !!!!!!!!!!!!! If_Initialize is fault !!!!!!! ...…

查看全部问答>

关于给eboot添加USB下载功能

让eboot可以通过usb下载NK,有兄弟已实现的吗?给点提示吧! 我用的是nboot+eboot的启动方式,在网上也看了一些资料.问题主要出在中断上. 现在是按照下面的方法: eboot直接修改地址0x18的中断跳转指令,将它指向新的地址,指向自己的中断服务程 ...…

查看全部问答>

请问,pxa270 烧写wince 5时不能烧写至nand flash

请问,pxa270 烧写wince 5时不能烧写至nand flash: 出现以下错误: INFO: FlashErase: erasing flash A6600000 to A7C3FFFF.  Please wait... ................................................................................ .... ...…

查看全部问答>

STM32的SPI1DMA通道读取SPIflash,有若干细节问题处理及讨论

程序实现结果:      用stm32的一个SPI,用DMA方式读取spi flsh中的内容,然后将读到的数据用usart1 dma发到PC上,baud:115200; 选用的FLASH:W25X40  4M bit 电路接法:      stm ...…

查看全部问答>

NXP下载问题

前几天还是可以下载程序的,就是一两天没下载程序就变成这样了,有图,希望大家帮我解决下,大榭!!!!!!!!!!…

查看全部问答>

STM32F0 M0的IAP功能,执行APP后中断不正常

请教,我采用的是STM32F051的片子,想加入IAP的功能,但是发现程序可以从IAP跳转到APP,可是跳转之后APP的外部中断无法进入,但是APP的定时器中断是OK的,主函数的运行也是正常的,就是无法响应外部中断。不使用IAP跳转的时候APP是完全正才的。 参 ...…

查看全部问答>

AD9834原理图(99se)

AD9834原理图(99se) 延续ADI DIY活动及瑞萨DIY活动…

查看全部问答>

Win CE6.0下如何新建和修改GPIO驱动

以我的OK210开发板为例,介绍如何新建和修改ce6下的gpio驱动 只要按照步骤执行下去,即可建立一个新的GPIO驱动。并做如何修改GPIO驱动介绍。完成驱动开发的准备工作。 硬件平台:飞凌OK210 操作系统:飞凌光盘中的BSP,Win CE6.0 编译工具:VS2 ...…

查看全部问答>