cpu控制硬件原理
我们学习的所有指令,六大指令里边,只有内存访问指令能访问cpu之外的内容。那cpu如何控制硬件?*****load/store指令--》操作4G内存
任何一个芯片都有一个地址映射表。告诉你地址空间是如何映射的,便于我们找到对应的硬件地址。
我们的SOC型号是S5P6818,对应的芯片用户手册为:(推荐:急速PDF阅读器)
其中一章是:Memory map或Memory Controller 中的一张表中可以看地址隐射关系。
硬件控制原理:*****
CPU不能直接控制硬件,硬件是由其对应的控制器(寄存器)来控制的
每个控制器(寄存器)都会映射到CPU寻址范围内的一段空间
CPU通过对控制器(寄存器)的读和写实现对硬件间接的控制
cpu间接控制硬件。 on off on off off off
硬件板子介绍:
提供的工程模板里有一个map.lds,是指导程序如何排布。运行裸机程序首先需要看这个文件。
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x48c00000; //起始地址,异常向量表的起始地址
. = ALIGN(4);
.text : //代码段
{
./Start/start.o(.text)
//运行的第一段代码是start.s编译生成的.o
*(.text)
}
. = ALIGN(4);
.rodata : //只读
{ *(.rodata) }
. = ALIGN(4);
.data : //.data段
{ *(.data) }
. = ALIGN(4);
__bss_start = .;
.bss ://.bss
{ *(.bss) }
__bss_end__ = .;
}
start启动代码
start.S文件:
.text @ .:伪操作
.arm
.global _start
_start: @第一段代码
@ 第一条指令,内存地址0x43c00000
@ 异常向量表
b reset @直接通过跳转指令跳转到reset
b .
b .
b .
b .
b .
b irq @ IRQ异常对应的位置
b .
/* The actual reset code */
reset:
/* 将异常向量表的基地址重定向到0x43c00000,即这段代码执行后遇到IRQ后PC的值会变成0x43c000