Arm Raspberry Pi:嵌入式编程练习,入门

Arm Raspberry Pi:嵌入式编程练习,入门,arm,cross-compiling,raspberry-pi,Arm,Cross Compiling,Raspberry Pi,首先,我在这里学习本教程() 在第一个练习中,您将了解如何寻址负责打开绿色OK LED的GPIO引脚。我有Raspberry pi的C版,据我所知,它使用Broadcom(BCM2835)微处理器,其外围设备有以下数据表:() 我已经阅读了数据表第89页至104页,但我仍然迷路。作者提供的程序似乎无法运行,即使提供了交叉编译器构建链。从作者提供的源代码中剥离注释我有: .section .init .global _start _start: ldr r0, =0x20200000 /

首先,我在这里学习本教程()

在第一个练习中,您将了解如何寻址负责打开绿色OK LED的GPIO引脚。我有Raspberry pi的C版,据我所知,它使用Broadcom(BCM2835)微处理器,其外围设备有以下数据表:()

我已经阅读了数据表第89页至104页,但我仍然迷路。作者提供的程序似乎无法运行,即使提供了交叉编译器构建链。从作者提供的源代码中剥离注释我有:

.section .init
.global _start
_start:
  ldr r0, =0x20200000

  /* Enable output on the 16th pin */
  mov r1, #1
  lsl r1, #18
  str r1, [r0, #4]

  /* Turn the pin off to turn LED light on */
  mov r1,#1
  lsl r1,#16
  str r1, [r0, #40]

loop$:
  /* Keep the system running */
  b loop$
我被卡住的地方是,在数据表中,我看不到关于地址0x20200000的任何信息。从表6-2的第91页开始,我们可以看到描述前32位的表格。在表6-1中,我们看到了寄存器描述。第一个寄存器的地址为0x7E200000。我试着用这个地址代替它,但我还是没能把灯打开

底线LED灯不亮,所以我可以学习,我应该去哪里获取有关如何调试的信息?第二,我错过了什么

如果有用的话,这里有一个我正在添加到SD卡的img文件的hexdump

mehoggan@mehoggan-desktop:~/Devel/scripts/assembly/raspberry-pi-mini-os/example1$ make clean all
rm -f build/*.o 
rm -f build/output.elf
rm -f kernel.img
rm -f kernel.list
rm -f kernel.map
../arm-2008q3/bin/arm-none-eabi-as -I source/ source/main.s -o build/main.o
../arm-2008q3/bin/arm-none-eabi-ld --no-undefined build/main.o -Map kernel.map -o build/output.elf -T kernel.ld
../arm-2008q3/bin/arm-none-eabi-objcopy build/output.elf -O binary kernel.img 
../arm-2008q3/bin/arm-none-eabi-objdump -d build/output.elf > kernel.list
mehoggan@mehoggan-desktop:~/Devel/scripts/assembly/raspberry-pi-mini-os/example1$ 

hexdump -C ./kernel.img 
00000000  18 00 9f e5 01 10 a0 e3  01 19 a0 e1 04 10 80 e5  |................|
00000010  01 10 a0 e3 01 18 a0 e1  28 10 80 e5 fe ff ff ea  |........(.......|
00000020  00 00 20 20                                       |..  |

编辑
这是.list文件

00000000 <_start>:
   0:   e59f0018    ldr r0, [pc, #24]   ; 20 <loop$+0x4>
   4:   e3a01001    mov r1, #1  ; 0x1
   8:   e1a01901    lsl r1, r1, #18
   c:   e5801004    str r1, [r0, #4]
  10:   e3a01001    mov r1, #1  ; 0x1
  14:   e1a01801    lsl r1, r1, #16
  18:   e5801028    str r1, [r0, #40]

0000001c <loop$>:
  1c:   eafffffe    b   1c <loop$>
  20:   20200000    .word   0x20200000
从原理图(以及找到此代码的链接页面)中,gpio 16连接到该状态指示灯

我陷入困境的地方是,在数据表中,我看不到关于地址的任何信息 0x20200000

车身控制模块手册第6页中的情况并非如此:

外围设备的物理地址范围为0x20000000到0x20FFFFFF。外围设备的总线地址设置为映射到从0x7E000000开始的外围总线地址范围。因此,在总线地址0x7ENNNNN处播发的外设在以下位置可用: 物理地址0x20nnnnnn

这样,从示例程序0x20200000获取的信息将变为0x7E200000,即gpio寄存器

具体而言,0x7E200004是GPFSEL1


GPFSEL1的描述说位模式001使引脚成为输出,它显示gpio 16寄存器中的位是位18-20,因此我们想将位模式001置于位181@dwelch重新启动一秒钟,我会告诉你的。我仍然不知道常数去了哪里,尝试更改ldr r0,=0x2020000至两线mov r0,#0x20000000;orr r0,r0,#0x00200000 broadcom文档确实描述了gpio,您将看到包含外围设备的内存空间从0x7E000000开始,映射到0x20000000的ARM内存空间。因此,0x7E20000处的外设是0x20200000处arm内存空间中的地址。该示意图显示了哪个gpio引脚连接到LED。raspberrypi.org论坛对这些示例进行了详细描述。
e59f0018
e3a01001
e1a01901
e5801004
e3a01001
e1a01801
e5801028
eafffffe
20200000