stm32程序运行中获得链接脚本变量的方法

有些时候我们需要获得程序的代码段以及部分数据段的大小,以用于将单片机程序拷贝到存储设备。keil环境下,编译时会自动生成sct文件作为链接脚本,从而规定了各段在内存中的分配情况,正如每一次编译,keil都会有如下提示。
在这里插入图片描述
红框里的内容就是链接脚本规定的各段的大小。那么如何在程序运行中中引用这些size呢。
这里直接贴测试成功的代码。具体内容参考https://wenku.baidu.com/view/d451f9e5f111f18582d05abe.html
以我的TEST工程为例,打开TEST.sct文件,如下所示

LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

为了测试,我将程序写入一个外部按键中断中,并通过重定向的形式用printf打印到串口,中断程序如下

void EXTI4_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI4_IRQn 0 */

	extern unsigned int Image$$ER_IROM1$$Base;
	extern unsigned int Image$$ER_IROM1$$Limit;
	extern unsigned int Image$$ER_IROM1$$Length;   

	extern unsigned int Image$$RW_IRAM1$$Base;
	extern unsigned int Image$$RW_IRAM1$$Limit;
	extern unsigned int Image$$RW_IRAM1$$Length;     
	
	extern unsigned int Image$$RW_IRAM1$$ZI$$Base;
	extern unsigned int Image$$RW_IRAM1$$ZI$$Limit;
	extern unsigned int Image$$RW_IRAM1$$ZI$$Length;    
	
	
	unsigned int base,limit,length;
	base = (unsigned int )&Image$$ER_IROM1$$Base;
	limit = (unsigned int )&Image$$ER_IROM1$$Limit;
	length = (unsigned int )&Image$$ER_IROM1$$Length;
	printf("\nER_IROM1 Base = 0x%x\nER_IROM1 Limit = 0x%x\nER_IROM1 Length = %d\n",base,limit,length);
	
	base = (unsigned int )&Image$$RW_IRAM1$$Base;
	limit = (unsigned int )&Image$$RW_IRAM1$$Limit;
	length = (unsigned int )&Image$$RW_IRAM1$$Length;
	printf("\nRW_IRAM1 Base = 0x%x\nRW_IRAM1 Limit = 0x%x\nRW_IRAM1 Length = %d\n",base,limit,length);
	
	base = (unsigned int )&Image$$RW_IRAM1$$ZI$$Base;
	limit = (unsigned int )&Image$$RW_IRAM1$$ZI$$Limit;
	length = (unsigned int )&Image$$RW_IRAM1$$ZI$$Length;  
	printf("\nRW_IRAM1_ZI Base = 0x%x\nRW_IRAM1_ZI Limit = 0x%x\nRW_IRAM1_ZI Length = %d\n",base,limit,length);
	
	
  /* USER CODE END EXTI4_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
  /* USER CODE BEGIN EXTI4_IRQn 1 */
	Reset_test();
  /* USER CODE END EXTI4_IRQn 1 */
}

打印结果如下图
在这里插入图片描述
可以看到ER_IROM1的size为10752,正好为keil编译完成后code段+RO-data段的大小,RW_IRAM1的大小以及RW_IRAM!_ZI的大小都与keil编译结果相符,测试成功。这样便可在程序运行中获得程序的内存分配情况,以按大小拷贝或者烧写程序,还是有一定用处的。这很像使用gcc时,从链接脚本中获得各段的起始地址,从而获得各段的大小,从而在程序拷贝时派上用场。看过韦东山视频的同学们肯定接触过~

猜你喜欢

转载自blog.csdn.net/spiremoon/article/details/89459593