S3C6410的启动代码分析nbsp;一

2024-08-22 19:18

本文主要是介绍S3C6410的启动代码分析nbsp;一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文开始第一篇,启动代码的编写,注意,仅仅是启动代码,并不是bootloader,因为只有boot,没有loader。

       第一要明确:CPU上电之后,会从某个固定地址执行指令。ARM结构的CPU从地址0x00000000开始执行指令,MIPS结构的CPU将会从0XBFC00000取第一条指令并执行。(注意,这个地址是CPU的统一编址,需要把存储器件ROM或者flash映射到这个地址上

       第二要知道启动代码需要做那些事情:

                1、异常向量表

                2、禁看门狗,禁中断

                3、设置系统时钟

                4、初始化存储控制器

                5、设置各个模式下的堆栈

                6、跳转到C环境执行

       第三,要知道CPU的七种工作模式:

                 用户模式:程序正常运行的模式,不能直接从用户模式切换到其他模式

                 系统模式:支持操作系统的特权任务,与用户模式类似,但是可以直接切换到其他模式

                 管理模式:供操作系统使用的保护模式,只有在系统复位和软中断响应后,才能进入该模式

                 终止模式:用于虚拟内存和存储器保护的模式,对程序存储器或数据存储器访问失败时,进入此模式

                 未定义模式:只有在未定义指令异常响应时,才进入该模式

                 中断模式:在IRQ(普通中断)响应时,进入该模式

                 快速中断模式:在FIQ(快速中断)响应时,进入该模式。

        以上做一个简要的前提知识介绍,仅仅了解这些还不够,请自行查阅相关资料。下面我们来实现一个简单的boot代码,不懂汇编的,赶快去学 :-(

                 ARM上电后,从地址0x00000000取指并执行,但是从地址0x00000000开始一直到0x0000001c,都是异常向量表的位置,不要问我为什么,因为硬件是这么做的 :-(

                       [0x00000000] b ResetHandler    ;--CPU上电即在0地址执行这句跳转代码

                       [0x00000004] b UndHandler      ;--CPU遇到未定义指令时,跳转到此地址执行

                       [0x00000008] b SWIHandler      ;--CPU遇到软中断时,跳转到此地址执行

                       [0x0000000c] b PaAbort            ;--CPU取指令出错时,跳转到此地址执行

                       [0x00000010] b DaAbort           ;--CPU取数据出错时,跳转到该地址执行

                       [0x00000014] b 0x00000014;   ;--该地址保留,啥叫保留,就是占个位子,不使用....能否省略,写下句代码?答案是不行!

                       [0x00000018] b IRQHandler     ;--CPU碰到中断时,跳转到该地址执行

                       [0x0000001c] b FIQHandler     ;--CPU碰到快速中断时,跳转到该地址执行。

       本文主要写管理模式的代码,其他模式暂时忽略,以后讨论。本文将点亮开发板上的LED4灯,其他三个LED是灭的。(我用的是OK6410的板子)

                        ResetHandler

                                                ldr r0,=WTCON    ;禁止看门狗

                                                ldr r1,=0x0

                                                str r1,[r0]

                                                

                                                ldr r0,=GPMCON    

                                                ;从地板原理图看出四个LED灯接在GPM接口,那么我们就控制GPMCON寄存器即可,此处把GPMCON的地址写入r0寄存器

                                                ldr r1,=0x111111     ;将数值0x111111

                                                str r1,[r0]                 ;向GPMCON寄存器中写入0x111111直,是的GPM口都作为数据输出口。

                                                ldr r0,=GPMDAT     ;将GPMDAT寄存器地址写入r0

                                                ldr r1,=~(1<<3)       ;向r1寄存器写入二进制 111值

                                                str r1,[r0]                ;向GPMDAT寄存器写入111值,此时可以看到开发板的LED4亮,其他三个LED是灭的

                                                b halt                      ;进入死循环

                        halt

                                                 b halt

                         以下这些代码都是CPU其他工作模式下的代码,本文仅仅是做了一个简单的死循环处理,以后会讨论各种模式的使用方法。

                         HandlerUndef

                                                b HandlerUndef

                         HandlerSWI

                                                b HandlerSWI

                         HandlerPabort

                                                 b HandlerPabort

                         HandlerDabort

                                                 b HandlerDabort

                         HandlerIRQ

                                                 b HandlerIRQ

                         HandlerFIQ

                                                 b HandlerFIQ

          注意,本文代码没有禁中断,没有设置各个模式的堆栈,没有初始化sdram,也没有跳转到C预言执行环境,仅仅是点亮了一盏led灯,是最简单的一个启动代码,在连接选项中要设置Robase 为0x0地址,映像文件入口地址为0x0,映像文件头为startup.o,section为Init。如下图:

             

               

              

              调试方法:使用J-link v8进行调试,首先你得买j-link,Ok6410不带这个仿真器。然后装好驱动Setup_JLinkARM_V410i.zip,按照S3C6410的JLink的调试方法.pdf这个文档配置好开发环境,期间会提示缺少jlinkarm.dll,直接从j-link安装文件夹里把这个文件拷贝过去即可,然后使用axd进行调试。

这篇关于S3C6410的启动代码分析nbsp;一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1097155

相关文章

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Python实现一键PDF转Word(附完整代码及详细步骤)

《Python实现一键PDF转Word(附完整代码及详细步骤)》pdf2docx是一个基于Python的第三方库,专门用于将PDF文件转换为可编辑的Word文档,下面我们就来看看如何通过pdf2doc... 目录引言:为什么需要PDF转Word一、pdf2docx介绍1. pdf2docx 是什么2. by

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

Spring Security介绍及配置实现代码

《SpringSecurity介绍及配置实现代码》SpringSecurity是一个功能强大的Java安全框架,它提供了全面的安全认证(Authentication)和授权(Authorizatio... 目录简介Spring Security配置配置实现代码简介Spring Security是一个功能强

通过cmd获取网卡速率的代码

《通过cmd获取网卡速率的代码》今天从群里看到通过bat获取网卡速率两段代码,感觉还不错,学习bat的朋友可以参考一下... 1、本机有线网卡支持的最高速度:%v%@echo off & setlocal enabledelayedexpansionecho 代码开始echo 65001编码获取: >