本章的内容为《嵌入式Linux>【第二期】手把手教你学Linux之ARM(MX6U)裸机篇》中8.1、8.2讲的内容。
C语言版本LED开发实验
1、设置处理器工作模式
设置i.MX6ULL处在SVC模式下,即设置CPSR寄存器的bit4-0,即设置为0x13。
MRS指令和MSR指令:
MRS R0, CPSR:将特殊寄存器如(CPSR和SPSR)中的数据复制给R0;
MSR CPSR, R0:将R0中的数据复制到CPSR中。
2、设置SP指针
sp可以指向内部RAM,也可以指向DDR, 在本例中将其DDR,正点原子的开发板中的地址为0x80000000~0x9FFFFFFF的地址,sp指针的地址可以设置为以上地址中的任意一个地方,sp指针设置的堆栈的大小设置为0x200000=2MB。
对于cortex A7而言,sp指针的增长方式为向下增长,即sp的初始地址应设置为高地址,因此,sp的指针初始地址设置为0x80200000。
3、跳转到C语言的函数
使用b指令,跳转到main函数。
start.s文件如下:
.global _start
_start:
//设置处理器进入SVC模式.
mrs r0, cpsr //读取cpsr到r0
bic r0, r0, #0x1f //清楚r0的低5位
orr r0, r0, #0x13 //设置SVC模式
msr cpsr, r0 //将r0写入到cpsr
//设置sp指针
ldr sp, =0x80200000
b main //跳转到main函数
4、C语言程序实现
main.h
/**
* Copyright @ JianshuZhao Co., Ltd. 2019-2049. All rights reserved.
* Name:main.h
* Description:学习Linux开发的实验程序
* Function: 点亮LED相关寄存器地址定义,包括CCM, IOMUXC,GPIO1
* Author:JianshuZhao
* Version:V1.0.0
* Date:2020.2.22
*/
#ifndef __MAIN_H
#define __MAIN_H
//define the CCM clock gating register
#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)
//define the IOMUXC config register
#define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)
#define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)
//define the GPIO config register
#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
main.c
/**
* Copyright @ JianshuZhao Co., Ltd. 2019-2049. All rights reserved.
* Name:main.c
* Description:学习Linux开发的实验程序
* Function: 实现点亮LED.
* Author:JianshuZhao
* Version:V1.0.0
* Date:2020.2.22
*/
#include "main.h"
void enable_clk(void)
{
CCM_CCGR0 = 0xFFFFFFFF;
CCM_CCGR1 = 0xFFFFFFFF;
CCM_CCGR2 = 0xFFFFFFFF;
CCM_CCGR3 = 0xFFFFFFFF;
CCM_CCGR4 = 0xFFFFFFFF;
CCM_CCGR5 = 0xFFFFFFFF;
CCM_CCGR6 = 0xFFFFFFFF;
}
void init_led(void)
{
SW_MUX_GPIO1_IO03 = 0x5; //config as GPIO1_IO03
SW_PAD_GPIO1_IO03 = 0x10B0; //config GPIO1_IO03 parameter
}
void Open_led(void)
{
GPIO1_GDIR = 0x8; //config to output
GPIO1_DR &= ~(1<<3); //Set GPIO1_IO03 to High
}
void Close_led(void)
{
GPIO1_GDIR = 0x8; //config to output
GPIO1_DR |= (1<<3); //Set GPIO1_IO03 to High
}
void delay_short(volatile unsigned int n)
{
while(n--){}
}
void delay_1ms(volatile unsigned int n)
{
while(n--)
{
delay_short(0x7FF); //F = 396MHz
}
}
int main(void)
{
//initialize clock and iomuxc
enable_clk();
//tinwkle the led
init_led();
while(1)
{
Open_led();
delay_1ms(1000);
Close_led();
delay_1ms(1000);
}
return 0;
}
makefile 文件
objs = start.o main.o
ledc.bin: $(objs)
arm-linux-gnueabihf-ld -Ttext 0x87800000 $^ -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: %.c
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
clean:
rm -rf *.o ledc.bin ledc.elf ledc.dis
5、链接脚本文件
主要目的为链接.o文件至.elf文件中,指定某一个文件应该放到哪一段指定区域中,最终形成可执行文件。一般编译出来的文件包括text, data, bss, rodata四个段内。
具体脚本文件如下:
SECTIONS{
. = 0x87800000;
.text :
{
start.o
*(.text)
}
.rodata ALIGN(4) : { *(.rodata*) }
.data ALIGN(4) :{ *(.data) }
__bss_start =.;
.bss ALIGN(4) : { *(.bss) *(COMMMON) }
__bss_end =.;
}
附上最终输出的汇编文件:
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: ea000041 b 87800120 <__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 <enable_clk>:
8780003c: b4f0 push {r4, r5, r6, r7}
8780003e: f244 0078 movw r0, #16504 ; 0x4078
87800042: f244 0768 movw r7, #16488 ; 0x4068
87800046: f244 066c movw r6, #16492 ; 0x406c
8780004a: f244 0570 movw r5, #16496 ; 0x4070
8780004e: f244 0474 movw r4, #16500 ; 0x4074
87800052: f244 017c movw r1, #16508 ; 0x407c
87800056: f44f 4281 mov.w r2, #16512 ; 0x4080
8780005a: f04f 33ff mov.w r3, #4294967295 ; 0xffffffff
8780005e: f2c0 270c movt r7, #524 ; 0x20c
87800062: f2c0 260c movt r6, #524 ; 0x20c
87800066: f2c0 250c movt r5, #524 ; 0x20c
8780006a: f2c0 240c movt r4, #524 ; 0x20c
8780006e: f2c0 200c movt r0, #524 ; 0x20c
87800072: f2c0 210c movt r1, #524 ; 0x20c
87800076: f2c0 220c movt r2, #524 ; 0x20c
8780007a: 603b str r3, [r7, #0]
8780007c: 6033 str r3, [r6, #0]
8780007e: 602b str r3, [r5, #0]
87800080: 6023 str r3, [r4, #0]
87800082: 6003 str r3, [r0, #0]
87800084: bcf0 pop {r4, r5, r6, r7}
87800086: 600b str r3, [r1, #0]
87800088: 6013 str r3, [r2, #0]
8780008a: 4770 bx lr
8780008c <init_led>:
8780008c: 2268 movs r2, #104 ; 0x68
8780008e: f44f 733d mov.w r3, #756 ; 0x2f4
87800092: f2c0 220e movt r2, #526 ; 0x20e
87800096: 2005 movs r0, #5
87800098: f2c0 230e movt r3, #526 ; 0x20e
8780009c: f241 01b0 movw r1, #4272 ; 0x10b0
878000a0: 6010 str r0, [r2, #0]
878000a2: 6019 str r1, [r3, #0]
878000a4: 4770 bx lr
878000a6: bf00 nop
878000a8 <Open_led>:
878000a8: f24c 0204 movw r2, #49156 ; 0xc004
878000ac: f44f 4340 mov.w r3, #49152 ; 0xc000
878000b0: f2c0 2209 movt r2, #521 ; 0x209
878000b4: f2c0 2309 movt r3, #521 ; 0x209
878000b8: 2108 movs r1, #8
878000ba: 6011 str r1, [r2, #0]
878000bc: 681a ldr r2, [r3, #0]
878000be: f022 0208 bic.w r2, r2, #8
878000c2: 601a str r2, [r3, #0]
878000c4: 4770 bx lr
878000c6: bf00 nop
878000c8 <Close_led>:
878000c8: f24c 0204 movw r2, #49156 ; 0xc004
878000cc: f44f 4340 mov.w r3, #49152 ; 0xc000
878000d0: f2c0 2209 movt r2, #521 ; 0x209
878000d4: 2108 movs r1, #8
878000d6: f2c0 2309 movt r3, #521 ; 0x209
878000da: 6011 str r1, [r2, #0]
878000dc: 681a ldr r2, [r3, #0]
878000de: 430a orrs r2, r1
878000e0: 601a str r2, [r3, #0]
878000e2: 4770 bx lr
878000e4 <delay_short>:
878000e4: b082 sub sp, #8
878000e6: 9001 str r0, [sp, #4]
878000e8: 9b01 ldr r3, [sp, #4]
878000ea: 1e5a subs r2, r3, #1
878000ec: 9201 str r2, [sp, #4]
878000ee: 2b00 cmp r3, #0
878000f0: d1fa bne.n 878000e8 <delay_short+0x4>
878000f2: b002 add sp, #8
878000f4: 4770 bx lr
878000f6: bf00 nop
878000f8 <delay_1ms>:
878000f8: b082 sub sp, #8
878000fa: 9001 str r0, [sp, #4]
878000fc: 9b01 ldr r3, [sp, #4]
878000fe: 1e5a subs r2, r3, #1
87800100: 9201 str r2, [sp, #4]
87800102: b153 cbz r3, 8780011a <delay_1ms+0x22>
87800104: f240 73ff movw r3, #2047 ; 0x7ff
87800108: 461a mov r2, r3
8780010a: 3b01 subs r3, #1
8780010c: 2a00 cmp r2, #0
8780010e: d1fb bne.n 87800108 <delay_1ms+0x10>
87800110: 9b01 ldr r3, [sp, #4]
87800112: 1e5a subs r2, r3, #1
87800114: 9201 str r2, [sp, #4]
87800116: 2b00 cmp r3, #0
87800118: d1f4 bne.n 87800104 <delay_1ms+0xc>
8780011a: b002 add sp, #8
8780011c: 4770 bx lr
8780011e: bf00 nop
87800120 <__main_from_arm>:
87800120: e51ff004 ldr pc, [pc, #-4] ; 87800124 <__main_from_arm+0x4>
87800124: 87800129 strhi r0, [r0, r9, lsr #2]
Disassembly of section .text.startup:
87800128 <main>:
87800128: f244 0268 movw r2, #16488 ; 0x4068
8780012c: f244 066c movw r6, #16492 ; 0x406c
87800130: b480 push {r7}
87800132: f04f 33ff mov.w r3, #4294967295 ; 0xffffffff
87800136: f2c0 220c movt r2, #524 ; 0x20c
8780013a: f2c0 260c movt r6, #524 ; 0x20c
8780013e: f244 0770 movw r7, #16496 ; 0x4070
87800142: f244 0174 movw r1, #16500 ; 0x4074
87800146: 6013 str r3, [r2, #0]
87800148: f2c0 270c movt r7, #524 ; 0x20c
8780014c: 6033 str r3, [r6, #0]
8780014e: f244 0278 movw r2, #16504 ; 0x4078
87800152: f244 067c movw r6, #16508 ; 0x407c
87800156: 603b str r3, [r7, #0]
87800158: f2c0 210c movt r1, #524 ; 0x20c
8780015c: f2c0 220c movt r2, #524 ; 0x20c
87800160: f2c0 260c movt r6, #524 ; 0x20c
87800164: f24c 0404 movw r4, #49156 ; 0xc004
87800168: 2508 movs r5, #8
8780016a: f44f 4040 mov.w r0, #49152 ; 0xc000
8780016e: f44f 4781 mov.w r7, #16512 ; 0x4080
87800172: 600b str r3, [r1, #0]
87800174: f2c0 270c movt r7, #524 ; 0x20c
87800178: 6013 str r3, [r2, #0]
8780017a: 2168 movs r1, #104 ; 0x68
8780017c: 6033 str r3, [r6, #0]
8780017e: f44f 723d mov.w r2, #756 ; 0x2f4
87800182: f2c0 2409 movt r4, #521 ; 0x209
87800186: f2c0 2009 movt r0, #521 ; 0x209
8780018a: 462e mov r6, r5
8780018c: 603b str r3, [r7, #0]
8780018e: f2c0 210e movt r1, #526 ; 0x20e
87800192: f2c0 220e movt r2, #526 ; 0x20e
87800196: 2705 movs r7, #5
87800198: f241 03b0 movw r3, #4272 ; 0x10b0
8780019c: 600f str r7, [r1, #0]
8780019e: 6013 str r3, [r2, #0]
878001a0: 6026 str r6, [r4, #0]
878001a2: f44f 717a mov.w r1, #1000 ; 0x3e8
878001a6: 6803 ldr r3, [r0, #0]
878001a8: f023 0308 bic.w r3, r3, #8
878001ac: 6003 str r3, [r0, #0]
878001ae: 460b mov r3, r1
878001b0: 3901 subs r1, #1
878001b2: b14b cbz r3, 878001c8 <main+0xa0>
878001b4: f240 73ff movw r3, #2047 ; 0x7ff
878001b8: 461a mov r2, r3
878001ba: 3b01 subs r3, #1
878001bc: 2a00 cmp r2, #0
878001be: d1fb bne.n 878001b8 <main+0x90>
878001c0: 460b mov r3, r1
878001c2: 3901 subs r1, #1
878001c4: 2b00 cmp r3, #0
878001c6: d1f5 bne.n 878001b4 <main+0x8c>
878001c8: 6025 str r5, [r4, #0]
878001ca: f44f 717a mov.w r1, #1000 ; 0x3e8
878001ce: 6803 ldr r3, [r0, #0]
878001d0: f043 0308 orr.w r3, r3, #8
878001d4: 6003 str r3, [r0, #0]
878001d6: 460b mov r3, r1
878001d8: 3901 subs r1, #1
878001da: 2b00 cmp r3, #0
878001dc: d0e0 beq.n 878001a0 <main+0x78>
878001de: f240 73ff movw r3, #2047 ; 0x7ff
878001e2: 461a mov r2, r3
878001e4: 3b01 subs r3, #1
878001e6: 2a00 cmp r2, #0
878001e8: d1fb bne.n 878001e2 <main+0xba>
878001ea: e7f4 b.n 878001d6 <main+0xae>
Disassembly of section .comment:
00000000 <.comment>:
0: 3a434347 bcc 10d0d24 <_start-0x8672f2dc>
4: 694c2820 stmdbvs ip, {r5, fp, sp}^
8: 6f72616e svcvs 0x0072616e
c: 43434720 movtmi r4, #14112 ; 0x3720
10: 392e3420 stmdbcc lr!, {r5, sl, ip, sp}
14: 3130322d teqcc r0, sp, lsr #4
18: 31302e37 teqcc r0, r7, lsr lr
1c: 2e342029 cdpcs 0, 3, cr2, cr4, cr9, {1}
20: 00342e39 eorseq r2, r4, r9, lsr lr
Disassembly of section .ARM.attributes:
00000000 <.ARM.attributes>:
0: 00003041 andeq r3, r0, r1, asr #32
4: 61656100 cmnvs r5, r0, lsl #2
8: 01006962 tsteq r0, r2, ror #18
c: 00000026 andeq r0, r0, r6, lsr #32
10: 412d3705 teqmi sp, r5, lsl #14
14: 070a0600 streq r0, [sl, -r0, lsl #12]
18: 09010841 stmdbeq r1, {r0, r6, fp}
1c: 12040a02 andne r0, r4, #8192 ; 0x2000
20: 15011404 strne r1, [r1, #-1028] ; 0x404
24: 18031701 stmdane r3, {r0, r8, r9, sl, ip}
28: 1b021a01 blne 86834 <_start-0x877797cc>
2c: 22011c03 andcs r1, r1, #768 ; 0x300
30: Address 0x0000000000000030 is out of bounds.