[APM32F4] APM32F4xx Keil MDK 散列文件sct的使用分享

[复制链接]
1602|1
 楼主| guiyan 发表于 2024-1-13 16:31 | 显示全部楼层 |阅读模式
本帖最后由 guiyan 于 2024-1-13 16:31 编辑

前言
本文旨在APM32F4xx系列GPIO例程Keil MDK环境下,如何自定义散列文件stc,实现各数据段分区管理,存放在指定内存位置。
一 程序文件中的分区
  • Code:即代码域,它指的是编译器生成的机器指令。
  • RO_data:ReadOnly data,即只读数据域,它指程序中用到的只读数据,全局变量,例如C语言中const关键字定义的全局变量就是典型的RO-data。
  • RW_data:ReadWrite data,即可读写数据域,它指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,且 运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。 例如全局变量或者静态变量,且定义时赋予“非0值”给该变量进行初始化。
  • ZI_data:ZeroInitialie data,即0初始化数据,它指初始化为“0值”的可读写数据域,它与RW_data的区别是程序刚运行时这些数据初始值全都为0,而 后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。 包括未初始化的全局变量,和初始化为0的全局变量。
    RW_data和ZI_data,在程序运行的开始阶段,就需要从Flash中复制到RAM中。
  • RO:只读区域,包括RO_data和code。
散列文件sct介绍
详细可参考官方文档ARM Compiler v5.06 for µVision armlink User Guide的Scatter File Syntax
官方文档路径在Keil安装目录:
C:\Keil_v5\ARM\Hlp\armtools.chm
C:\Keil_v5\ARM\Hlp\DUI0377G_02_mdk_armlink_user_guide.pdf

散列文件sct总览 scatter总览.png 简单分析:
  • 加载域 LOAD_ROM_1(起始地址为0x0000) 和 LOAD_ROM_2(起始地址为0x4000)
    意思是该区域数据全部都会下载到以起始地址开始的内存空间中。
  • 执行域 EXEC_ROM_1(起始地址为0x0000) 和 EXEC_ROM_2(起始地址为0x4000)
    意思是输入段的数据,会从这个地址开始执行。
    有2种情况:

    • 直接从Flash加载域执行
    • 把Flash加载域的数据,复制到RAM中,从RAM执行
  • 输入段描述
    program1.o (+RO):RO属性的数据
    program1.o (+RW,+ZI): RW和ZI的数据
    program2.o (+RO):RO属性的数据
    program2.o (+RW,+ZI): RW和ZI的数据

综上:
就是从0x0000开始下载program1.o的RO数据,并从0x0000执行;
从RO数据结束的地方,紧接着下载program1.o RW数据,但程序运行时,会把RW和ZI数据复制到0x18000开始的内存中执行。
program2.o RO、RW和ZI同理。
RW_RAM.png
前缀符 :gdef: 的使用
在散列文件sct中,可以通过使用前缀符 :gdef: 来存放全局符号( 同个C文件所有全局变量 或者全局函数名)到特定位置上。
  1. /* 示例1 Delay_ms函数*/
  2. void Delay_ms(__IO u32 nms)
  3. {
  4.     SysTick_Config(SystemCoreClock / 1000);

  5.     cntMs = nms;
  6.     while(cntMs != 0);
  7. }

  8.   ;Delay_ms function
  9.   LR_IROM2 0x08005000 0x00004000  {    ; load region size_region
  10.   ER_IROM2 0x08005000 0x00004000  {  ; load address = execution address
  11.     *(:gdef:Delay_ms)//Delay_ms函数存放到固定位置0x08005000地址上
  12.   }
  13. }
查看map文件:
Delay_ms.png
数据段分区管理应用
在APM32F4xx系列GPIO例程中,修改sct文件,修改如下:
  1. ; *************************************************************
  2. ; *** Scatter-Loading Description File generated by uVision ***
  3. ; *************************************************************

  4. ;vctor
  5. LR_ROM_VCTOR 0x08000000 0x00001000  {    ; load region size_region
  6.   ER_ROM_VCTOR 0x08000000 0x00001000  {  ; load address = execution address
  7.    *.o (RESET, +First)
  8.   }
  9. }

  10. ;entry
  11. LR_ROM_ENTRY 0x08001000 0x00000100  {    ; load region size_region
  12.   ER_ROM_ENTRY 0x08001000 0x00000100  {  ; load address = execution address
  13.    *(InRoot$Sections)
  14.   }
  15. }

  16. ;code
  17. LR_ROM_CODE 0x08002000 0x00004000  {    ; load region size_region
  18.   ER_ROM_CODE 0x08002000 0x00004000  {  ; load address = execution address
  19.    .ANY (+CODE)
  20.   }
  21. }

  22. ;const data
  23. LR_ROM_CONST 0x08003000 0x00002000  {    ; load region size_region
  24.   ER_ROM_CONST 0x20001000 0x00002000  {  ; load address = execution address
  25.    .ANY (+CONST)
  26.   }
  27. }

  28. ;rw data
  29. LR_ROM_RW 0x08004000 0x00002000  {    ; load region size_region
  30.   ER_ROM_RW 0x20000000 0x00002000  {  ; load address = execution address
  31.    .ANY (+RW +ZI)
  32.   }
  33. }

  34. ;Delay_ms function
  35. LR_IROM2 0x08005000 0x00004000  {    ; load region size_region
  36.   ER_IROM2 0x08005000 0x00004000  {  ; load address = execution address
  37.     *(:gdef:Delay_ms)
  38.   }
  39. }
查看map文件,分区管理成功,并能下载程序正常运行。
例程请见附件。
map1.png map2.png






APM32F4xx_GPIO_SctSplit.zip

780.21 KB, 下载次数: 3

kai迪皮 发表于 2024-1-15 10:54 | 显示全部楼层
学习到了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

24

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部