Linux-学习笔记2

@和原子哥一起学习Linux
Ubuntu入门学习完毕,怀着激动的心情开始了I.MX6U的裸机入门

汇编LED等灯驱动实验

1、汇编LED程序编写步骤

  1. 定义了一个全局标号_start,代码就是从_start 这个标号开始顺序往下执行的
  2. 根据时钟寄存器地址使能所有时钟
  3. 根据IO寄存器地址配置复用IO和IO电气属性
  4. 根据GPIO寄存器配置管脚输入输出和输出高低电平
  5. 通过 b 指令, CPU 重复不断的跳到 loop 函数执行,进入一个死循环
    代码:

.global _start  /*开始*/

_start:
    /*使能所有时钟 */
    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]

    /*复用io  GPIO3*/
    ldr r0, =0x020e0068 @CIOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
    ldr r1, =0x05
    str r1,[r0]
    

    /*配置io电气属性  */
    ldr r0, =0x020e02f4 @IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
    ldr r1, =0x10b0     @下拉
    str r1,[r0]

    /*设置GPIO寄存器 */
    ldr r0, =0x0209c004 @GPIO1_GDIR
    ldr r1, =0x8         @输出
    str r1,[r0]

    ldr r0, =0x0209c000 @GPIOx_DR
    ldr r1, =0            @输出0
    str r1,[r0]

loop:
    b loop

2、编译代码

  1. 编译文件

指定 led.s 编译完成以后的文件名字为 led.o

arm-linux-gnueabihf-gcc -g -c leds.s -o led.o

其中 “-g”选项是产生调试信息
遇到的问题:
编译报错:
错误1:leds.s:4: 错误: bad instruction `_start’
原因:“_start”后面加“:”
错误2; partial line at end of file ignored
原因:“b loop"后面需要再换行

  1. 链接文件
arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf

其中:-Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名
错误1:对‘ox020c4068’未定义的引用
原因:。。。0x不是ox

  1. 格式转换
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin

其中:“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试
信息。

  1. 反汇编
arm-linux-gnueabihf-objdump -D led.elf > led.dis

其中:“-D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件

3、烧写

  1. SD卡准备-FAT32
./imxdownload led.bin /dev/sdb

注意
1)必须知道自己的卡在/dev中sd*文件名
2)如果这个烧写速度大于几十 MB/s、甚至几百 MB/s 那么肯定是烧写失败了!(重启Ubuntu)

4、Makefile

led.bin : leds.s
	arm-linux-gnueabihf-gcc -g -c leds.s -o led.o
	arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
	arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
	arm-linux-gnueabihf-objdump -D led.elf > led.dis

clean:
	rm -rf *.o led.bin led.elf led.dis

你可能感兴趣的:(阿尔法开发板,linux,linux,ubuntu)