嵌入式Linux开发 Day3

本章的内容为《嵌入式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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值