从图中可以看出,LED0
接到了 GPIO_3
上,GPIO_3
就是 GPIO1_IO03
,当 GPIO1_IO03
输出低电平(0)的时候发光二极管 LED0
就会导通点亮,当 GPIO1_IO03
输出高电平(1)的时候发 光二极管 LED0
不会导通,因此 LED0
也就不会点亮。
每个模块的时钟可以独立的关闭,下表详细说明了每个模块可能的时钟活动条件:
GPIO1
时钟由 CCM_CCGR1[CG13]
控制。
IOMUXC
时钟配置:
0、模块时钟 - 根时钟 - 模块时钟控制开关
1、IPT_CLK_IO
- LCDIF_PIX_CLK_ROOT
- CCGR2[CG7](IOMUX_IPT_CLK_IO_ENABLE)
。
2、IPG_CLK_S - IPG_CLK_ROOT
- IPG_CLK_ROOT
- CCGR2[CG2](IOMUXC_SNVS_CLK_ENABLE)
。
3、IPG_CLK_S - IPG_CLK_ROOT
- IPG_CLK_ROOT
- CCGR3[CG15](IOMUXC_SNVS_GPR_CLK_ENABLE)
。
4、IPG_CLK_S - IPG_CLK_ROOT
- IPG_CLK_ROOT
- CCGR4[CG1](IOMUXC_CLK_ENABLE)
。
5、IPG_CLK_S - IPG_CLK_ROOT
- IPG_CLK_ROOT
- CCGR4[CG2](IOMUXC_GPR_CLK_ENABLE)
。
注:CCM_CCGRx
寄存器复位后值为 11
,也就是复位后所有外设时钟都被打开。
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
寄存器控制复用功能。复用功能在《参考手册》第 32 章中描述。
当 MUX_MODE
值为 0x0101
时,选择复用功能为 GPIO1_IO03
。SION
必须为 0
。默认情况,复用功能就是GPIO1_IO03。
IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
寄存器控制电气属性。电气属性在《参考手册》中第 28 章中描述。
HSY
:使能迟滞比较器。PUS
:设置上下拉电阻。PUE
:设置 IO
使用上下拉还是状态保持器(输出使用上下拉,输入使用状态保持器)。PKE
:使能或者禁止上下拉/状态保持器功能。ODE
:禁止或者使能开路输出。SPEED
:设置 IO
速度。:设置
IO` 的驱动能力。SRE
:设置压摆率。详细内容看手册。
不需要配置。
1、修改 GPIOx_GDIR
寄存器控制输入或输出。
2、操作 GPIOx_DR
寄存器控制引脚电平。
1、将 .c
或 .s
文件变为 .o
文件(使用 gcc
工具)。
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
-g
选项是产生调试信息,GDB
能够使用这些调试信息进行代码调试。-c
选项是编译源文件,但是不链接。-o
选项是指定编译产生的文件名字。2、将所有 .o
文件链接为 elf
格式可执行文件(使用 ld
工具)。
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
-Ttext
就是指定链接地址。-o
选项指定链接生成的 elf
文件名。3、将 elf
文件转为 bin
文件。
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
-O
选项指定以什么格式输出。binary
表示以二进制格式输出。-S
表示不要复制源文件中的重定位信息和符号信息。-g
表示不复制源文件中的调试信息。4、将 elf
文件转为汇编(反汇编)。
arm-linux-gnueabihf-objdump -D led.elf > led.dis
-D
选项表示反汇编所有的段。特别说明:
链接就是将所有 .o
文件链接在一起,并且指定链接起始地址。链接以后所有元素就有固定地址,所以运行地址和链接地址要一致,否则运行时函数调用或变量寻址可能出现异常。
对于 6ULL
可以运行代码位置有内部 RAM
(OCRAM
(地址:0x0090_0000 - 0091_FFFF
))和 DDR
(前提 DDR
初始化成功(地址:从 0x8000_0000
开始))。裸机实验中使用 DDR
,DDR
的初始化通过在 bin
文件添加的头部将数据传递给 6ULL
内部 boot
,由内部 boot
完成相关初始化。内部 boot
可以从 SD
、EMMC
等外置存储器中读取头部信息。
bin
文件头部格式见《参考手册》中 IVT
、Boot data
和 DCD
章节。
链接起始地址选为 0x87800000
,因为这个地址是 uboot
链接地址,方便记忆。
保留
保留
保留
使用 imxdownload
向 SD
卡烧写 led.bin
文件,命令格式如下:
./imxdownload <.bin file> <SD Card>
其中 .bin
就是要烧写的 .bin
文件,SD Card
就是你要烧写的 SD
卡,比如我的电脑使用如下命令烧写 led.bin
到 /dev/sdd
中:
./imxdownload led.bin /dev/sdb //不能烧写到/dev/sda 或 sda1 设备里面!那是系统磁盘
onlylove@ubuntu:~/linux/driver/board_driver/1_leds$ ls
imxdownload led.bin led.dis led.elf led.o led.s leds.code-workspace Makefile
onlylove@ubuntu:~/linux/driver/board_driver/1_leds$ ./imxdownload led.bin /dev/sdb
I.MX6ULL bin download software
Edit by:zuozhongkai
Date:2019/6/10
Version:V1.1
log:V1.0 initial version,just support 512MB DDR3
V1.1 and support 256MB DDR3
file led.bin size = 88Bytes
Board DDR SIZE: 512MB
Delete Old load.imx
Create New load.imx
Download load.imx to /dev/sdb ......
[sudo] password for onlylove:
6+1 records in
6+1 records out
3160 bytes (3.2 kB, 3.1 KiB) copied, 0.0136816 s, 231 kB/s
onlylove@ubuntu:~/linux/driver/board_driver/1_leds$
.global _start /* 全局标号 */
/*
* 描述: _start 函数,程序从此函数开始执行此函数完成时钟使能、
* GPIO 初始化、最终控制 GPIO 输出低电平来点亮 LED 灯。
*/
/* 从官方SDK中摘取
* CCM->CCGR0 = 0x00C0000FU;
* CCM->CCGR1 = 0xF00C0000U;
* CCM->CCGR2 = 0x003F0030U;
* CCM->CCGR3 = 0xFF3CC300U;
* CCM->CCGR4 = 0x0000F3FCU;
* CCM->CCGR5 = 0x00330033U;
* CCM->CCGR6 = 0x00CC0300U;
*/
_start:
/* 1、使能 GPIO1 时钟(设置 CCM_CCGR1[CG13] 为 0x11) */
ldr r0, =0X020C4068 /* CCGR0 */
ldr r1, =0xFFFFFFFF
str r1, [r0]
ldr r0, =0X020C406C /* CCGR1 */
str r1, [r0]
ldr r0, =0X020C4070 /* CCGR2 */
str r1, [r0]
ldr r0, =0X020C4074 /* CCGR3 */
str r1, [r0]
ldr r0, =0X020C4078 /* CCGR4 */
str r1, [r0]
ldr r0, =0X020C407C /* CCGR5 */
str r1, [r0]
ldr r0, =0X020C4080 /* CCGR6 */
str r1, [r0]
/* 2、设置 GPIO1_IO03 复用为 GPIO1_IO03 */
ldr r0, =0X020E0068
ldr r1, =0X5 /* 将寄存器 SW_MUX_GPIO1_IO03_BASE 加载到 r0 中 */
str r1,[r0] /* 设置寄存器 SW_MUX_GPIO1_IO03_BASE 的 MUX_MODE 为5 */
/* 3、配置 GPIO1_IO03 的 IO 属性
* bit 16:0 HYS 关闭
* bit [15:14]: 00 默认下拉
* bit [13]: 0 kepper 功能
* bit [12]: 1 pull/keeper 使能
* bit [11]: 0 关闭开路输出
* bit [7:6]: 10 速度 100Mhz
* bit [5:3]: 110 R0/6 驱动能力
* bit [0]: 0 低转换率
*/
ldr r0, =0X020E02F4
ldr r1, =0X10B0
str r1,[r0]
/* 4、设置 GPIO1_IO03 为输出 */
ldr r0, =0X0209C004 /*寄存器 GPIO1_GDIR */
ldr r1, =0X0000008
str r1,[r0]
/* 5、打开 LED0
* 设置 GPIO1_IO03 输出低电平
*/
ldr r0, =0X0209C000 /*寄存器 GPIO1_DR */
ldr r1, =0
str r1,[r0]
loop:
b loop
1、设置处理器工作模式。
2、设置 SP
指针。
3、跳转到 main
函数。
ARM
架构函数调用栈遵循 APCS
规则。
ARM
采用满栈(降栈)。
1、设置 C
语言环境,并跳转到 main
。
.global __start /* 全局标号 */
/*
* 描述: _start 函数,程序从此函数开始执行,此函数主要功能是设置 C 运行环境。
* 注:I.MX6U 内部的 Boot ROM 会读取 DCD 数据中的 DDR 配置参数然后完成 DDR 初始化。
*/
__start:
/* 设置处理器进入 SVC 模式 */
mrs r0, cpsr /* 将 r0 的低 5 位清零,也就是 cpsr 的 M0~M4 */
bic r0, r0, #0x1f /* r0或上 0x13,表示使用 SVC 模式 */
orr r0, r0, #0x13 /* 将 r0 的数据写入到 cpsr_c 中 */
msr cpsr, r0
ldr sp, =0X80200000 /* 设置栈指针 */
b main /* 跳转到 main 函数 */
2、寄存器地址映射
#ifndef __MAIN_H__
#define __MAIN_H__
/*
* CCM相关寄存器地址
*/
#define CCM_CCGR0 *((volatile unsigned int *)0X020C4068)
#define CCM_CCGR1 *((volatile unsigned int *)0X020C406C)
#define CCM_CCGR2 *((volatile unsigned int *)0X020C4070)
#define CCM_CCGR3 *((volatile unsigned int *)0X020C4074)
#define CCM_CCGR4 *((volatile unsigned int *)0X020C4078)
#define CCM_CCGR5 *((volatile unsigned int *)0X020C407C)
#define CCM_CCGR6 *((volatile unsigned int *)0X020C4080)
/*
* IOMUX 相关寄存器地址
*/
#define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)
#define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)
/*
* GPIO1 相关寄存器地址
*/
#define GPIO1_DR *((volatile unsigned int *)0X0209C000)
#define GPIO1_GDIR *((volatile unsigned int *)0X0209C004)
#define GPIO1_PSR *((volatile unsigned int *)0X0209C008)
#define GPIO1_ICR1 *((volatile unsigned int *)0X0209C00C)
#define GPIO1_ICR2 *((volatile unsigned int *)0X0209C010)
#define GPIO1_IMR *((volatile unsigned int *)0X0209C014)
#define GPIO1_ISR *((volatile unsigned int *)0X0209C018)
#define GPIO1_EDGE_SEL *((volatile unsigned int *)0X0209C01C)
#endif
3、编写 led
闪烁代码
#include "main.h"
/*
* 使能 I.MX6U 所有外设时钟
*/
void clk_enable(void)
{
CCM_CCGR0 = 0xffffffff;
CCM_CCGR1 = 0xffffffff;
CCM_CCGR2 = 0xffffffff;
CCM_CCGR3 = 0xffffffff;
CCM_CCGR4 = 0xffffffff;
CCM_CCGR5 = 0xffffffff;
CCM_CCGR6 = 0xffffffff;
}
void led_init(void)
{
/* 1、初始化 IO 复用, 复用为 GPIO1_IO03 */
SW_MUX_GPIO1_IO03 = 0x5;
/* 2、配置 GPIO1_IO03 的 IO 属性
* bit 16:0 HYS 关闭
* bit [15:14]: 00 默认下拉
* bit [13]: 0 kepper 功能
* bit [12]: 1 pull/keeper 使能
* bit [11]: 0 关闭开路输出
* bit [7:6]: 10 速度 100Mhz
* bit [5:3]: 110 R0/6 驱动能力
* bit [0]: 0 低转换率
*/
SW_PAD_GPIO1_IO03 = 0X10B0;
/* 3、初始化 GPIO, GPIO1_IO03 设置为输出 */
GPIO1_GDIR = 0X0000008;
/* 4、设置 GPIO1_IO03 输出低电平,打开 LED0 */
GPIO1_DR = 0X0;
}
/*
* 打开 LED 灯
*/
void led_on(void)
{
GPIO1_DR &= ~(1<<3);
}
/*
* 关闭 LED 灯
*/
void led_off(void)
{
GPIO1_DR |= (1<<3);
}
void delay_short(volatile unsigned int n)
{
while(n--){
}
}
void delay(volatile unsigned int n)
{
while(n--){
delay_short(0x7ff);
}
}
int main(void)
{
clk_enable();
led_init();
while(1){
led_off();
delay(500);
led_on();
delay(500);
}
return 0;
}
4、设计可执行文件映像结构
注:通过链接脚本完成,详细信息见链接器用户手册。
链接脚本用于描述文件应该如何被链接在一起形成最终的可执行文件。其主要目的是描述输入文件中的段如何被映射到输出文件中,并且控制输出文件中的内存排布。
SECTIONS{
. = 0X87800000; /* 设置定位计数器(链接起始地址) */
.text :
{
start.o /* 开始位置的文件为start.o, start.o 里面包含着第一个要执行的指令 */
main.o /* */
*(.text)
}
.rodata ALIGN(4) : {
*(.rodata*)}
.data ALIGN(4) : {
*(.data) }
__bss_start = .; /* '.' 为定位符, __bss_start 标志方便对 .bss 段清零 */
.bss ALIGN(4) : {
*(.bss) *(COMMON) }
__bss_end = .;
}
5、编写 Makefile
objs := start.o main.o
ledc.bin:$(objs)
arm-linux-gnueabihf-ld -T imx6ul.lds -o ledc.elf $^
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis
%.o:%.s
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
%.o:%.S
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
%.o:%.c
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
clean:
rm -rf *.o ledc.bin ledc.elf ledc.dis
1、编译结果
onlylove@ubuntu:~/linux/driver/board_driver/2_ledc$ ls
imx6ul.lds main.c main.h Makefile start.s
onlylove@ubuntu:~/linux/driver/board_driver/2_ledc$ make
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o start.o start.s
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o main.o main.c
arm-linux-gnueabihf-ld -T imx6ul.lds -o ledc.elf start.o main.o
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf ledc.bin
arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis
onlylove@ubuntu:~/linux/driver/board_driver/2_ledc$ ls
imx6ul.lds ledc.bin ledc.dis ledc.elf main.c main.h main.o Makefile start.o start.s
2、ledc.dis
内容
ledc.elf: file format elf32-littlearm
Disassembly of section .text:
87800000 <__start>:
87800000: e10f0000 mrs r0, CPSR
87800004: e3c0001f bic r0, r0, #31
87800008: e3800013 orr r0, r0, #19
8780000c: e129f000 msr CPSR_fc, r0
87800010: e51fd000 ldr sp, [pc, #-0] ; 87800018 <__start+0x18>
87800014: ea000061 b 878001a0 <__main_from_arm>
87800018: 80200000 eorhi r0, r0, r0
8780001c: 00001e41 andeq r1, r0, r1, asr #28
87800020: 61656100 cmnvs r5, r0, lsl #2
87800024: 01006962 tsteq r0, r2, ror #18
87800028: 00000014 andeq r0, r0, r4, lsl r0
8780002c: 412d3705 teqmi sp, r5, lsl #14
87800030: 070a0600 streq r0, [sl, -r0, lsl #12]
87800034: 09010841 stmdbeq r1, {r0, r6, fp}
87800038: 00040a02 andeq r0, r4, r2, lsl #20
8780003c :
8780003c: b480 push {r7}
8780003e: af00 add r7, sp, #0
87800040: f244 0368 movw r3, #16488 ; 0x4068
87800044: f2c0 230c movt r3, #524 ; 0x20c
87800048: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff
8780004c: 601a str r2, [r3, #0]
8780004e: f244 036c movw r3, #16492 ; 0x406c
87800052: f2c0 230c movt r3, #524 ; 0x20c
87800056: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff
8780005a: 601a str r2, [r3, #0]
8780005c: f244 0370 movw r3, #16496 ; 0x4070
87800060: f2c0 230c movt r3, #524 ; 0x20c
87800064: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff
87800068: 601a str r2, [r3, #0]
8780006a: f244 0374 movw r3, #16500 ; 0x4074
8780006e: f2c0 230c movt r3, #524 ; 0x20c
87800072: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff
87800076: 601a str r2, [r3, #0]
87800078: f244 0378 movw r3, #16504 ; 0x4078
8780007c: f2c0 230c movt r3, #524 ; 0x20c
87800080: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff
87800084: 601a str r2, [r3, #0]
87800086: f244 037c movw r3, #16508 ; 0x407c
8780008a: f2c0 230c movt r3, #524 ; 0x20c
8780008e: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff
87800092: 601a str r2, [r3, #0]
87800094: f44f 4381 mov.w r3, #16512 ; 0x4080
87800098: f2c0 230c movt r3, #524 ; 0x20c
8780009c: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff
878000a0: 601a str r2, [r3, #0]
878000a2: 46bd mov sp, r7
878000a4: f85d 7b04 ldr.w r7, [sp], #4
878000a8: 4770 bx lr
878000aa: bf00 nop
878000ac :
878000ac: b480 push {r7}
878000ae: af00 add r7, sp, #0
878000b0: 2368 movs r3, #104 ; 0x68
878000b2: f2c0 230e movt r3, #526 ; 0x20e
878000b6: 2205 movs r2, #5
878000b8: 601a str r2, [r3, #0]
878000ba: f44f 733d mov.w r3, #756 ; 0x2f4
878000be: f2c0 230e movt r3, #526 ; 0x20e
878000c2: f241 02b0 movw r2, #4272 ; 0x10b0
878000c6: 601a str r2, [r3, #0]
878000c8: f24c 0304 movw r3, #49156 ; 0xc004
878000cc: f2c0 2309 movt r3, #521 ; 0x209
878000d0: 2208 movs r2, #8
878000d2: 601a str r2, [r3, #0]
878000d4: f44f 4340 mov.w r3, #49152 ; 0xc000
878000d8: f2c0 2309 movt r3, #521 ; 0x209
878000dc: 2200 movs r2, #0
878000de: 601a str r2, [r3, #0]
878000e0: 46bd mov sp, r7
878000e2: f85d 7b04 ldr.w r7, [sp], #4
878000e6: 4770 bx lr
878000e8 :
878000e8: b480 push {r7}
878000ea: af00 add r7, sp, #0
878000ec: f44f 4340 mov.w r3, #49152 ; 0xc000
878000f0: f2c0 2309 movt r3, #521 ; 0x209
878000f4: f44f 4240 mov.w r2, #49152 ; 0xc000
878000f8: f2c0 2209 movt r2, #521 ; 0x209
878000fc: 6812 ldr r2, [r2, #0]
878000fe: f022 0208 bic.w r2, r2, #8
87800102: 601a str r2, [r3, #0]
87800104: 46bd mov sp, r7
87800106: f85d 7b04 ldr.w r7, [sp], #4
8780010a: 4770 bx lr
8780010c :
8780010c: b480 push {r7}
8780010e: af00 add r7, sp, #0
87800110: f44f 4340 mov.w r3, #49152 ; 0xc000
87800114: f2c0 2309 movt r3, #521 ; 0x209
87800118: f44f 4240 mov.w r2, #49152 ; 0xc000
8780011c: f2c0 2209 movt r2, #521 ; 0x209
87800120: 6812 ldr r2, [r2, #0]
87800122: f042 0208 orr.w r2, r2, #8
87800126: 601a str r2, [r3, #0]
87800128: 46bd mov sp, r7
8780012a: f85d 7b04 ldr.w r7, [sp], #4
8780012e: 4770 bx lr
87800130 :
87800130: b480 push {r7}
87800132: b083 sub sp, #12
87800134: af00 add r7, sp, #0
87800136: 6078 str r0, [r7, #4]
87800138: bf00 nop
8780013a: 687b ldr r3, [r7, #4]
8780013c: 1e5a subs r2, r3, #1
8780013e: 607a str r2, [r7, #4]
87800140: 2b00 cmp r3, #0
87800142: d1fa bne.n 8780013a
87800144: 370c adds r7, #12
87800146: 46bd mov sp, r7
87800148: f85d 7b04 ldr.w r7, [sp], #4
8780014c: 4770 bx lr
8780014e: bf00 nop
87800150 :
87800150: b580 push {r7, lr}
87800152: b082 sub sp, #8
87800154: af00 add r7, sp, #0
87800156: 6078 str r0, [r7, #4]
87800158: e003 b.n 87800162
8780015a: f240 70ff movw r0, #2047 ; 0x7ff
8780015e: f7ff ffe7 bl 87800130
87800162: 687b ldr r3, [r7, #4]
87800164: 1e5a subs r2, r3, #1
87800166: 607a str r2, [r7, #4]
87800168: 2b00 cmp r3, #0
8780016a: d1f6 bne.n 8780015a
8780016c: 3708 adds r7, #8
8780016e: 46bd mov sp, r7
87800170: bd80 pop {r7, pc}
87800172: bf00 nop
87800174 :
87800174: b580 push {r7, lr}
87800176: af00 add r7, sp, #0
87800178: f7ff ff60 bl 8780003c
8780017c: f7ff ff96 bl 878000ac
87800180: f7ff ffc4 bl 8780010c
87800184: f44f 70fa mov.w r0, #500 ; 0x1f4
87800188: f7ff ffe2 bl 87800150
8780018c: f7ff ffac bl 878000e8
87800190: f44f 70fa mov.w r0, #500 ; 0x1f4
87800194: f7ff ffdc bl 87800150
87800198: e7f2 b.n 87800180
8780019a: bf00 nop
8780019c: 0000 movs r0, r0
...
878001a0 <__main_from_arm>:
878001a0: e51ff004 ldr pc, [pc, #-4] ; 878001a4 <__main_from_arm+0x4>
878001a4: 87800175 ; instruction: 0x87800175
878001a8: 3a434347 bcc 888d0ecc <__bss_end+0x10d0ccb>
878001ac: 694c2820 stmdbvs ip, {r5, fp, sp}^
878001b0: 6f72616e svcvs 0x0072616e
878001b4: 43434720 movtmi r4, #14112 ; 0x3720
878001b8: 392e3420 stmdbcc lr!, {r5, sl, ip, sp}
878001bc: 3130322d teqcc r0, sp, lsr #4
878001c0: 31302e37 teqcc r0, r7, lsr lr
878001c4: 2e342029 cdpcs 0, 3, cr2, cr4, cr9, {1}
878001c8: 00342e39 eorseq r2, r4, r9, lsr lr
878001cc: 00003441 andeq r3, r0, r1, asr #8
878001d0: 61656100 cmnvs r5, r0, lsl #2
878001d4: 01006962 tsteq r0, r2, ror #18
878001d8: 0000002a andeq r0, r0, sl, lsr #32
878001dc: 412d3705 teqmi sp, r5, lsl #14
878001e0: 070a0600 streq r0, [sl, -r0, lsl #12]
878001e4: 09010841 stmdbeq r1, {r0, r6, fp}
878001e8: 12040a02 andne r0, r4, #8192 ; 0x2000
878001ec: 15011404 strne r1, [r1, #-1028] ; 0x404
878001f0: 18031701 stmdane r3, {r0, r8, r9, sl, ip}
878001f4: 1a011901 bne 87846600 <__bss_end+0x463ff>
878001f8: 1c031b02 stcne 11, cr1, [r3], {2}
878001fc: 22061e01 andcs r1, r6, #1, 28
87800200: Address 0x0000000087800200 is out of bounds.