zoukankan      html  css  js  c++  java
  • 使用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

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

  • 相关阅读:
    eslint 的 env 配置是干嘛使的?
    cookie httpOnly 打勾
    如何定制 antd 的样式(theme)
    剑指 Offer 66. 构建乘积数组
    剑指 Offer 65. 不用加减乘除做加法
    剑指 Offer 62. 圆圈中最后剩下的数字
    剑指 Offer 61. 扑克牌中的顺子
    剑指 Offer 59
    剑指 Offer 58
    剑指 Offer 58
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/10023610.html
Copyright © 2011-2022 走看看