使用Thumb

目录


title: 使用Thumb
tags: ARM
date: 2018-10-24 19:28:32
---

使用Thumb

  • C文件使用编译选择增加 -mthumb即可,修改makfile

  • 汇编文件使用.code32表示下面的指令是ARM指令,使用.code16表示下面的代码是Thumb指令使用bx指令表示切换到thumb状态.同时,thumb 某些指令不支持比如直接赋值pc,需要改写

    .code 32
    ....
    
      /* 怎么从ARM State切换到Thumb State? */
      adr r0, thumb_func
      add r0, r0, #1  /* bit0=1时, bx就会切换CPU State到thumb state */
      bx r0
    
    .code 16  
    thumb_func:   
      bl sdram_init
    
    //thumb 某些指令不支持,需要改写
    // ldr pc,=main 不支持
    ldr r0, =main  /* 绝对跳转, 跳到SDRAM */
    mov pc, r0
  • 修改Makefile

    $@  表示目标文件
    $^  表示所有的依赖文件
    $<  表示第一个依赖文件
    
    all: led.o uart.o init.o main.o start.o
      arm-linux-ld -T sdram.lds start.o led.o uart.o init.o main.o -o sdram.elf
      arm-linux-objcopy -O binary -S sdram.elf sdram.bin
      arm-linux-objdump -D sdram.elf > sdram.dis
    clean:
      rm *.bin *.o *.elf *.dis
    
    %.o : %.c
      arm-linux-gcc -mthumb -c -o $@ $<
    
    %.o : %.S
      arm-linux-gcc -c -o $@ $<
    
  • 编译器的一些自作主张.在韦老师的代码中提到,有如下C代码,编译器使用了memcpy来构造了数组arr[],也就是赋初值,如何禁止这个(ARM指令集并没有优化)?

    void sdram_init2(void)
    {
        unsigned int arr[] = {
          0x22000000,     //BWSCON
          0x00000700,     //BANKCON0
          0x00000700,     //BANKCON1
          0x00000700,     //BANKCON2
          0x00000700,     //BANKCON3  
          0x00000700,     //BANKCON4
          0x00000700,     //BANKCON5
          0x18001,    //BANKCON6
          0x18001,    //BANKCON7
          0x8404f5,   //REFRESH,HCLK=12MHz:0x008e07a3,HCLK=100MHz:0x008e04f4
           0xb1,  //BANKSIZE
           0x20,  //MRSRB6
           0x20,  //MRSRB7
    
          };
      volatile unsigned int * p = (volatile unsigned int *)0x48000000;
      int i;
    
      for (i = 0; i < 13; i++)
      {
          *p = arr[i];
          p++;
      }
    }

    gcc中并没有这个选项,可以改变这个数值的属性,定义为静态数组的话就会将该数组的初始值放置到数据段,然后到数据段取值.也就是修改为 const static.或者自己实现memcpy

    注意实际上这个函数是没有用到的,这个是有初始值的数组,并不是位置无关码,直接删除这个函数就好了

转载于:https://www.cnblogs.com/zongzi10010/p/10023610.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值