• 使用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

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

  • 相关阅读:
    TCP/IP模型及OSI七层参考模型各层的功能和主要协议
    Java – 虚函数、抽象函数、抽象类、接口
    Java CAS原理
    CAP原理中的一致性
    分布式系统CAP理论与CA选择
    数据库事务的特性、隔离级别、传播策略
    Java线程与锁
    JVM内存模型
    Java对象创建的过程及对象的内存布局与访问定位
    为什么Java匿名内部类访问的方法参数或方法局部变量需要被final修饰
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/10023610.html
Copyright © 2020-2023  润新知