ATJ2157内存篇【炬芯音频芯片】---sct语法

news2025/1/25 9:18:14

ATJ2157 sct语法

  • 公共知识篇
    • BNF 简介
    • Sct脚本
      • Sct的作用
      • Sct的语法规则
        • 1. 加载域描述(Loadd region descriptions)
        • 2. 执行域描述
        • 3. 输入节的描述
  • ATJ2157平台使用的sct
    • RO的等效写法
    • ScatterAssert()函数
    • LoadLength()函数
    • LoadBase()函数
    • ImageLimit()函数
    • ATJ2157平台什么数据编译出来是.data,.constdata与.bss
  • sct参考学习网站

公共知识篇

BNF 简介

巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur,首次引入一种形式化符号来描述给定语言的语法。

简称为:BNF符号。   
现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则

巴科斯范式的内容

在双引号中的字(“word”)代表着这些字符本身。而double_quote用来代表双引号。

在双引号外的字(有可能有下划线)代表着语法部分。

尖括号( < > )内包含的为必选项。

方括号( [ ] )内包含的为可选项。

大括号( { } )内包含的为可重复0至无数次的项。

竖线( | )表示在其左右两边任选一项,相当于"OR"的意思。

::= 是“被定义为”的意思。

关于具体的例子可以上网搜索,网上资料比较齐全

Sct脚本

Sct 的全称是 Scatter File Syntax,

Sct的作用

在学习一个东西之前,首先要明白,她是干什么的?那么sct脚本文件到底是什么东西?

其实吧,sct脚本文件是描述如何把输入文件中的节(sections)映射到输出文件中,并控制输出文件的存储布局的脚本文件。并且sct的语法是遵守BNF的语法规则的。

Sct的语法规则

一个.sct文件,包括了一个或者多个加载域(load region),每个加载域也包括一个或者多个执行域(execution region)

下面是一个.sct文件的文件结构图
在这里插入图片描述

1. 加载域描述(Loadd region descriptions)

其实加载域就是用来描述下内存的区域,这个区域是用来存放执行域的

加载区域描述的组件允许您唯一标识加载区域,并控制ELF文件的哪些部分放置在该区域中

加载域的具体结构

在这里插入图片描述

一个加载域描述,应该包括哪些内容呢?

1:名字(被编译器用来识别不同的加载域)
2:一个基地址(代码或数据的开始地址)
3:属性说明
4:大小
5:一个或者多个执行域

加载域的语法详解
符合BNF的规则,对规则不了解的可以百度下

load_region_description ::= load_region_name (base_address | (“+”
offset)) [attribute_list] [max_size]
“{”
execution_region_description+
“}”

load_region_name:
加载域的名字,这个是区域中区分大小写的

base_address :
这个区域内被链接的地址,注意要满足对齐的要求

+offset:
     描述一个基地址,其偏移字节超出了前一个加载区域的结尾,offset必须是4字节对齐,如果这是第一个加载区域,那么+offset意味着基址从零开始偏移字节。如果使用+offset,则加载区域可能从以前的加载区域继承某些属性

attribute_list:
待定补充

max_size:
指定加载区域的最大大小。这是在执行任何解压缩或零初始化之前加载区域的大小。如果指定了可选的max_size值,那么如果分配给armlink的区域超过max_size字节,则armlink将生成错误


execution_region_description:
指定执行区域名称、地址和内容
加载的属性问题
PI       与地址无关方式存放;
RELOC    重新部署,保留定位信息,以便重新定位该段到新的执行区;
OVERLAY  覆盖,允许多个可执行区域在同一个地址,ADS不支持;
ABSOLUTE 绝对地址(默认);


加载域的继承问题

一个加载域继承另一个加载域的属性,请使用+offset

在这里插入图片描述

RELOC属性的继承规则
如果显性设置了一个加载域的属性为RELOC,那么执行域只能承认,不能设置
如下:
LR1 0x8000 RELOC
{ 
    ER1 +0 ; inherits RELOC from LR1
    {}
    ER2 +0 ; inherits RELOC from ER1
    {}
    ER3 +0 RELOC ; Error cannot explicitly set RELOC on an execution region
    {}
}

2. 执行域描述

执行区域描述的组件允许您唯一地标识每个执行区域及其在父加载区域中的位置,并控制ELF文件的哪些部分放置在该执行区域中

执行域的结构
在这里插入图片描述

一个执行域描述,应该包括哪些内容呢? 1:名字(被编译器用来识别不同的加载域)
2:一个基地址(代码或数据的开始地址)
3:属性说明
4:大小
5:一个或者多个输入的段

执行域的语法详解
执行域其实就是在说明输入段即代码运行时的地址

execution_region_description ::= 
  exec_region_name (base_address | "+" offset) [attribute_list] [max_size | length]
        "{" 
            input_section_description* 
        "}"

跟加载域的描述差不多,可以参考加载域的说明
PI   与地址无关,该区域的代码可任意移动后执行;
OVERLAY     覆盖;
ABSOLUTE    绝对地址(默认);
FIXED       固定地址;
UNINIT      不用初始化该区域的ZI段;

执行域的继承问题

一个执行域使用+offset属性时,能够承认前面一个执行域的属性,还有就是第一个使用+offset的执行域会承认她所在加载域的属性

有两种情况,即使使用了+offset时也不能继承
1:显性的设置了当前执行域的属性
2:前一个执行域的属性使用了OVERLAY属性
一个执行域只能继承RELOC属性(这个属性一定是加载域的)
如下例子
LR1 0x8000 PI
{
    ER1 +0         ; ER1 inherits PI from LR1
    {}
    ER2 +0         ; ER2 inherits PI from ER1
    {}
    ER3 0x10000    ; ER3 does not inherit because it has no relative base
                     address and gets the default of ABSOLUTE
    {}
    ER4 +0         ; ER4 inherits ABSOLUTE from ER3
    {}
    ER5 +0 PI      ; ER5 does not inherit, it explicitly sets PI
    {}
    ER6 +0 OVERLAY ; ER6 does not inherit, an OVERLAY cannot inherit
    {}
    ER7 +0        ; ER7 cannot inherit OVERLAY, gets the default of ABSOLUTE
    {}
}

3. 输入节的描述

输入节的结构
在这里插入图片描述

输入节描述的组件允许您标识ELF文件中要放置在执行区域中的部分

可以看出输入节有两个部分
1:模块名 (个人理解实际上是.o的文件名)
2:输入节的名字,或者是输入节的属性,如READ-ONLY or CODE
这里面都可以使用通匹符

输入节的语法

input_section_description ::= module_select_pattern [ “(”
input_section_selector ( “,” input_section_selector )* “)” ]
input_section_selector ::= “+” input_section_attr
| input_section_pattern
| input_symbol_pattern
| section_properties

module_select_pattern:
就是文件名,当然实际是
1:object 文件包括的节中的名字
2:库成员的名字(.lib)
3:带有全路径的库中的名字
   
特别说明,关于 module_select_pattern 我们可以使用通匹符,
* 可以代替0个或者多个字符
?可以代替一个字符

在这里插入图片描述

input_section_attr:
属性选择器,是与输入节相匹配的。

每一个输入节的属性前必须加一个+号。属性选择器不区分大小写

在这里插入图片描述

RO-CODE
RO-DATA
RO, selects both RO-CODE and RO-DATA.

RW-DATA.
RW-CODE.
RW, selects both RW-CODE and RW-DATA.
XO.
ZI.
ENTRY, that is, a section containing an ENTRY point.

CODE for RO-CODE.
CONST for RO-DATA.
TEXT for RO.
DATA for RW.
BSS for ZI

FIRST.
LAST

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

举例说明
在这里插入图片描述

ATJ2157平台使用的sct

US2157平台使用的.sct

跟标准的一样,

使用分号;进行一行的注解

Sct存放在MDK目录下
在这里插入图片描述

最终会生成一个map文件,可以看到地址信息

在这里插入图片描述

使用+RO,实际上没有必要在使用.rodata了

+RO 实际上已经包含了.rodata
在这里插入图片描述

RO的等效写法

下面4种写法是等效的

至于原因可以参考input_section_attr的说明
在这里插入图片描述

ScatterAssert()函数

ScatterAssert(exp)
如果exp为false则链接器就报错

在key.sct中有这样一个例子
在这里插入图片描述

如果.data区与.bss区之后超过了限制的大小,链接器就会报错。如下图:
在这里插入图片描述

LoadLength()函数

LoadLength(region_name)
返回region_name的大小
region_name  可以是加载视图或者执行视图的名字

LoadBase()函数

LoadLength(region_name) 
返回region_name的基地址
region_name  可以是加载视图或者执行视图的名字

ImageLimit()函数

ImageLimit(region_name) 
返回region_name的最后地址
region_name  可以是加载视图或者执行视图的名字

ATJ2157平台什么数据编译出来是.data,.constdata与.bss

.data:
1:基本的数据类型,整型,字符型,布尔型,uinon,枚举,指针(不管有没有初始化及初始化值为多少),
2:初始化不为0的数组,struct 结构体
3:static 修饰的局部变量

.constdat:
const修饰的变量

.bss:
1:初始化为0或者没有初始化的数组,struct 结构体

sct参考学习网站

官方网站
https://www.keil.com/support/man/docs/armlink/armlink_pge1362075650322.htm

CSDN相关网站:

https://blog.csdn.net/xiaowanbiao123/category_9827056.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS 7.6上安装SqlServer2017

一、 安装 SQL Server 1、 安装 SQL Server 所需的python2 sudo alternatives --config python # If not configured, install python2 and openssl10 using the following commands: sudo yum install python2 sudo yum install compat-openssl10 # Configure python2 a…

Python自动化小技巧12——根据论文题目自动导出参考文献格式

案例背景 在写论文的时候&#xff0c;弄参考文献格式也很麻烦&#xff0c;不可能手打人名题目期刊名称年月日卷号页码这些&#xff0c;我们一般都是使用系统自动导出的格式复制粘贴就行。中国知网可以直接导出论文的格式&#xff0c;但是知网基本只有中文的论文&#xff0c;英…

pdf编辑器工具哪个好?好用的pdf编辑器一款就够!

pdf这类办公软件大家都很熟悉&#xff0c;不过pdf通常情况只能看不能编辑&#xff0c;这着实也很让人苦恼&#xff01;特别是现在国内大多都已居家办公&#xff0c;本来就颇多不便&#xff0c;如果没有一款好用的pdf编辑器工具&#xff0c;那么势必导致工作效率更为低下。 那么…

第十二章 哈希表与字符串哈希

第十二章 哈希表与字符串哈希一、哈希表1、什么是哈希表2、算法逻辑&#xff08;1&#xff09;哈希函数&#xff08;2&#xff09;冲突解决3、算法模板二、字符串哈希1、算法逻辑2、算法用途3、算法模板一、哈希表 1、什么是哈希表 在之前的文章中&#xff0c;我们学习过离散…

Spring-aop技术

前言 spring-aop技术是对oop(面向对象)的一个补充&#xff0c;其底层其实就是使用aspect动态代理进行实现的&#xff0c;本篇文章将大概讨论下aop的核心实现流程 相关的核心概念 刚开始&#xff0c;先介绍下aop中比较核心的一些对象和概念&#xff0c;只要理解了这些&#xff…

【通信】粒子群算法5G物联网云网络优化【含Matlab源码 2160期】

⛄一、简介 1 引言 5G技术被大众所熟知之后&#xff0c;边缘计算也成了各行业关注的重点。最初的边缘计算概念是在2014年提出&#xff0c;到了2016年就拓展到了接入边缘&#xff0c;目前基本被定义为靠近用户边缘的、包含多种技术的接入网络&#xff0c;能够提供比较稳定的IT业…

精华推荐 | 深入浅出学习透析Nginx服务器的基本原理和配置指南「Keepalive性能优化实战篇」

Linux系统&#xff1a;Centos 7 x64Nginx版本&#xff1a;1.11.5 Nginx 是一款面向性能设计的 HTTP 服务器&#xff0c;能反向代理 HTTP&#xff0c;HTTPS 和邮件相关(SMTP&#xff0c;POP3&#xff0c;IMAP)的协议链接。并且提供了负载均衡以及 HTTP 缓存。它的设计充分使用异…

拼搏一周!刷了1000道Java高频面试题喜提阿里offer,定级P7

今年较往年相比面试要难的多&#xff0c;大环境也是对于程序员的要求越来越高&#xff0c;环境是我们无法改变的&#xff0c;我们能改变的只有自己&#xff0c;月初我一好友&#xff0c;努力拼搏一周&#xff0c;刷完了这份阿里P8大牛整理的这1000道Java高频面试题笔记&#xf…

GitHub配置SSH Keys步骤

Git配置SSH Keys步骤 许多 Git 服务器都使用 SSH 公钥进行认证。 为了向 Git 服务器提供 SSH 公钥&#xff0c;如果某系统用户尚未拥有密钥&#xff0c;必须事先为其生成一份。 生成步骤如下&#xff1a; 1. 设置用户名和邮箱 在git命令行中对git进行全局设置 git config --…

八、CANdelaStudio入门-Session

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的Session概念,欢迎各位朋友订阅、评论,…

微信小程序:用户基本信息的采集

写作背景 在开发商城小程序时需要显示用户头像、昵称、手机号等信息以便后续业务的实现&#xff0c;因此需要通过微信小程序的API采集用户数据&#xff0c;由此进行总结。 在微信小程序中获取用户信息可以通过这几种方式获取&#xff0c;getUserInfo、getUserProfile、open-da…

基于多目标遗传算法的IEEE14节点系统分布式电源选址定容matlab程序

基于多目标遗传算法的IEEE14节点系统分布式电源选址定容matlab程序 摘 要: 为更好地解决分布式电源选址定容问题&#xff0c;提出一种改进的多目标遗传算法。之后&#xff0c;考虑投资成本、网损以及电压稳定性三因素建立了一个三目标的数学模型&#xff0c;并采用上述多目标遗…

javaSE -运算符,注释,关键字(复习)

一、运算符 1.1、算术运算符 基本四则运算符 - * / %规则比较简单, 值得注意的是除法和取模 1.1.1、/ 除法 int / int 结果还是 int, 需要使用 double 来计算 public static void main(String[] args) {int a 1;int b 2;System.out.println(a / b);}要得到小数那就要使…

python>>numpy包

章节内容 什么是NumPy模块和NumPy数组 创建数组 基本数据类型 数据可视化 索引和切片 副本和视图 目录 什么是NumPy模块和NumPy数组&#xff1f; 创建数组 基本数据类型 数据可视化 索引和切片 副本和视图 什么是NumPy模块和NumPy数组&#xff1f; NumPy数组 python对象 …

pyhon项目中,使用pip安装第三方插件之后,明明使用pip list可以查到,但是在项目中import时仍然找不到怎么办?

认识pip&#xff1a;python中的pip是用来安装python第三方库的工具&#xff0c;是安装python的时候自带的。 1.安装方式&#xff1a;pip install 第三方库名&#xff0c;比如&#xff1a;pip install selenium 2.查看已安装的所有第三方库&#xff1a;pip list 或 pip3 list &…

Spring Cloud OpenFeign - - - > 日志级别配置

项目源码地址&#xff1a;https://download.csdn.net/download/weixin_42950079/87168704 OpenFeign 有 4 种日志级别&#xff1a; NONE: 不记录任何日志&#xff0c;是OpenFeign默认日志级别&#xff08;性能最佳&#xff0c;适用于生产环境&#xff09;。BASIC: 仅记录请求方…

五魔方、二阶五魔方

五魔方 五魔方是正十二面体魔方&#xff0c;其实和三阶魔方很像&#xff0c;用层先法就能复原&#xff0c;而且公式一模一样。 十二个面分为6个浅色面和6个深色面&#xff0c;所以浅色和深色各有一个中心面。 先复原浅色中心面这一层&#xff1a; 再复原浅色面的5个棱块&…

【GlobalMapper精品教程】030:栅格重采样案例教程(航测DSM)

本文讲解Globalmapper栅格重采样操作方法。数据为配套实验数据包中的data030.rar,航测内业生成的DSM,分辨率为0.04米,现在需要将其重采样为0.05米。 文章目录 一、重采样简介二、重采样操作一、重采样简介 栅格/影像数据进行配准或纠正、投影等几何变换后,像元中心位置通常…

超级记忆节目

一 问题描述 杰克逊被邀请参加电视节目“超强记忆”&#xff0c;参与者会玩一个记忆游戏。主持人先告诉参与者一个数字序列 {A1 , A2 , …, An }&#xff0c;然后对该序列执行一系列操作或查询&#xff1a; ① ADD x y D &#xff0c;表示对子序列 {Ax , …, Ay } 的每个数字…

Qt | Qt For Android、Qt5.14.2安卓开发环境搭建详细步骤

Qt | Qt For Android、Qt5.14.2安卓开发环境搭建详细步骤 目录Qt | Qt For Android、Qt5.14.2安卓开发环境搭建详细步骤1、简介2、软件下载1、Java SDK2、Android SDK3、Android NDK3、软件部署4、测试1、简介 搭建Qt For Android开发环境需要安装的软件有&#xff1a; JAVA …