Run-time和Load-time初始化

TI PRU编译器选项深度解析:从基础配置到高级优化实战 在嵌入式系统开发中,编译器是连接高级语言与底层硬件的关键工具链,其配置选项直接决定了代码的执行效率、内存占用可调试性。理解编译器选项的工作原理,是进行性能优化资源精准控制的基础。通过合理配置预处理宏、优化等级内存模型,开发者可以显著提升程序的实时性稳定性,这在资源受限的硬实时场景中价值尤为突出。本文聚焦于德州仪器(TI)可编程实时单元(PRU)的专用C/C++编译器,深入剖析其链接器配置、调试信息生成及处理器特定优化等核心选项,旨在帮助开发者解决PRU开发中常见的内存布局、代码优化及与ARM主核协同 阅读详情

 

Run-timeload-time初始化

CCSbuild options中的linker选项卡中,Autoinit Model有两个选项:Run-Time AutoinitializationLoad-Time Initialization。本文简单介绍一下这两个选项的区别和用法。

因为这两个选项和.cinit.bss Section有关,所以先简单的介绍一下这两个section相关的知识。从C语言的角度来看的话,.bss section是用来存放C语言中的全局变量的。而.cinit则用来存放全局变量的初始值。例如如果有下面的全局变量buf的话,

short buf[4] = {0x01, 0x02, 0x03, 0x04};

那么buf放在.bss中,而初始值0x01, 0x02, 0x03, 0x04放在.cinit中。.cinit中储存的实际上是一个copy table,它对于每个需要初始化的全局变量,都有一个复制项与之对应,以55x系为例,上面的这段程序产生的复制项为:

00 04 00 12 34 00 00 01 00 02 00 03 00 04 
----- ----------- ------------------------
  1        2                    3     

<!--[if !supportLists]-->1.      <!--[endif]-->复制的word

<!--[if !supportLists]-->2.      <!--[endif]-->复制的目标地址,也就是buf的地址(这里假设为0x1234)

<!--[if !supportLists]-->3.      <!--[endif]-->要复制的数据,也就是初始化数据0x01, 0x02, 0x03, 0x04

那么对于这个.cinit中的copy table具体由谁来完成复制操作呢,这样就有了Load-TimeRun-Time的这两个选择。

先来看看Run-Time Autoinitialization。这段英文的的意思是“运行时初始化”,实际上就是在main函数之前被运行的c_int00中的一段代码完成这个复制工作。我们知道c_int00是用来初始化C语言程序运行所需要的环境的,这个初始化的一部分就是初始化全局变量的初始值。因此在c_int00中初始化全局变量是理所当然的。

然而这样做存在一个问题:.cinit中的copy table只在c_int00中用一次,如果把它放在DSPon chip RAM中的话,实在是太浪费了。因此通常的做法是将.cinit放到flash内存中。假设系统没有flash内存,而是采用的serial boot之类的启动方式,由别的芯片通过McBSPDSP的程序传输到DSP中的话,我们就不得不把.cinit放到RAM中了。如果初始化数据很多的话,显然是非常浪费内存的。为了解决这个问题,可以采用Load-Time Initialization

所谓Load-Time Initialization,就是在将程序loadDSP内存的同时,初始化.bss中的全局变量。我们以55x系列的serial boot为例来解释一下Load-Time Initializationout文件的格式比较复杂,所以通常都是先通过hex5x工具将out文件转化为一个boot table格式的文件,然后通过DSP ROM中的boot程序接收并分析这个boot table完成各个section的初始化工作,最后跳转到c_int00运行。boot table的格式和.cinit中的copy table类似,都有复制个数,目标地址以及需要复制的数据。例如下图是hex5x产生的boot table的格式。

DSP ROM中的serial boot程序一边接收这个boot table的数据一边将数据复制到相应的地址中去。因此如果能将.cinit中的copy table转换到boot table中去的话,就不需要在c_int00中对.cinit进行操作了,也就不需要额外的内存用来储存.cinit了。只要选择了Load-Time Initialization选项,这个工作就都由计算机自动完成了。我们来看看它具体是如何做的。

当以Load-Time Initialization方式对项目进行link的时候,linker会在输出的out文件中的.cinitsection header中添加一个STYP_COPY标签。这个标签会改变hex5x工具对这个section的操作。也就是说当hex5x发现某个section header中有STYP_COPY标签的话,它就把这个section中的数据当作copy table一项一项添加到boot table中去了。因此最终产生的boot table不是将整个.cinit复制到DSP的内存中,而是将.cinit中的每个复制项复制到.bss相应的位置。这样就在boot load的同时完成了全局变量的初始化工作。

 

 

 

iOS 冷启动优化记录 本文系统梳理了iOS应用冷启动优化实践,分为五个部分:1)分析App启动流程(pre-main的SystemInterface、RuntimeInitafter-main的UIKitInit等阶段);2)确立启动起止点测量方法;3)分段优化措施,包括pre-main阶段的动态库精简、二进制重排、+load方法治理,以及after-main的启动项异步化、首屏渲染优化;4)展示优化前后数据对比;5)提出二进制重排等未来优化方向。通过系统性分析各阶段耗时并针对性优化,有效提升了启动性能,为类似优化提供参考框架 阅读详情

相关推荐

Hermes Agent run_agent.py 核心循环与稳定性设计解析

Agent系统中的Loop机制并非简单重复调用,而是一种具备状态保持、异步协调与实时反馈能力的动态执行模型。其核心原理在于将任务分解为感知、推理、执行与反思四个可插拔阶段,并通过内存快照、执行状态观测反馈构成闭环控制。这种设计直接支撑了Agent在工具调用异步性、LLM输出不确定性、内存动态管理及合规实时校验等关键场景下的工程鲁棒性。对于Hermes开发者而言,理解run_agent.py中状态机驱动的Loop结构与12个高危代码节点(如_memory_capacity检查、User-Agent头注入、桌

weixin_30423977的博客 491

DSP学习(8)—— linker.cmd文件解析

写工程的时候遇到报内存不够的错误,出现在linker.cmd的内存分配section,找到一篇英文文章详细说明了linker.cmd文件。

weixin_62355917的博客 4321

python面向对象,模块以及导包,json处理time,datatime与对象拷贝4

继承也是面向对象的主要特征之一,可以实现代码的复用,被继承的类称为父类/基类/超类,继承的类为子类,子类可以继承父类的变量,函数,还可增加自己的变量函数,也可以修改父类的变量函数,python支持多继承。4.python支持多级继承,即B继承A,C继承B,C可以调用BA的变量方法。指不同的子类对象调用相同的方法,产生不同的结果(因为子类重写了父类的同名方法)类是一种抽象的数据类型,类中的变量代表类的属性,函数代表类的行为。类是一种抽象的数据类型,创建具体的累的对象,即为累的实例化。

weixin_43724711的博客 1120

go语言-时间处理(time.Time)

Time的数据结构 type Time struct { // wall and ext encode the wall time seconds, wall time nanoseconds, // and optional monotonic clock reading in nanoseconds. // // From high to low bit position, wall encodes a 1-bit flag (hasMonotonic), // a 33-bit second

西京刀客 5383

CCS build options中Run-Time AutoinitializationLoad-Time Initialization

    在用纯汇编编制的dsp程序时需要做如图所示的调整,这是因为:    在CCS的build options中的linker选项卡中,Autoinit Model有两个选项:Run-Time AutoinitializationLoad-Time Initialization。     因为这两个选项.cinit.bss Section有关,所以先简单的介绍一下这两个sectio...

EE漫谈 3410

史上最全 Python 面向对象编程

作者:浪子燕青 来自:http://www.langzi.fun/Python面向对象编程.html面向对象编程函数式编程(面向过程编程)都是程序设计的方法,不过...

程序员之家 400

别再手动盯盘了!用QMT的run_time定时器,5行代码实现自动化交易触发

本文介绍如何利用QMT平台的run_time定时器功能,仅需5行代码实现自动化交易触发,告别手动盯盘。通过解析定时器核心机制提供代码示例,帮助投资者提升交易效率,减少情绪干扰,捕捉更多交易机会。

weixin_30567225的博客 342

timeout在软件测试,loadrunner报timeout 错误【转载】

1. 初始化timeout错误:这个问题,查了一些资料,原因是因为某个虚拟用户在transaction初始化时超时了。解决办法:将controller------tools------timeout-----vuser---init时间设大些,默认为120,我设为600解决此问题。2. 运行场景时提示“Step download timeout (120 seconds) has expired ...

weixin_39969976的博客 1662

loadrunner load generator设置init人数

Load Generator中还有一个很重要的设置。就是用来设置init人数的,我们在运行脚本的时候会发现,在场景监控中,init默认不会超过50个人,也就是最大并发是50个人,我们想使用超过50个人的并发,就需要在这里进行设置了。 点击Details,弹出如下图,找到Run-Time Quota标签页。两个值都默认为50,第一个值init最少加载多少用户开始运行脚本,第二个值指...

dietuo3387的博客 424

Load Generator负载生成器

转载于:  http://www.51testing.com/html/45/623045-849150.html Load Generator负载生成器 对场景进行设计后,接着需要对负载生成器进行管理设置。 Load Generator是运行脚本的负载引擎,在默认情况下使用本地的负载生成器来运行脚本,但是模拟用户行为也需要消耗一定的系统资源,所以在一台电脑上无法模拟大量的虚拟用户,这个时

lcm_up的专栏 1910

TMS320F2812的CMD文件配置详解

DSP芯片以其极高的精度,性能及运算速度等无与伦比的优点使它得到了十分广泛的应用,TMS320F2812是TI公司生产的到目前为止用于数字控制领域的最好的DSP芯片,在对它的仿真开发过程中,编译器生成的代码数据要由链接器分配到合适的存储空间,通常链接器的命令文件.cmd文件是由用户自己编写的,编写不当,就会使仿真开发不能进行,TI公司虽然在《TMS320C28x Optimizing C/C++

Augusdi的专栏 8726

Linker Special Section Types

转载自http://processors.wiki.ti.com/index.php/Linker_Special_Section_Types#NOLOAD_Sections_2 Introduction The linker allows you to create different kinds of sections called NOLOAD, DSECT, and COPY sect...

weixin_33910759的博客 261

C++类构造函数初始化列表

  构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:class CExample {public:    int a;    float b;    //构造函数初始化列表    CExample(): a(0),b(8.8)    {}    //构造函数内部赋值    CExample()    {        a=

徐阳的专栏 1548

time函数初始化time类对象_java类对象的初始化顺序

在下面这个例子中,我们分别在父类子类中测试了静态代码块、普通代码块、静态成员变量、普通成员变量、构造器、静态内部类。一:代码块及变量测试class Field{ public static String baseFieldInit(){ System.out.println("父类全局变量"); return ""; } public static String baseStaticFieldI...

weixin_39761481的博客 319

CCS教程

第一章  CCS概述 本章概述CCS(Code Composer Studio)软件开发过程、CCS组件及CCS使用的文件变量。 CCS提供了配置、建立、调试、跟踪分析程序的工具,它便于实时、嵌入式信号处理程序的编制测试,它能够加速开发进程,提高工作效率。 1.1 CCS概述 CCS提供了基本的代码生成工具,它们具有一系列的调试、分析能力。CCS支持如下所示的开发周期的所有阶段。

zxcvzxcv7的专栏 1万+

动态链接库两种调用方式的比较

摘自:http://blog.sina.com.cn/s/blog_725dd1010100ug2z.html 一、动态链接库的概念 动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程资源。动态链接库文件的扩展名一般是dll,也有可能是drv、sysfon,它可执行文件(exe)非常类似,区别在于DL...

weixin_34384915的博客 193
上一篇: DSP 实现模式识别小程序
下一篇: jrtplib 使用
wethty
博客等级 码龄18年 13粉丝 16原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值