在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 39455|回复: 62

[原创] 初学者,FreeARM终于跑起来了,折腾了一两天

[复制链接]
发表于 2013-3-23 14:34:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 chen.terry 于 2013-3-23 14:38 编辑

首先得感谢Free arm牛人为我们提供一个小巧的ARM核,没有这个核,艰难程度不可想象。因为需要学习SOC方面的知识,所以准备自己一步一步的搭建一个SOC仿真环境。不想使用太复杂的技术,只想使用C和verilog,简单化。下面是我的仿真工程。

project.rar (308.74 KB, 下载次数: 595 )

说明一下:
(1)project是顶层目录,子目录arm9、keil_arm9、sim。
(2)子目录arm9存放的是arm cpu核。
(3)keil_arm9是KEIL ARM UV4,用于生成*.bin文件。
(4)sim是仿真目录。

实验方法,打开modelsim,切换工作目录到sim目录下,然后在modelsim的命令窗口中输入do arm9_tb.do,然后run 100us,能看到一串字符A输出。
如果修改了keil工程中的汇编或者C程序,需要重新编译,keil设置的用户命令fromelf.exe --bin keil_arm9.axf --output ..\\sim\\arm9.bin会自动在sim目录下产生arm9.bin文件。

我是初学者,个人感觉比较难的是为ARM建立C运行时环境,我是裁减的NXP的一款芯片的启动文件。现在上面跑通了,然后再自己新建arm9的内核工程。
汇编粘贴如下:

; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
Mode_USR        EQU     0x10
Mode_FIQ        EQU     0x11
Mode_IRQ        EQU     0x12
Mode_SVC        EQU     0x13
Mode_ABT        EQU     0x17
Mode_UND        EQU     0x1B
Mode_SYS        EQU     0x1F

I_Bit           EQU     0x80            ; when I bit is set, IRQ is disabled
F_Bit           EQU     0x40            ; when F bit is set, FIQ is disabled


; Internal Memory Base Addresses
IRAM_BASE       EQU     0x08000000
IROM_BASE       EQU     0x0C000000

; External Memory Base Addresses
DYN_MEM0_BASE   EQU     0x80000000   
DYN_MEM1_BASE   EQU     0xA0000000
STA_MEM0_BASE   EQU     0xE0000000
STA_MEM1_BASE   EQU     0xE1000000
STA_MEM2_BASE   EQU     0xE2000000
STA_MEM3_BASE   EQU     0xE3000000

;----------------------- Stack and Heap Definitions ----------------------------
;// <h> Stack Configuration (Stack Sizes in Bytes)
;//   <o0> Undefined Mode      <0x0-0xFFFFFFFF:8>
;//   <o1> Supervisor Mode     <0x0-0xFFFFFFFF:8>
;//   <o2> Abort Mode          <0x0-0xFFFFFFFF:8>
;//   <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8>
;//   <o4> Interrupt Mode      <0x0-0xFFFFFFFF:8>
;//   <o5> User/System Mode    <0x0-0xFFFFFFFF:8>
;// </h>

UND_Stack_Size  EQU     0x00000008
SVC_Stack_Size  EQU     0x00000008
ABT_Stack_Size  EQU     0x00000008
FIQ_Stack_Size  EQU     0x00000008
IRQ_Stack_Size  EQU     0x00000080
USR_Stack_Size  EQU     0x0003E000

ISR_Stack_Size  EQU     (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \
                         FIQ_Stack_Size + IRQ_Stack_Size)

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   USR_Stack_Size
__initial_sp    SPACE   ISR_Stack_Size
Stack_Top


;// <h> Heap Configuration
;//   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF>
;// </h>
Heap_Size       EQU     0x00000000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

; Area Definition and Entry Point
; Startup Code must be linked first at Address at which it expects to run.

                AREA    RESET, CODE, READONLY
                ARM

; Exception Vectors
Vectors         LDR     PC,Reset_Addr         
                LDR     PC,Undef_Addr
                LDR     PC,SWI_Addr
                LDR     PC,PAbt_Addr
                LDR     PC,DAbt_Addr
                LDR     PC,IRQ_Addr     
                LDR     PC,FIQ_Addr

Reset_Addr      DCD     Reset_Handler
Undef_Addr      DCD     Undef_Handler
SWI_Addr        DCD     SWI_Handler
PAbt_Addr       DCD     PAbt_Handler
DAbt_Addr       DCD     DAbt_Handler
                ;DCD     0               ; Reserved Address
IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

Undef_Handler   B       Undef_Handler
SWI_Handler     B       SWI_Handler
PAbt_Handler    B       PAbt_Handler
DAbt_Handler    B       DAbt_Handler
IRQ_Handler     B       IRQ_Handler
FIQ_Handler     B       FIQ_Handler


; Reset Handler

                EXPORT  Reset_Handler
Reset_Handler   
  
; Setup Stack for each mode ----------------------------------------------------

                LDR     R0, =Stack_Top

;  Enter Undefined Instruction Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #UND_Stack_Size

;  Enter Abort Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #ABT_Stack_Size

;  Enter FIQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #FIQ_Stack_Size

;  Enter IRQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #IRQ_Stack_Size

;  Enter Supervisor Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #SVC_Stack_Size

;  Enter User Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_USR

                MOV     SP, R0
                SUB     SL, SP, #USR_Stack_Size

; Enter the C code

                IMPORT  __main
                LDR     R0, =__main
                BX      R0
                               
; User Initial Stack & Heap
                AREA    |.text|, CODE, READONLY

                IMPORT  __use_two_region_memory
                               
                EXPORT  __user_initial_stackheap
__user_initial_stackheap

                LDR     R0, =  Heap_Mem
                LDR     R1, =(Stack_Mem + USR_Stack_Size)
                LDR     R2, = (Heap_Mem +      Heap_Size)
                LDR     R3, = Stack_Mem
                BX      LR

                END
发表于 2013-3-25 13:41:10 | 显示全部楼层
支持你一下!好好干!
发表于 2013-4-13 01:17:25 | 显示全部楼层
hehe he buco
发表于 2013-4-13 22:29:27 | 显示全部楼层
不错,支持一下
发表于 2013-4-29 22:49:30 | 显示全部楼层
恭喜恭喜
发表于 2013-5-3 15:04:19 | 显示全部楼层
牛人,支持你
发表于 2013-5-16 10:18:15 | 显示全部楼层
頂一下!下載學習
发表于 2013-5-30 14:14:43 | 显示全部楼层
thanks for sharing
发表于 2013-6-4 17:56:40 | 显示全部楼层
谢谢楼主分享!
发表于 2013-7-4 22:46:04 | 显示全部楼层
学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-16 19:09 , Processed in 0.040506 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表