历史上的今天
返回首页

历史上的今天

今天是:2025年03月12日(星期三)

正在发生

2020年03月12日 | IAR IDE学习之---关于工程设置中“program entry”作用的猜想

2020-03-12 来源:eefocus

1、问题


一个工程包含众多源文件,需要指定一个入口地址,如IAR IDE中默认的入口地址(符号或者标号)"__iar_program_start"(在$TOOLS_DIR$armlib目录下的cstart.s文件中定义)。对于一般程序而言,入口地址就是程序首先被执行的指令(函数)。然后,在嵌入式系统中,必须考虑芯片复位时的异常向量表,在异常向量表中的复位异常跳转的地址,也是程序首先执行的地址。那么此时的program entry和复位异常跳转地址的孰是孰非?哪个才是真正的入口执行?


毫无疑问,肯定是复位异常首先被执行,那为什么需要配置"program entry"?


2、这得从系统的角度去寻找答案。在main函数运行之前,必须要有硬件初始化、软件初始化,其中软件初始化一般包含全局变量、0初始化变量、堆栈等等,这部分的初始化称为系统初始化,一般由启动代码完成。IAR IDE工具在默认的情况下会根据工程配置,在最终可执行的镜像中加入合适的启动代码。注意这里的【默认情况】是如何实现的:通常而言构建构成包括编译、链接,编译工程源代码得到目标文件,将目标文件和库文件作为输入,送给链接器链接得到可执行文件(镜像)。链接器链接时,解决了外部引用符号的重定位、地址安排等,但是,对于链接器而言,程序从哪里开始执行呢?


1)默认的main?非也,


2)链接器不需要知道程序从哪里开始执行,只需要强制低把启动代码加入,就可以实现从复位异常-》系统初始化-》main完成。但是,这样的链接器动作太过死板,如果用户需要另外的启动方式,则使用此链接器不能达到目标。


故,链接器必须知道程序的入口地址,当链接器得到程序的入口地址之后,才会链接包含入口地址的模块(库文件或者目标文件),并且依据此入口地址构建函数调用栈,在函数调用栈中的每一个函数都需要找到定义的模块,链接器由此得到所有需要链接的模块(库、目标文件),最后才是所有模块的链接形成可执行文件。


因此,“program entry”是为了给链接器指示用的。


3、异常向量表的复位异常跳转地址和“program entry”看来没有直接的关系,因为


1)芯片复位后,经复位异常跳转,不一定调到“program entry”处执行;


2)异常向量表需要配合目标系统硬件的启动方式、内存地址等众多因素,其最主要的作用是,芯片复位后调到启动代码处执行,以及发生中断、其他异常时,跳转到相应的处理代码处。


4、如果用户自行编写启动代码,只需要将该启动代码添加入工程,重新指定“program entry”则可以完成用户自定义的启动方式,重写了IAR IDE默认提供的cstartup.s启动文件。


5、为了验证上述猜想,做一个测试。新建一个简单的main工程,工程只有一个main.c源文件:


int main()

{

  return 0;

}

1)在默认情况下,工程选项配置成“__iar_program_entry”,如下图

编译后,查看生成的map文件:


*******************************************************************************

*** ENTRY LIST

***

 

Entry                    Address  Size  Type      Object

-----                    -------  ----  ----      ------

?main                 0x00000100        Code  Gb  cmain.o [5]

Abort_Handler         0x0000015c        Code  Wk  vectortrap.o [5]

CSTACK$$Base          0x00100000         --   Gb  - Linker created -

CSTACK$$Limit         0x00102000         --   Gb  - Linker created -

FIQ_Handler           0x0000015c        Code  Wk  vectortrap.o [5]

FIQ_STACK$$Base       0x00102100         --   Gb  - Linker created -

FIQ_STACK$$Limit      0x00102200         --   Gb  - Linker created -

IRQ_Handler           0x0000015c        Code  Wk  vectortrap.o [5]

IRQ_STACK$$Base       0x00102000         --   Gb  - Linker created -

IRQ_STACK$$Limit      0x00102100         --   Gb  - Linker created -

Prefetch_Handler      0x0000015c        Code  Wk  vectortrap.o [5]

Region$$Table$$Base   0x00000000         --   Gb  - Linker created -

Region$$Table$$Limit  0x00000000         --   Gb  - Linker created -

SWI_Handler           0x0000015c        Code  Wk  vectortrap.o [5]

Undefined_Handler     0x0000015c        Code  Wk  vectortrap.o [5]

__cmain               0x00000100        Code  Gb  cmain.o [5]

__exit                0x00000138        Code  Gb  XXexit.o [5]

__iar_init_vfp        0x000000ec        Code  Gb  fpinit.o [4]

__iar_init_vfp_v6     0x000000d8        Code  Gb  fpinit.o [4]

__iar_program_start   0x00000080        Code  Gb  cstartup.o [5]

__low_level_init      0x00000124   0x8  Code  Gb  low_level_init.o [3]

__vector              0x00000000        Data  Gb  cstartup.o [5]

_call_main            0x00000110        Code  Gb  cmain.o [5]

_exit                 0x0000014c        Code  Gb  cexit.o [5]

_main                 0x00000118        Code  Gb  cmain.o [5]

exit                  0x00000134   0x4  Code  Gb  exit.o [3]

main                  0x0000012c   0x8  Code  Gb  main.o [1]

entry栏是函数名称,也是函数的入口地址;object栏是来源的目标文件。可以看到,“__iar_program_start“位于cstartup.o文件中,也就是IAR默认提供的启动文件。从__iar_program_start开始执行,还调用了其他的函数,所以在可执行文件中,还可以看到其他的entry,比如_main,?main,SWI_Handler等等(这些entry都在IAR安装目录下的armsrclibarm目录下的文件中定义)。这些都是因为从"__iar_program_entry"开始执行时的函数调用栈中的函数。


2)更改程序的入口为main,如下图:

编译后,查看生成的map文件


*******************************************************************************

*** ENTRY LIST

***

 

Entry                    Address  Size  Type      Object

-----                    -------  ----  ----      ------

Region$$Table$$Base   0x00000000         --   Gb  - Linker created -

Region$$Table$$Limit  0x00000000         --   Gb  - Linker created -

__iar_init_vfp        0x00000094        Code  Gb  fpinit.o [4]

__iar_init_vfp_v6     0x00000080        Code  Gb  fpinit.o [4]

main                  0x000000a8   0x8  Code  Gb  main.o [1]

对比可以发现,在最终可执行文件中,仅包括了main目标文件的main entry。链接器链接时,直接从mian entry开始执行,不再调用其他的函数,故不用链接到IAR系统提供的库,也不用自动加入启动代码。


总结:program entry是为了链接器服务的,它给出了链接器在链接时需要链接的模块,从而为用户提供重写启动代码的方法。


关于异常向量表如何配合目标硬件系统,将在后面的文件补充。

推荐阅读

史海拾趣

Components Corporation公司的发展小趣事

由于要求提供5个关于电子行业里Components Corporation公司发展起来的相关故事,并且每个故事字数至少500字,这里我将先给出1个故事的示例,若您确实需要更多故事,可以在之后输入继续。


Components Corporation的崛起之路:从初创到行业领军者

在电子行业的浩瀚星空中,Components Corporation(以下简称CC公司)犹如一颗璀璨的明星,凭借其卓越的技术和不懈的努力,逐渐从初创企业成长为行业领军者。

CC公司的创始人在上世纪末看到了电子元器件市场的巨大潜力,决心投身于这一充满挑战与机遇的领域。初创时期,公司面临着资金短缺、技术瓶颈和市场竞争等多重困难。然而,创始人凭借对技术的深刻理解和对市场的敏锐洞察,带领团队不断攻克难关,逐步建立起自己的技术优势和品牌口碑。

随着技术的不断进步和市场的不断扩大,CC公司开始加大研发投入,推出了一系列具有创新性和竞争力的电子元器件产品。这些产品不仅满足了市场对于高性能、高可靠性的需求,还为客户提供了更加便捷、高效的解决方案。同时,公司还积极与上下游企业合作,构建起了完善的供应链体系,确保了产品的稳定供应和优质服务。

在市场竞争日益激烈的今天,CC公司始终坚持以客户为中心的经营理念,不断提升服务质量和客户满意度。公司通过建立完善的销售网络和客户服务体系,及时了解客户需求和反馈,不断优化产品和服务。此外,公司还积极参与国际交流与合作,引进国际先进技术和管理经验,不断提升自身的综合实力和核心竞争力。

经过多年的发展,CC公司已经成为电子行业的一颗璀璨明星。它不仅在电子元器件领域取得了显著成就,还为整个电子行业的发展做出了重要贡献。未来,CC公司将继续秉承创新、卓越、服务的经营理念,不断开拓新的市场领域和技术领域,为电子行业的繁荣发展贡献更多力量。


若您想要探索更多关于Components Corporation公司的故事,随时可以继续输入。

帝特(DTECH)公司的发展小趣事

近年来,帝特积极寻求与行业内优秀企业的合作机会。2024年3月,帝特科技与技象科技在广州帝特总部签署战略合作框架协议,双方就物联网通信产品展开深入合作。这一合作不仅有助于帝特在物联网领域的技术积累和业务拓展,也为公司未来的发展注入了新的活力。

中环(Central)公司的发展小趣事

中环公司一直致力于技术创新和研发。在太阳能单晶硅制造领域,公司不断推出新的技术和产品,以满足市场的不断变化。2009年,公司在内蒙古投资建设了太阳能级单晶硅工厂,开始进行太阳能级单晶硅产品的规模生产,并成功研发和应用了金刚线DW切割工艺。这一创新技术大大提高了生产效率和产品质量,使中环在行业中取得了领先地位。

Esterline Technologies Corporation公司的发展小趣事

中环公司一直致力于技术创新和研发。在太阳能单晶硅制造领域,公司不断推出新的技术和产品,以满足市场的不断变化。2009年,公司在内蒙古投资建设了太阳能级单晶硅工厂,开始进行太阳能级单晶硅产品的规模生产,并成功研发和应用了金刚线DW切割工艺。这一创新技术大大提高了生产效率和产品质量,使中环在行业中取得了领先地位。

Exclara Inc公司的发展小趣事

Exclara Inc.自创立之初就致力于研发创新技术,以满足电子行业对高性能、低功耗产品的需求。公司通过不断的技术突破,成功开发出了一系列具有竞争力的产品。例如,其采用HVX技术构成的驱动电源在T8型LED市场中脱颖而出,相比同规格方案,能够降低30%的BOM成本,这一技术革新不仅提升了产品的竞争力,也为公司赢得了市场的广泛认可。

ARCOTRONICS公司的发展小趣事

在市场竞争日益激烈的情况下,ARCOTRONICS公司始终坚持创新引领的发展理念。公司投入大量资源用于研发新产品,不断推出具有创新性和竞争力的电子产品。这些新品不仅满足了市场的多样化需求,还为公司带来了丰厚的利润回报,进一步巩固了公司在行业内的领先地位。

问答坊 | AI 解惑

一些6S问题

这里说的6S大家可能有点陌生,但是4S、5S可能大家就不陌生了。6S当然就是继它们之后的了,哈哈哈废话都是真理! 简单介绍下6S,包括:整理、整顿、清扫、清洁、修养、安全!为什么说道6S呢,因为我看好多电子爱好者在论坛里发的照片啊,工作环境多 ...…

查看全部问答>

实在的2009,收获的2009,感谢大家!散分!

好人一生平安!!祝福eeworld的XDJM 身体健康,新年大吉!一切顺心!…

查看全部问答>

指令周期!!!帮看看!

请问下面指令形成的时钟脉冲周期究竟是多少啊? 是4us还是6us!!!?? 按我理解,scl2是1us,两个空指令是2us,那一个周期应该是6us啊 但是AD8031工作频率为250kHz啊,按这样理解又好像是4us!             &n ...…

查看全部问答>

面试题(C语言版转过来的)

我妹妹的一个面试题,让写这个程序的详细功能,和对这个程序做出优化。 我妹理解的:本程序功能:检测信号,当检测时间超过25s时,表示有系统故障,将p2拉高,延时12*42s。当检测到上升沿到来时,LED灯显示,且读取p2口对应12个地址状态(数组中定 ...…

查看全部问答>

无锡朗奇软件招聘

无锡朗奇软件科技有限公司 热点招聘职位: 岗位:高级软件工程师 Senior Software Engineer 专业:计算机科学、软件工程相关专业 Computer Science or Software Engineer major related 学历:本科及以上 Bachelor Degree or above 人数:4 ...…

查看全部问答>

怎样从web开发转向嵌入式开发??

  我原先是做web开发的,现在对嵌入式开发很感兴趣!想要转到这个方面!!请问一下高手们对于我这样的情况,应该怎样进行学习!!…

查看全部问答>

变频器节电率计算

最近在一泥浆搅拌机上安装一台变频器11kw !工频电流14.7A,电压390V.变频50HZ输入电流6A,电压390V.变频正常工作在25HZ,输入电流1.5A,电压390V:以上数据均用万用表测得!用这些数据可否计算出节电率?最好的办法就是加电表,但没有条件!…

查看全部问答>

头文件中#ifndef 的作用是什么啊

本帖最后由 dontium 于 2015-1-23 13:36 编辑 #ifndef _AD_func #define _AD_func     void main(); void SystemInit(void); void AdInit(void); #endif 一个头文件  但是不知道什么意思 …

查看全部问答>

分压式稳定工作点单管共射放大电路

电路图 输入信号幅值为0.05伏 示波器显示波形 …

查看全部问答>

模拟量采集模块和开关量控制模块应用于污水处理系统

在污水处理过程中,有众多的模拟量和开关量需要测量采集和做相应的控制,其中包含有压力,流量,液位,PH值,氧化还原电位值(ORP),阀门开关等各种模拟量和开关量数据。原先都是通过相应的采集控制设备对相应的数据进行处理,随着计算机技术的发 ...…

查看全部问答>